遠程無線USB鍵盤分為兩個部分。
USB鍵盤插入發件人。發件人必須具有USB主機capabiiity才能與鍵盤通信。 SAMD21 M0用於此項目。每個密鑰按下都會生成USB HID(人接口描述符)報告。該報告是一個8個字節數據支撐,使用RFM69無線電發送給接收器。
接收器通過USB端口插入計算機。由於RFM69HCW收音機與羽毛板集成在一起,因此無需其他組件。接收器從RFM69收音機中獲取USB HID報告,然後通過USB發送到計算機。
請務必遵循兩個董事會的Adafruit教程,以確保板工作和庫已安裝。

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
接收器可以使用M0或32U4羽毛版本。 32U4在這裡使用了,除了可用之外,沒有其他原因。
標題無需安裝在板上。需要天線。
上傳RFM69KBDRFM69RX.INO草圖。該程序讀取來自RFM69收音機的USB HID報告,然後將它們發送到計算機的USB鍵盤設備接口。羽毛是用計算機供電的。

從左到右的組件是:
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
警告:發件人必須使用M0版本,因為它具有USB主機功能。 32U4沒有。
標題和麵包板用於連接到羽毛板的電源。需要天線。
上傳RFM69KBDRFM69TX.INO草圖。該程序讀取來自USB鍵盤的USB HID報告,然後將USB HID報告發送到RFM69收音機。
與接收器相比,為羽毛供電更棘手。上傳時,羽毛是從計算機上供電的。必須斷開其他5V電源(見下文)。
警告:不要同時連接多個電源到羽毛。
警告:使用USB主機模式時,必須將“羽毛重置”按鈕按兩次,以使板處於上傳模式。自動上傳不起作用。
Feather M0 RFM69HCW -> USB cable -> Computer
避免切換電纜的另一個選項是通過CP2104板和Serial1端口上傳。重置按鈕仍然必須雙擊以開始上傳。
在鍵盤發件人模式下使用羽毛時,羽毛必須由連接到其USB引腳的5V電源供電。在這種情況下,CP2104 USB串行板可通過Serial1 UART TX PIN提供5V功率和USB序列。
調試完成後,不需要CP2104板,但仍然需要5V電源。
羽毛電池電源選項在這裡沒有用,因為鋰電池不提供5V。
這對板充當鍵盤通過。將鍵按在鍵盤上時,將USB人接口設備(HID)報告發送給發件人。該報告是8個字節數據結構,此處可以從USB實施者論壇上獲得官方USB規格,但很難理解。
發件人將HID報告發送出其RFM69收音機。當接收器從其RFM69收音機收到HID報告時,它將HID報告發出其本機USB端口。
USBKBDRFM69RX.ino中的大多數代碼來自Radiohead庫中的一個示例。 Arduino USB鍵盤庫提供了本機USB端口上的USB鍵盤仿真。在下面的代碼中,當從RFM69收音機收到USB HID報告時,它將發送出USB端口。
語句rf69_manager.recvfromAck(buf, &len, &from)接收到無線電的字節塊。字節塊是發件人的USB HID報告。
語句HID().SendReport(2, buf, len)將字節塊發送給USB端口。此功能沒有記錄在記錄中,但對於通行證非常有用。
有條件的調試將HID報告和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" );
}USBKBDRFM69TX.ino中的大多數代碼來自Radiohead庫中的一個示例。 Arduino USBHOST庫在本機USB端口上提供了USB主機鍵盤功能。在下面的代碼中,當從USB鍵盤收到USB HID報告時,它將發送出RFM69收音機。
注意:Arduino USBHOST文檔僅是指適當的,但USBHOST的工作方式為零,M0和MKR板(至少我已經測試過)。與SAMD21和SAMD51處理器的Adafruit Arduino兼容板也可以使用,但我只能保證我親自測試的董事會。
從USB鍵盤接收HID報告時,語句KeyboardRaw::Parse函數由USBHOST ::任務函數調用。
語句rf69_manager.sendtoWait(buf, len, DEST_ADDRESS)通過RFM69收音機將HID報告發送給接收器。
創建了鍵盤RAW類是為了攔截USB鍵盤庫中的USB HID報告。語句hostKeyboard.SetReportParser(0, this)是類將HID報告自身重定向的方式。
#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 );