두 부분의 장거리 무선 USB 키보드.
USB 키보드가 발신자에 연결됩니다. 발신자는 키보드와 통신하려면 USB 호스트 Capabiiity가 있어야합니다. SAMD21 M0 은이 프로젝트에 사용됩니다. 모든 키 프레스 및 릴리스에는 USB HID (Human Interface Descriptor) 보고서가 생성됩니다. 이 보고서는 RFM69 라디오를 사용하여 수신기로 전송되는 8 바이트 데이터 스트리처입니다.
수신기는 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
경고 : 발신자는 USB 호스트 기능이 있으므로 M0 버전을 사용해야합니다. 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 핀을 통한 디버그 출력에 대한 USB 직렬뿐만 아니라 5V 전력을 제공합니다.
디버깅이 완료되면 CP2104 보드가 필요하지 않지만 5V 전원 공급 장치가 여전히 필요합니다.
리튬 배터리가 5V를 제공하지 않기 때문에 깃털 배터리 전원 옵션은 여기에서 유용하지 않습니다.
보드 한 쌍은 키보드 패스를 통과하는 역할을합니다. 키보드에 키가 눌려지면 USB Human Interface 장치 (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 Documention은 기한 만 말하지만 Usbhost는 0, M0 및 MKR 보드 (적어도 내가 테스트 한 것)에서 작동합니다. SAMD21 및 SAMD51 프로세서가 장착 된 Adafruit Arduino 호환 보드도 작동하지만 개인적으로 테스트 한 보드 만 보증 할 수 있습니다.
KeyboardRaw::Parse 함수는 USB 키보드에서 HID 보고서를 수신 할 때 USBHost :: 작업 기능에 의해 호출됩니다.
rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) 는 RFM69 라디오를 통해 HID 보고서를 수신기에 보냅니다.
KeyboardRaw 클래스는 USBHost 키보드 라이브러리에서 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 );