2つの部分の長距離ワイヤレスUSBキーボード。
USBキーボードは送信者に差し込みます。送信者は、キーボードと通信するためにUSBホストCapabiityを持っている必要があります。 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は、利用可能な理由以外にここで使用されました。
ヘッダーはボードにインストールする必要はありません。アンテナが必要です。
RFM69KBDDRFM69RX.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はそうではありません。
ヘッダーとブレッドボードは、フェザーボードへの電源に接続するために使用されます。アンテナが必要です。
RFM69KBDDRFM69TX.inoスケッチをアップロードします。このプログラムは、USBキーボードからUSB HIDレポートを読み取り、USB HIDレポートをRFM69ラジオに送信します。
羽毛の動力は、受信機と比較してよりトリッキーです。アップロードするとき、羽はコンピューターから駆動されます。他の5V電源(以下を参照)を切断する必要があります。
警告:複数の電源を同時に羽に接続しないでください。
警告:USBホストモードを使用する場合、featherリセットボタンを2回押して、ボードをアップロードモードにする必要があります。自動アップロードは機能しません。
Feather M0 RFM69HCW -> USB cable -> Computer
ケーブルの切り替えを避けるもう1つのオプションは、CP2104ボードとSerial1ポートを介してアップロードすることです。リセットボタンをダブルクリックして、アップロードを開始する必要があります。
キーボード送信者モードでフェザーを使用する場合、羽はUSBピンに接続された5V電源を搭載する必要があります。この場合、CP2104 USBシリアルボードは、Serial1 UART TX PINを介してデバッグ出力用の5VパワーとUSBシリアルを提供します。
デバッグが完了すると、CP2104ボードは必要ありませんが、5V電源が必要です。
リチウムバッテリーは5Vを提供しないため、ここではフェザーバッテリー電源オプションは役に立ちません。
ボードのペアは、キーボードのパススルーとして機能します。キーがキーボードに押されると、USB Human Interface Device(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" );
}usbkbddrfm69tx.inoのコードのほとんどは、Radioheadライブラリの例からのものです。 Arduino USBHOSTライブラリは、ネイティブUSBポート上のUSBホストキーボード機能を提供します。以下のコードでは、USB HIDレポートがUSBキーボードから受信されると、RFM69無線が送信されます。
注:Arduino USBHOST文書は、ゼロ、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 );