Un clavier USB sans fil à longue portée en deux parties.
Le clavier USB se branche sur l'expéditeur. L'expéditeur doit avoir une capabiité de l'hôte USB pour communiquer avec le clavier. Le SAMD21 M0 est utilisé pour ce projet. Chaque appuye sur la touche et la version génère un rapport USB HID (Human Interface Descriptor). Le rapport est une structure de données de 8 octets qui est envoyée à l'aide de la radio RFM69 au récepteur.
Le récepteur se branche sur l'ordinateur via un port USB. Aucun autre composant n'est requis car la radio RFM69HCW est intégrée à la carte Feather. Le récepteur prend les rapports USB HID de la radio RFM69 puis envoie à l'ordinateur via USB.
Assurez-vous de suivre les tutoriels d'Adafruit pour les deux conseils pour vous assurer que les planches fonctionnent et les bibliothèques sont installées.

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
Le récepteur peut utiliser la version plume M0 ou 32U4. Le 32U4 a été utilisé ici sans autre raison que disponible.
Les en-têtes n'ont pas besoin d'être installés sur la carte. Une antenne est requise.
Téléchargez le croquis RFM69KBDRFM69RX.ino. Ce programme lit les rapports USB HID de la radio RFM69, puis leur envoie l'interface de périphérique de clavier USB à l'ordinateur. La plume est alimentée par l'ordinateur.

Les composants de gauche à droite sont:
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
AVERTISSEMENT: l'expéditeur doit utiliser la version M0 car il a la capacité de l'hôte USB. Le 32U4 ne le fait pas.
Les en-têtes et la planche à pain sont utilisés pour se connecter à l'alimentation à la planche à plumes. Une antenne est requise.
Téléchargez le croquis RFM69KBDRFM69TX.ino. Ce programme lit les rapports USB HID du clavier USB puis envoie les rapports USB HID à la radio RFM69.
L'alimentation de la plume est plus délicate par rapport au récepteur. Lors du téléchargement, la plume est alimentée par l'ordinateur. L'autre source d'alimentation 5V (voir ci-dessous) doit être déconnectée.
Avertissement: ne connectez pas plus d'une source d'alimentation à la plume en même temps.
AVERTISSEMENT: Lorsque vous utilisez le mode hôte USB, le bouton Réinitialisation de la plume doit être enfoncé deux fois pour mettre la carte en mode de téléchargement. Le téléchargement automatique ne fonctionne pas.
Feather M0 RFM69HCW -> USB cable -> Computer
Une autre option pour éviter de changer de câbles est le téléchargement via la carte CP2104 et le port Serial1. Le bouton de réinitialisation doit toujours être double clic pour démarrer le téléchargement.
Lorsque vous utilisez la plume en mode expéditeur de clavier, la plume doit être alimentée par une source d'alimentation 5V connectée à sa broche USB. Dans ce cas, une carte de série USB CP2104 fournit la puissance 5V ainsi que la série USB pour la sortie de débogage via la broche TX UART Serial1.
Une fois le débogage terminé, la carte CP2104 n'est pas nécessaire, mais une alimentation 5V est toujours requise.
L'option d'alimentation de la batterie en plumes n'est pas utile ici car les batteries au lithium ne fournissent pas 5 V.
La paire de planches agit comme un clavier passe. Lorsqu'une touche est appuyée sur le clavier, un rapport USB Human Interface Device (HID) est envoyé à l'expéditeur. Le rapport est une structure de données de 8 octets qui s'explique ici les spécifications USB officielles sont disponibles à partir du forum des implémentors USB, mais ils peuvent être difficiles à comprendre.
L'expéditeur envoie le rapport HID sur sa radio RFM69. Lorsque le récepteur reçoit le rapport HID de sa radio RFM69, il envoie le rapport HID sur son port USB natif.
La plupart du code dans USBKBDRFM69rx.ino est à partir d'un exemple de la bibliothèque Radiohead. La bibliothèque du clavier USB Arduino fournit l'émulation du clavier USB sur le port USB natif. Dans le code ci-dessous, lorsqu'un rapport USB HID est reçu de la radio RFM69, il est envoyé le port USB.
L'énoncé rf69_manager.recvfromAck(buf, &len, &from) reçoit un bloc d'octets de la radio. Le bloc d'octets est un rapport USB HID à l'expéditeur.
L'énoncé HID().SendReport(2, buf, len) envoie le bloc d'octets du port USB. Cette fonction n'est pas documentée mais est très utile pour passer.
Le débogage conditionnel jette le rapport HID et le 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 plupart du code dans USBKBDRFM69TX.ino provient d'un exemple de la bibliothèque Radiohead. La bibliothèque USBHOST Arduino fournit la fonction de clavier hôte USB sur le port USB natif. Dans le code ci-dessous, lorsqu'un rapport USB HID est reçu du clavier USB, il est envoyé par la radio RFM69.
Remarque: La documentation Arduino USBHOST fait référence uniquement à des cartes dûes mais USBHOST pour les cartes Zero, M0 et MKR (au moins celles que j'ai testées). Les cartes compatibles Adafruit Arduino avec les processeurs SAMD21 et SAMD51 fonctionnent également, mais je ne peux que garantir les planches que j'ai personnellement testées.
La fonction KeyboardRaw::Parse est appelée par la fonction USBhost :: Task lorsqu'un rapport HID est reçu du clavier USB.
L'instruction rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) envoie le rapport HID sur la radio RFM69 au récepteur.
La classe KeyboardRaw est créée pour intercepter le rapport USB HID de la bibliothèque de clavier USBHOST. L'instruction hostKeyboard.SetReportParser(0, this) est la façon dont la classe redirige le HID se rapporte à lui-même.
#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 );