Un teclado USB inalámbrico de largo alcance en dos partes.
El teclado USB se conecta al remitente. El remitente debe tener una capacidad de host USB para comunicarse con el teclado. El SAMD21 M0 se usa para este proyecto. Cada llave presiona y liberación genera un informe USB HID (descriptor de interfaz humano). El informe es un ajuste de datos de 8 bytes que se envía utilizando la radio RFM69 al receptor.
El receptor se conecta a la computadora a través de un puerto USB. No se requieren otros componentes porque la radio RFM69HCW está integrada con la placa de plumas. El receptor toma informes de USB HID de la radio RFM69 y luego envía a la computadora a través de USB.
Asegúrese de seguir los tutoriales de Adafruit para ambos tableros para asegurarse de que las tablas funcionen y las bibliotecas estén instaladas.

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
El receptor puede usar la versión de plumas M0 o 32U4. El 32U4 se usó aquí por ninguna otra razón que estaba disponible.
Los encabezados no necesitan instalarse en el tablero. Se requiere una antena.
Cargue el boceto RFM69KBDRFM69RX.INO. Este programa lee informes USB HID de la radio RFM69 y luego los envía a la interfaz del dispositivo USB del teclado a la computadora. La pluma está alimentada por la computadora.

Los componentes de izquierda a derecha son:
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
Advertencia: el remitente debe usar la versión M0 porque tiene capacidad de host USB. El 32U4 no.
Los encabezados y la placa se utilizan para conectarse a la alimentación con la placa. Se requiere una antena.
Cargue el boceto RFM69KBDRFM69TX.INO. Este programa lee informes USB HID del teclado USB y luego envía los informes HID USB a la radio RFM69.
Impulsar la pluma es más complicada en comparación con el receptor. Al subir, la pluma se alimenta desde la computadora. La otra fuente de alimentación de 5V (ver más abajo) debe desconectarse.
ADVERTENCIA: No conecte más de una fuente de energía a la pluma al mismo tiempo.
ADVERTENCIA: Cuando se usa el modo de host USB, el botón de reinicio de Feather debe presionarse dos veces para colocar la placa en modo de carga. La carga automática no funciona.
Feather M0 RFM69HCW -> USB cable -> Computer
Otra opción para evitar cambiar de cables es la carga a través de la placa CP2104 y el puerto Serial1. El botón de reinicio aún se debe hacer doble clic para iniciar la carga.
Al usar la pluma en el modo del remitente del teclado, la pluma debe ser alimentada por una fuente de alimentación de 5V conectada a su pin USB. En este caso, una placa de serie USB CP2104 proporciona la potencia de 5V y la serie USB para la salida de depuración a través del PIN Serial1 UART TX.
Cuando se completa la depuración, la placa CP2104 no es necesaria, pero aún se requiere una fuente de alimentación de 5V.
La opción de alimentación de la batería de plumas no es útil aquí porque las baterías de litio no proporcionan 5V.
El par de tableros actúa como un teclado. Cuando se presiona una tecla en el teclado, se envía un informe de dispositivo de interfaz humano USB (HID) al remitente. El informe es una estructura de datos de 8 bytes que se explica aquí las especificaciones oficiales de USB están disponibles en el Foro de Implementadores de USB, pero pueden ser difíciles de entender.
El remitente envía el informe HID su radio RFM69. Cuando el receptor recibe el informe HID de su radio RFM69, envía el informe HID de su puerto USB nativo.
La mayor parte del código en USBKBDRFM69RX.INO es de un ejemplo de la biblioteca Radiohead. La biblioteca de teclado USB Arduino proporciona la emulación del teclado USB sobre el puerto USB nativo. En el siguiente código, cuando se recibe un informe USB HID de la radio RFM69, se envía al puerto USB.
La declaración rf69_manager.recvfromAck(buf, &len, &from) recibe un bloque de bytes de la radio. El bloque de Bytes es un informe HID USB del remitente.
La declaración HID().SendReport(2, buf, len) envía el bloque de bytes fuera del puerto USB. Esta función no está documentada, pero es muy útil para los pases.
La depuración condicional descarta el informe HID y el 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" );
}La mayor parte del código en USBKBDRFM69TX.INO es de un ejemplo de la biblioteca Radiohead. La biblioteca USBHost Arduino proporciona la función de teclado de host USB sobre el puerto USB nativo. En el siguiente código, cuando se recibe un informe USB HID del teclado USB, se envía la radio RFM69.
Nota: La documentación del USBHOST de Arduino se refiere solo a debido, pero USBHost funciona para tableros cero, M0 y MKR (al menos los que he probado). Las tablas de Adafruit Arduino Compatible con procesadores SAMD21 y SAMD51 también funcionan, pero solo puedo responder por las tablas que he probado personalmente.
La función KeyboardRaw::Parse la declaración se llama por la función USBHost :: Task cuando se recibe un informe HID del teclado USB.
La declaración rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) envía el informe HID a través de la radio RFM69 al receptor.
La clase KeyboardRaw se crea para interceptar el informe USB HID desde la biblioteca de teclado USBHost. La instrucción hostKeyboard.SetReportParser(0, this) es cómo la clase redirige los informes HID a sí mismo.
#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 );