Беспроводная USB -клавиатура на дальние расстояния в двух частях.
USB -клавиатура подключается к отправителю. У отправителя должен быть USB -хост, чтобы общаться с клавиатурой. SAMD21 M0 используется для этого проекта. Каждое нажатие и высвобождение клавиши генерирует отчет USB HID (дескриптор интерфейса человека). Отчет представляет собой 8 -байт -структуру данных, которая отправляется с использованием радио RFM69 в приемник.
Приемник подключается к компьютеру через USB -порт. Никаких других компонентов не требуется, потому что радио RFM69HCW интегрировано с платой перьев. Получатель получает отчеты USB HID с радио RFM69, а затем отправляет на компьютер через USB.
Обязательно следуйте учебным пособиям Adafruit для обеих досок, чтобы убедиться, что доски работают, и библиотеки установлены.

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
Приемник может использовать версию перья M0 или 32U4. 32U4 использовался здесь по какой -либо другой причине, чем он был доступен.
Заголовки не должны быть установлены на доске. Антенна требуется.
Загрузите RFM69KBDRFM69RX.INO. Эта программа считывает отчеты 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. Эта программа гласит отчеты USB HID с USB -клавиатуры, а затем отправляет USB HID отчеты на радио RFM69.
Питание пера сложнее по сравнению с приемником. При загрузке перо питается с компьютера. Другой источник питания 5V (см. Ниже) должен быть отключен.
ПРЕДУПРЕЖДЕНИЕ: Не подключайте более одного источника питания к перо одновременно.
ПРЕДУПРЕЖДЕНИЕ: При использовании режима хоста USB кнопка сброса перья должна быть нажата дважды, чтобы поместить доску в режим загрузки. Автоматическая загрузка не работает.
Feather M0 RFM69HCW -> USB cable -> Computer
Еще один вариант избежать переключения кабелей - загрузка через плату CP2104 и порт Serial1. Кнопка сброса все еще должна быть дважды нажата, чтобы запустить загрузку.
При использовании пера в режиме отправителя клавиатуры, перо должно быть включено из источника питания 5 В, подключенного к его USB -штифту. В этом случае серийная плата USB CP2104 обеспечивает мощность 5V, а также USB -серийный сериал для вывода отладки через Serial1 UART TX PIN.
После завершения отладки плата CP2104 не требуется, но источник питания 5 В все еще требуется.
Опция питания с батареей перья здесь не полезна, потому что литийные батареи не обеспечивают 5 В.
Пара досок действует как проход клавиатуры. Когда на клавиатуре нажимается клавиша, отчет USB -интерфейс -интерфейс (HID) отправляется отправителю. Отчет представляет собой структуру данных с 8 байтами, которая здесь объясняется, официальные USB -спецификации доступны на форуме USB -реализации, но их может быть трудно понять.
Отправитель отправляет отчет HID из RFM69 Radio. Когда получатель получает отчет 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 -функцию клавиатуры HOST на собственном USB -порту. В приведенном ниже коде, когда отчет USB HID получен с клавиатуры USB, он отправляется радио RFM69.
Примечание. Документ Arduino USBHOST относится только к должным, но USBHOST работает на доски Zero, M0 и MKR (по крайней мере, те, которые я проверил). Адафрут, совместимые с процессорами Adafruit Arduino с процессорами SAMD21 и SAMD51, также работают, но я могу поручиться только за доски, которые у меня лично протестировали.
Оператор KeyboardRaw::Parse Function вызывается функцией USBHOST :: Task, когда отчет HID получен с USB -клавиатуры.
Заявление rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) отправляет отчет HID по радио RFM69 в приемник.
Класс клавиатуры создается для перехвата отчета 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 );