远程无线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 );