คีย์บอร์ด USB ไร้สายระยะยาวในสองส่วน
คีย์บอร์ด USB เสียบเข้ากับผู้ส่ง ผู้ส่งจะต้องมีความสามารถโฮสต์ USB เพื่อสื่อสารกับแป้นพิมพ์ SAMD21 M0 ใช้สำหรับโครงการนี้ การกดปุ่มทุกครั้งและการเปิดตัวจะสร้างรายงาน USB HID (Human Interface Descriptor) รายงานคือการจัดทรัทข้อมูล 8 ไบต์ซึ่งถูกส่งโดยใช้วิทยุ RFM69 ไปยังตัวรับสัญญาณ
ตัวรับสัญญาณเสียบเข้ากับคอมพิวเตอร์ผ่านพอร์ต USB ไม่จำเป็นต้องใช้ส่วนประกอบอื่น ๆ เนื่องจากวิทยุ RFM69HCW ถูกรวมเข้ากับบอร์ดขนนก ผู้รับใช้รายงาน USB HID จากวิทยุ RFM69 จากนั้นส่งไปยังคอมพิวเตอร์ผ่าน USB
อย่าลืมติดตามบทเรียนของ Adafruit สำหรับบอร์ดทั้งสองเพื่อให้แน่ใจว่าบอร์ดทำงานและติดตั้งไลบรารี

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
ตัวรับสัญญาณอาจใช้รุ่น M0 หรือ 32U4 Feather 32U4 ถูกใช้ที่นี่โดยไม่มีเหตุผลอื่นนอกจากที่มีอยู่
ไม่จำเป็นต้องติดตั้งส่วนหัวบนกระดาน จำเป็นต้องมีเสาอากาศ
อัปโหลด RFM69KBDRFM69RX.INO SKETCH โปรแกรมนี้อ่านรายงาน USB HID จากวิทยุ RFM69 จากนั้นส่งอินเทอร์เฟซอุปกรณ์คีย์บอร์ด 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 SKETCH โปรแกรมนี้อ่านรายงาน USB HID จากคีย์บอร์ด USB จากนั้นส่งรายงาน USB HID ไปยังวิทยุ RFM69
การเพิ่มพลังให้ขนนกนั้นยากกว่าเมื่อเทียบกับตัวรับสัญญาณ เมื่ออัปโหลดขนจะขับเคลื่อนจากคอมพิวเตอร์ แหล่งพลังงาน 5V อื่น ๆ (ดูด้านล่าง) จะต้องตัดการเชื่อมต่อ
คำเตือน: อย่าเชื่อมต่อแหล่งพลังงานมากกว่าหนึ่งแหล่งกับขนนกในเวลาเดียวกัน
คำเตือน: เมื่อใช้โหมดโฮสต์ USB ต้องกดปุ่มรีเซ็ตขนนกสองครั้งเพื่อวางบอร์ดในโหมดอัปโหลด การอัปโหลดอัตโนมัติไม่ทำงาน
Feather M0 RFM69HCW -> USB cable -> Computer
อีกทางเลือกหนึ่งในการหลีกเลี่ยงการสลับสายเคเบิลคือการอัปโหลดผ่านบอร์ด CP2104 และพอร์ต Serial1 ปุ่มรีเซ็ตจะต้องถูกคลิกสองครั้งเพื่อเริ่มการอัปโหลด
เมื่อใช้ขนนกในโหมดผู้ส่งแป้นพิมพ์ขนจะต้องใช้พลังงานจากแหล่งพลังงาน 5V ที่เชื่อมต่อกับพิน USB ในกรณีนี้คณะกรรมการอนุกรม USB CP2104 ให้พลังงาน 5V เช่นเดียวกับ USB Serial สำหรับเอาต์พุตดีบั๊กผ่าน PIN Serial1 UART TX
เมื่อการดีบักเสร็จสมบูรณ์บอร์ด CP2104 ไม่จำเป็น แต่ยังต้องใช้แหล่งจ่ายไฟ 5V
ตัวเลือกพลังงานแบตเตอรี่ขนนกไม่มีประโยชน์ที่นี่เนื่องจากแบตเตอรี่ลิเธียมไม่มี 5V
บอร์ดคู่ทำหน้าที่เป็นแป้นพิมพ์ผ่าน เมื่อกดคีย์บนแป้นพิมพ์รายงานอุปกรณ์อินเทอร์เฟซมนุษย์ USB (HID) จะถูกส่งไปยังผู้ส่ง รายงานเป็นโครงสร้างข้อมูล 8 ไบต์ซึ่งอธิบายไว้ที่นี่ข้อกำหนด USB อย่างเป็นทางการมีให้บริการจากฟอรัม USB Applementors แต่พวกเขาอาจเข้าใจได้ยาก
ผู้ส่งส่งรายงาน HID รายงานวิทยุ RFM69 เมื่อผู้รับได้รับรายงาน HID จากวิทยุ RFM69 มันจะส่งรายงาน HID ออกพอร์ต USB ดั้งเดิม
รหัสส่วนใหญ่ใน USBKBDRFM69RX.INO นั้นมาจากตัวอย่างจากไลบรารี Radiohead คีย์บอร์ดคีย์บอร์ด Arduino USB ให้การจำลองคีย์บอร์ด USB ผ่านพอร์ต USB ดั้งเดิม ในรหัสด้านล่างเมื่อได้รับรายงาน USB HID จากวิทยุ RFM69 มันจะถูกส่งออกไปที่พอร์ต 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 HID จากคีย์บอร์ด USB มันจะถูกส่งออกวิทยุ RFM69
หมายเหตุ: เอกสาร arduino usbhost หมายถึงเฉพาะ แต่ USBHost ทำงานสำหรับบอร์ดศูนย์, M0 และ MKR (อย่างน้อยที่สุดที่ฉันได้ทดสอบ) บอร์ดที่เข้ากันได้กับ Adafruit Arduino กับโปรเซสเซอร์ SAMD21 และ SAMD51 ก็ใช้งานได้ แต่ฉันสามารถรับรองบอร์ดที่ฉันได้ทดสอบเป็นการส่วนตัวเท่านั้น
คำสั่ง KeyboardRaw::Parse ถูกเรียกโดยฟังก์ชันงาน USBHost :: เมื่อได้รับรายงาน HID จากคีย์บอร์ด USB
คำสั่ง rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) ส่งรายงาน HID ผ่านวิทยุ RFM69 ไปยังผู้รับ
คลาส KeyboardRaw ถูกสร้างขึ้นเพื่อสกัดกั้นรายงาน USB HID จากไลบรารีคีย์บอร์ด USBHost คำสั่ง 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 );