Um teclado USB sem fio de longo alcance em duas partes.
O teclado USB se conecta ao remetente. O remetente deve ter a capabiidade do host USB para se comunicar com o teclado. O SAMD21 M0 é usado para este projeto. Cada pressionamento de teclas e liberação gera um relatório HID USB (descritor de interface humana). O relatório é um ritmo de dados de 8 bytes que é enviado usando o rádio RFM69 para o receptor.
O receptor se conecta ao computador por meio de uma porta USB. Nenhum outro componente é necessário porque o rádio RFM69HCW é integrado à placa de penas. O receptor pega relatórios USB do RFM69 e envia para o computador sobre USB.
Certifique -se de seguir os tutoriais da Adafruit para ambas as placas para garantir que as placas funcionem e as bibliotecas sejam instaladas.

915 MHz -> Feather 32u4 RFM69HCW -> USB cable -> Computer
O receptor pode usar a versão M0 ou 32U4 Feather. O 32U4 foi usado aqui por nenhum outro motivo senão disponível.
Os cabeçalhos não precisam ser instalados na placa. Uma antena é necessária.
Carregue o esboço RFM69KBDRFM69RX.ino. Este programa lê relatórios HID USB do rádio RFM69 e os envia a interface do dispositivo de teclado USB para o computador. A pena é alimentada pelo computador.

Os componentes da esquerda para a direita são:
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
Aviso: o remetente deve usar a versão M0, pois possui capacidade de host USB. O 32U4 não.
Cabeçalhos e pão são usados para se conectar à energia à placa de penas. Uma antena é necessária.
Carregue o esboço RFM69KBDRFM69TX.ino. Este programa lê os relatórios USB HID do teclado USB e envia os relatórios USB HID para o rádio RFM69.
A alimentação da pena é mais complicada em comparação com o receptor. Ao fazer o upload, a pena é alimentada pelo computador. A outra fonte de energia 5V (veja abaixo) deve ser desconectada.
Aviso: não conecte mais de uma fonte de energia à pena ao mesmo tempo.
Aviso: Ao usar o modo de host USB, o botão de redefinição de penas deve ser pressionado duas vezes para colocar a placa no modo de upload. O upload automático não funciona.
Feather M0 RFM69HCW -> USB cable -> Computer
Outra opção para evitar a troca de cabos é carregada através da placa CP2104 e da porta Serial1. O botão de redefinição ainda deve ser clicado duas vezes para iniciar o upload.
Ao usar a pena no modo de remetente do teclado, a pena deve ser alimentada por uma fonte de energia de 5V conectada ao seu pino USB. Nesse caso, uma placa serial USB CP2104 fornece a potência de 5V e a série USB para saída de depuração por meio do pino UART UART TX.
Quando a depuração é concluída, a placa CP2104 não é necessária, mas ainda é necessária uma fonte de alimentação de 5V.
A opção de energia da bateria de penas não é útil aqui porque as baterias de lítio não fornecem 5V.
O par de placas atua como um teclado passa. Quando uma tecla é pressionada no teclado, um relatório de dispositivo de interface humana USB (HID) é enviado ao remetente. O relatório é uma estrutura de dados de 8 bytes que é explicada aqui As especificações oficiais do USB estão disponíveis no fórum dos implementadores USB, mas podem ser difíceis de entender.
O remetente envia o relatório HID para o seu rádio RFM69. Quando o receptor recebe o relatório HID do rádio RFM69, ele envia o relatório HID para sua porta USB nativa.
A maior parte do código no USBKBDRFM69RX.ino é de um exemplo da Biblioteca do Radiohead. A biblioteca de teclado USB Arduino fornece a emulação de teclado USB sobre a porta USB nativa. No código abaixo, quando um relatório HID USB é recebido do rádio RFM69, ele é enviado pela porta USB.
A declaração rf69_manager.recvfromAck(buf, &len, &from) recebe um bloco de bytes do rádio. O bloco de bytes é um relatório HID USB do remetente.
A declaração HID().SendReport(2, buf, len) envia o bloco de bytes para fora da porta USB. Esta função não está documentada, mas é muito útil para passar por passos.
O depuração condicional despeja o relatório HID e o 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" );
}A maior parte do código no USBKBDRFM69TX.ino é de um exemplo da Biblioteca do Radiohead. A Biblioteca Arduino USBHOST fornece o recurso de teclado do host USB sobre a porta USB nativa. No código abaixo, quando um relatório HID USB é recebido do teclado USB, ele é enviado pelo rádio RFM69.
Nota: A documentação do Arduino USBHost refere -se apenas ao vencimento, mas o USBHost funciona para as placas zero, m0 e MKR (pelo menos as que testei). As placas compatíveis com Arduino da Adafruit com os processadores SAMD21 e SAMD51 também funcionam, mas só posso garantir as placas que testei pessoalmente.
A função KeyboardRaw::Parse da instrução é chamada pela função USBHost :: Tarefa quando um relatório HID é recebido do teclado USB.
A declaração rf69_manager.sendtoWait(buf, len, DEST_ADDRESS) envia o relatório HID sobre o rádio RFM69 para o receptor.
A classe KeyboardRaw é criada para interceptar o relatório HID USB da biblioteca de teclado USBHOST. A declaração hostKeyboard.SetReportParser(0, this) é como a classe redireciona o HID relata para si mesmo.
#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 );