Keyboard USB nirkabel jarak jauh dalam dua bagian.
Keyboard USB terhubung ke pengirim. Pengirim harus memiliki Capabiiity host USB untuk berkomunikasi dengan keyboard. SAMD21 M0 digunakan untuk proyek ini. Setiap tombol tekan dan rilis menghasilkan laporan USB HID (Human Interface Descriptor). Laporan ini adalah struture data 8 byte yang dikirim menggunakan radio RFM69 ke penerima.
Penerima terhubung ke komputer melalui port USB. Tidak ada komponen lain yang diperlukan karena radio RFM69HCW diintegrasikan dengan papan bulu. Penerima mengambil laporan USB HID dari radio RFM69 kemudian mengirim ke komputer melalui USB.
Pastikan untuk mengikuti tutorial Adafruit untuk kedua papan untuk memastikan papan berfungsi dan perpustakaan diinstal.

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
Penerima dapat menggunakan versi bulu M0 atau 32U4. 32U4 digunakan di sini tanpa alasan lain selain tersedia.
Header tidak perlu dipasang di papan tulis. Diperlukan antena.
Unggah sketsa RFM69KBDRFM69RX.INO. Program ini membaca laporan USB HID dari radio RFM69 kemudian mengirimkannya antarmuka perangkat keyboard USB ke komputer. Bulu didukung dari komputer.

