Arduino como USB HID

25

É possível construir um dispositivo HID (como um teclado) usando um Arduino uno?

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?

  • Devo escrever um novo driver de dispositivo de janela?
  • Devo criar uma camada de software que possa pegar meus dados seriais e fazer com que o Windows os leia como entrada HID?
  • Existe alguma maneira melhor de conseguir isso, se é que é possível?
Anomalia
fonte
11
Posso estar errado, mas isso não é realmente sobre o Arduino. É sobre o desenvolvimento do driver de dispositivo lateral do Windows.
asheeshr
11
Primeira resposta no google: mitchtech.net/arduino-usb-hid-keyboard ... mas você não especificou qual Arduino. Em um Leonardo, ele é incorporado e o driver apropriado já existe (consulte arduino.cc/en/Reference/MouseKeyboard ).
FredP
Estou usando um Uno, mas vou ver o que você postou porque da última vez que consideramos a atualização do DFU, mas estamos com medo de material de tijolos, pois os componentes não estão tão disponíveis e baratos na minha área quanto na maioria dos lugares.
Anomaly
3
@AsheeshR Esta edição está na meta agora: meta.arduino.stackexchange.com/q/102/46
Ricardo
11
Bem, isso é definitivamente possível, como o Arduino Uno possui um Atmega16u2 como chip de driver USB, o usuário pode usar o DFU ou o ICSP piscando para enviar ao dispositivo um firmware próximo ao de leonardo, que fará o Arduino se comportar como um teclado HID. Não há desenvolvimento de janelas envolvido, nenhum driver a ser construído, pois os dispositivos USB / HID são reconhecidos por padrão. ou seja, essa pergunta deve ser reaberta.
Zmo

Respostas:

14

É 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 modcaractere é uma das teclas modificadoras que você possui no teclado (shift, control, alt ...), 0x00nã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.

zmo
fonte
11
Obrigado por todas as informações úteis, acabamos conseguindo isso.
Anomaly
Bem, a maneira correta de bloquear um AVR é ​​com sobrecorrente / sobretensão. Em seguida, ele vai ser torrado ...
user2973
Mas, então, não se chama tijolo, mas frita, ou como você diz, brindando. Coloque 15 ampères através do MCU, e eu aposto que você vai vê-lo saltar através da sala ;-)
Zmo
Como liberar uma chave específica? Quero emular uma tecla HOLD e soltar. E também no link, o caractere vai para o array [2] enquanto aqui vai para [1]. Por quê?
5argon
bem, como mostrado no meu exemplo, você faz isso em duas etapas, primeiro pressiona a tecla, depois o atraso, depois o libera. Bem, você precisaria dar uma palestra sobre como a implementação do teclado de hardware funciona, isso não é natural, e cada valor da matriz tem um significado. Perdoe-me por não ter um link para compartilhar atm, mas sempre que você encontrar algo pesquisar na web, por favor, colocar um novo comentário ☺
Zmo
6

Criei um projeto que substitui totalmente o Arduino Bootloader. Você pode fazer upload de esboços e usá-lo como HID. Veja o Projeto HID no Github: https://github.com/NicoHood/HID


fonte
4
Bem-vindo ao Arduino SE! Você pode adicionar um pouco sobre como usar sua biblioteca? Obrigado!
Anonymous Penguin
2
Leia o leia-me e tente os exemplos? Está tudo lá, não há necessidade de enganar tudo aqui. Tudo no Github é até à data :)
Desculpe cara, parece uma biblioteca legal, mas sua documentação está louca. Não há instruções reais de instalação, tanto quanto eu posso dizer, e tópicos inteiros no seu wiki apenas dizem "TODO" (especificamente o tópico do gamepad está completamente vazio assim). : - /
BrainSlugs83
11
Na verdade, é necessário apresentar uma descrição básica aqui: é necessário que as respostas sejam significativas mesmo sem o link externo, que pode morrer. E este não é.
22818 Chris Stratton #