É possível construir um dispositivo HID (como um teclado) usando um Arduino uno?
sim! E há um ótimo tutorial sobre como fazer isso aqui
No momento, tenho entradas de botão no Arduino que fornecem saídas na linha serial. Então, como posso transformar meu firmware atual em algo que possa se comportar como um teclado HID?
Como o tutorial mostra, é necessário transformar o código do firmware. Em vez de imprimir os eventos, você realmente aciona os eventos. O que você precisa fazer é adicionar ao seu código:
void triggerKey(uint8_t mod, uint8_t chr) {
uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// press key
Serial.write(buf, 8);
// emulate key press delay
delay(10);
buf[1] = 0x00;
// release key
Serial.write(buf, 8);
}
O que você está fazendo aqui é enviar dos principais eventos do microcontrolador Arduino pela linha serial para o microcontrolador menor que lida com a comunicação USB. Esse microcontrolador pega esses "buffers" de teclas e os transfere quando a tecla USB HID Keyboard pressiona sobre USB.
Cuidado com o caractere chave (chr
no código aqui) é na verdade um código-chave enviado por USB que é interpretado pelo driver USB HID, que o converte em um caracter real usando o layout atual que você configurou para o teclado.
O mod
caractere é uma das teclas modificadoras que você possui no teclado (shift, control, alt ...), 0x00
não sendo modificador.
- Devo escrever um novo driver de dispositivo de janela?
Não, você não precisa! Com a atualização do DFU, o seu arduino será visto como um teclado USB pelo Windows.
- Devo criar uma camada de software que possa pegar meus dados seriais e fazer com que o Windows os leia como entrada HID?
Você não precisa fazer isso, e na verdade é uma péssima ideia por vários motivos:
- sua solução não seria portátil e, portanto, você precisaria invadir algo para cada plataforma que possa usar,
- sua solução implicaria muitos códigos novos; quanto mais um código é gravado, maior a probabilidade de haver bugs no seu sistema,
- sua solução seria realmente tola, pois se comportaria como um driver de dispositivo (por exemplo, terra do kernel ) recebendo informações de um programa do usuário (por exemplo, terra do usuário ) e provavelmente não funcionará, será um inferno para depuração e propenso a problemas de segurança. .. Se isso é possível!
Estou usando um Uno, mas vou olhar o que você postou porque da última vez que consideramos a atualização do DFU, mas estamos com medo de coisas de tijolos
Finalmente, você está tendo preocupações, em um comentário, sobre a colocação de tijolos no seu arduino. Acredite em mim e no autor do artigo que você não pode bloquear o seu arduino fazendo um flash de firmware:
NOTA: Não há chance de 'bloquear' o dispositivo usando este método. O firmware do carregador de inicialização do Arduino sempre pode ser atualizado usando o protocolo DFU!
Caso algo fique realmente errado e você tenha uma corrupção no carregador de inicialização no pequeno AVR (atmega8u2), ainda poderá fazer a atualização usando outro arduino ou um
programador atmel usando os 6 pinos próximos ao plugue USB.
No final, saiba que a única maneira de criar um AVR, assim como um Arduino, é brincar com os fusíveis e redefinir os fusíveis de programação. E mesmo assim, você pode usar o HVSP para salvar o seu dispositivo, embora muitas vezes seja menos complicado usar
apenas um novo chip.