Arduino como USB HID


25

¿Es posible construir un dispositivo HID (como un teclado) usando un Arduino uno?

Por el momento, tengo entradas de botón en el Arduino que dan salidas en la línea serie. Entonces, ¿cómo puedo transformar mi firmware actual en algo que pueda comportarse como un teclado HID?

  • ¿Debo escribir un nuevo controlador de dispositivo de Windows?
  • ¿Debo crear una capa de software que pueda tomar mis datos en serie y hacer que Windows los lea como entrada HID?
  • ¿Hay alguna manera mejor de lograr esto, si es posible?

1
Puedo estar equivocado, pero esto no se trata realmente de Arduino. Se trata del desarrollo del controlador de dispositivo lateral de Windows.
asheeshr

1
Primera respuesta en google: mitchtech.net/arduino-usb-hid-keyboard ... pero no especificó qué Arduino. En un Leonardo está integrado, y el controlador apropiado ya existe (ver arduino.cc/en/Reference/MouseKeyboard ).
FredP

Estoy usando un Uno, pero veré lo que publicaste porque la última vez que consideramos la actualización de DFU, pero tenemos un poco de miedo a las cosas de ladrillo, ya que los componentes no están tan disponibles y baratos en mi área como en la mayoría lugares.
Anomalía

3
@AsheeshR Este problema está en meta ahora: meta.arduino.stackexchange.com/q/102/46
Ricardo

1
Bueno, eso es definitivamente posible, ya que el Arduino Uno presenta un Atmega16u2 como chip de controlador USB, el usuario puede usar el flasheo DFU o ICSP para empujar en el dispositivo un firmware cercano al de Leonardo que hará que el Arduino se comporte como un teclado HID. No hay desarrollo de Windows involucrado, no se debe construir un controlador ya que los dispositivos USB / HID se reconocen por defecto. es decir, esa pregunta debería reabrirse.
zmo

Respuestas:


14

¿Es posible construir un dispositivo HID (como un teclado) usando un Arduino uno?

¡sí lo es! Y hay un gran tutorial sobre cómo hacer eso aquí

Por el momento, tengo entradas de botón en el Arduino que dan salidas en la línea serie. Entonces, ¿cómo puedo transformar mi firmware actual en algo que pueda comportarse como un teclado HID?

Como muestra el tutorial, debe transformar su código de firmware para que, en lugar de imprimir los eventos, desencadene eventos. Lo que debe hacer es agregar a su 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);
}

Lo que está haciendo aquí es enviar desde sus eventos principales del microcontrolador Arduino a través de la línea serie al microcontrolador más pequeño que maneja la comunicación USB. Ese microcontrolador tomará esas "memorias intermedias" de teclas y las transferirá a medida que se presione la tecla del teclado USB HID sobre USB.

Tenga en cuenta que el carácter clave ( chren el código aquí), es en realidad un código clave enviado a través de USB que es interpretado por su controlador HID USB, que luego se traduce en un carácter real utilizando el diseño actual que ha configurado para su teclado.

El modpersonaje es una de las teclas modificadoras que tiene en el teclado (shift, control, alt ...), 0x00no siendo modificador.

  • ¿Debo escribir un nuevo controlador de dispositivo de Windows?

¡No, no necesitas! Con la actualización de DFU, su arduino será visto como un teclado USB por Windows.

  • ¿Debo crear una capa de software que pueda tomar mis datos en serie y hacer que Windows los lea como entrada HID?

Tampoco necesita hacer eso, y en realidad es una muy mala idea por muchas razones:

  • su solución no sería portátil y, por lo tanto, necesitaría piratear algo para cada plataforma que pueda usar,
  • su solución implicaría mucho código nuevo; cuanto más código escriba uno, es probable que haya más errores en su sistema,
  • su solución sería realmente hostil, ya que se comportaría como un controlador de dispositivo (es decir, tierra del kernel ) que recibe información de un programa de usuario (es decir, tierra del usuario ) y es probable que no funcione, sea un infierno de depuración y propenso a problemas de seguridad. .. Si eso es posible!

Estoy usando un Uno, pero miraré lo que publicaste porque la última vez que consideramos la actualización de DFU pero tenemos un poco de miedo a las cosas de ladrillo

Finalmente, tiene dudas, en un comentario, sobre bloquear su arduino. Por favor, créame y al autor del artículo que no puede bloquear su arduino haciendo un flash de firmware:

NOTA: No hay posibilidad de "bloquear" el dispositivo con este método. ¡El firmware del cargador de arranque Arduino siempre se puede actualizar utilizando el protocolo DFU!

En caso de que algo salga muy mal y se dañe el cargador de arranque en el pequeño AVR (atmega8u2), aún puede volver a flashearlo usando otro arduino o un programador atmel usando los 6 pines al lado del enchufe USB.

Al final, sepa que la única forma de bloquear un AVR, por lo tanto también un Arduino, es jugar con los fusibles y restablecer los fusibles de programación. E incluso entonces, puede usar HVSP para guardar su dispositivo, aunque a menudo es menos problemático simplemente tomar un nuevo chip.


1
Gracias por toda la información útil, terminamos logrando esto.
Anomalía

Bueno, la forma correcta de bloquear un AVR es con sobrecorriente / sobretensión. Entonces será tostado ...
user2973

Pero entonces, no se llama ladrillo, sino freírlo, o como dices tostarlo. Ponga 15amps a través de la MCU, y apuesto a que lo verá saltar a través de la habitación ;-)
ZMO

¿Cómo liberar una clave específica? Quiero emular una tecla MANTENER y luego soltar. Y también en el enlace, el personaje va a la matriz [2] mientras que aquí va a [1]. ¿Por qué?
5argon

bueno, como se muestra en mi ejemplo, lo haces en dos pasos, primero presionas la tecla, luego está el retraso, luego lo sueltas. Bueno, entonces necesitaría dar una conferencia sobre cómo funciona la implementación del teclado de hardware, no es natural y cada valor de la matriz tiene un significado. Disculpe por no tener un enlace para compartir cajeros automáticos, pero cada vez que encuentre algo buscando en la web, publique un nuevo comentario ☺
zmo

6

Creé un proyecto que reemplaza completamente el Arduino Bootloader. Puede cargar bocetos y usarlo como HID. Ver Proyecto HID en Github: https://github.com/NicoHood/HID


44
¡Bienvenido a Arduino SE! ¿Puedes agregar un poco sobre cómo usar tu biblioteca? ¡Gracias!
Anonymous Penguin

2
Lea el archivo Léame y pruebe los ejemplos. Todo está ahí, no hay necesidad de engañarlo todo aquí. Todo en Github está actualizado :)

Lo siento amigo, parece una biblioteca genial, pero tu documentación es una locura. No hay instrucciones de instalación reales por lo que puedo decir, y los temas completos en tu wiki solo dicen "TODO" (específicamente el tema del gamepad está completamente vacío como este). : - /
BrainSlugs83

1
En realidad, es necesario presentar una descripción básica aquí: las respuestas deben ser significativas incluso sin el enlace externo, que podría morir. Y este no lo es.
Chris Stratton
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.