Komponen dari kiri ke kanan adalah:
USB USB OTG Host
Keyboard -> cable/adapter -> Feather M0 RFM69HCW -> 915 MHz
GND USB Tx Rx
| ^ | ^
| | | |
| | v |
GND 5V RxD TxD
CP2104 USB to serial -> Computer or 5V
Peringatan: Pengirim harus menggunakan versi M0 karena memiliki kemampuan host USB. 32U4 tidak.
Header dan papan tempat memotong roti digunakan untuk terhubung ke daya ke papan bulu. Diperlukan antena.
Unggah sketsa RFM69KBDRFM69TX.ino. Program ini membaca laporan USB HID dari keyboard USB kemudian mengirimkan laporan USB HID ke radio RFM69.
Menggerakkan bulu lebih rumit dibandingkan dengan penerima. Saat mengunggah, bulu itu didukung dari komputer. Sumber daya 5V lainnya (lihat di bawah) harus terputus.
PERINGATAN: Jangan menghubungkan lebih dari satu sumber daya ke bulu pada saat yang sama.
PERINGATAN: Saat menggunakan mode host USB, tombol reset bulu harus ditekan dua kali untuk menempatkan papan dalam mode unggah. Unggah otomatis tidak berfungsi.
Feather M0 RFM69HCW -> USB cable -> Computer
Opsi lain untuk menghindari peralihan kabel, adalah mengunggah melalui papan CP2104 dan port Serial1. Tombol reset masih harus diklik dua kali untuk memulai unggahan.
Saat menggunakan Mode Pengirim Bulu dalam Keyboard, bulu harus ditenagai oleh sumber daya 5V yang terhubung ke pin USB -nya. Dalam hal ini, papan serial USB CP2104 menyediakan daya 5V serta serial USB untuk output debug melalui pin Serial1 UART TX.
Ketika debugging selesai, dewan CP2104 tidak diperlukan tetapi catu daya 5V masih diperlukan.
Opsi daya baterai bulu tidak berguna di sini karena baterai lithium tidak menyediakan 5V.
Sepasang papan bertindak sebagai keyboard melewati. Ketika tombol ditekan pada keyboard, laporan USB Human Interface Device (HID) dikirim ke pengirim. Laporan ini adalah struktur data 8 byte yang dijelaskan di sini spesifikasi USB resmi tersedia dari Forum Implemor USB tetapi mereka bisa sulit dipahami.
Pengirim mengirimkan laporan HID keluar dari radio RFM69 -nya. Ketika penerima menerima laporan HID dari radio RFM69, ia mengirimkan laporan HID keluar port USB asalnya.
Sebagian besar kode di usbkbdrfm69rx.ino berasal dari contoh dari perpustakaan Radiohead. Perpustakaan Keyboard USB Arduino menyediakan emulasi keyboard USB melalui port USB asli. Dalam kode di bawah ini, ketika laporan USB HID diterima dari radio RFM69, itu dikirim keluar port USB.
Pernyataan rf69_manager.recvfromAck(buf, &len, &from) menerima blok byte dari radio. Blok byte adalah laporan USB HID dari pengirim.
Pernyataan HID().SendReport(2, buf, len) mengirimkan blok byte keluar port USB. Fungsi ini tidak didokumentasikan tetapi sangat berguna untuk melewati.
Debug bersyarat membuang laporan HID dan RSSI.
if ( rf69_manager . recvfromAck ( buf , & len , & from )) {
if (! len ) return ;
HID (). SendReport ( 2 , buf , len );
#ifdef DEBUG_KEYBOARD_RAW
SERIAL_PORT_MONITOR . print ( "Received [" );
SERIAL_PORT_MONITOR . print ( len );
SERIAL_PORT_MONITOR . print ( "]: " );
for ( uint8_t i = 0 ; i < len ; i ++ ) {
SERIAL_PORT_MONITOR . print ( ' ' ); SERIAL_PORT_MONITOR . print ( buf [ i ], HEX );
}
SERIAL_PORT_MONITOR . println ();
SERIAL_PORT_MONITOR . print ( "RSSI: " );
SERIAL_PORT_MONITOR . println ( rf69 . lastRssi (), DEC );
#endif
} else {
SERIAL_PORT_MONITOR . println ( "Receive failed" );
}Sebagian besar kode di usbkbdrfm69tx.ino berasal dari contoh dari perpustakaan Radiohead. Perpustakaan Arduino USBHost menyediakan fitur keyboard host USB melalui port USB asli. Dalam kode di bawah ini, ketika laporan USB HID diterima dari keyboard USB, itu dikirim ke radio RFM69.
CATATAN: Dokumensi Arduino Usbhost hanya merujuk pada hak tetapi USBHOST bekerja untuk papan nol, M0, dan MKR (setidaknya yang telah saya uji). Papan yang kompatibel dengan Adafruit Arduino dengan prosesor SAMD21 dan SAMD51 juga berfungsi tetapi saya hanya bisa menjamin papan yang telah saya uji secara pribadi.
Pernyataan KeyboardRaw::Parse dipanggil oleh fungsi USBHOST :: Tugas ketika laporan HID diterima dari keyboard USB.
Pernyataan rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) mengirimkan laporan HID melalui radio RFM69 ke penerima.
Kelas KeyboardRaw dibuat untuk mencegat laporan USB HID dari pustaka keyboard USBHOST. Pernyataan hostKeyboard.SetReportParser(0, this) adalah bagaimana kelas mengarahkan laporan HID ke dirinya sendiri.
#include <hidboot.h>
class KeyboardRaw : public KeyboardReportParser {
public:
KeyboardRaw ( USBHost & usb ) : hostKeyboard ( & usb ) {
hostKeyboard . SetReportParser ( 0 , this );
};
void Parse ( HID * hid , uint32_t is_rpt_id , uint32_t len , uint8_t * buf );
private:
HIDBoot < HID_PROTOCOL_KEYBOARD > hostKeyboard ;
};
void KeyboardRaw :: Parse ( HID * hid , uint32_t is_rpt_id , uint32_t len , uint8_t * buf )
{
#ifdef DEBUG_KEYBOARD_RAW
SERIAL_PORT_MONITOR . print ( "KeyboardRaw::Parse" );
// Show USB HID keyboard report
for ( uint8_t i = 0 ; i < len ; i ++ ) {
SERIAL_PORT_MONITOR . print ( ' ' ); SERIAL_PORT_MONITOR . print ( buf [ i ], HEX );
}
SERIAL_PORT_MONITOR . println ();
#endif
// Call parent/super method
KeyboardReportParser:: Parse ( hid , is_rpt_id , len , buf );
// On error - return
if ( buf [ 2 ] == 1 )
return ;
if ( len == 8 ) {
rf69_manager . sendtoWait ( buf , len , DEST_ADDRESS );
}
}
// Initialize USB Controller
USBHost usb ;
// Attach keyboard controller to USB
KeyboardRaw keyboard ( usb );