fbpixel
Etiquetas:

Es posible interconectar Arduino con el ordenador y convertirlo en un dispositivo HID. Así, es posible transformar un Arduino en un controlador de ordenador, del mismo modo que un mando de videojuegos, un teclado de ordenador o un ratón.

Material

  • Arduino UNO
  • pulsador (o 1 cable dupont)

Esquema

En este tutorial utilizaremos una sola entrada para probar el teclado y la configuración del dispositivo HID. Así que colocamos un pulsador entre el pin GND y el pin A0 del Arduino.

push-button-arduino_bb Convierte tu Arduino en un dispositivo HID

Puedes utilizar un botón para cada tecla o cualquier sensor para crear tu propio controlador.

Código

Como sólo tenemos un botón, cada vez que lo pulsamos incrementamos la variable btnCount para cambiar el siguiente carácter a mostrar.

//azerty       q  b  c  d  e  f  g  h  i  j  k  l  ,  n  o  p  a  r  s  t  u  v  z  x  y  w  &  é  "  '  (  -  è  _  ç  à    )  =  ^  $  *  No fr  m  ù   ²    ;  :  !    <
//qwerty       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  1  2  3  4  5  6  7  8  9  0    -  =  [  ]  \  No US  ;  '   `    ,  .  /   No US      
//keycode      4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,  45,46,47,48,49,  50,  51,52, 53,  54,55,56,  100}; 


uint8_t buf[8] = { 0 }; //Keyboard report buffer

//Keypad
const int btnPin = A0;
int btnState=false,oldState=true;
int btnCount=4; //Key code A-4 Z-29

void setup() {
  Serial.begin(9600);
  pinMode(btnPin,INPUT_PULLUP);
}

void loop() {
  sendKey();
}


void sendKey() { /* function readAbtn */
  //// Read button states from keypad
  getBtn();
  if (btnState!=oldState and btnState==true) {
    buf[2] = btnCount++; // keycode
    Serial.write(buf, 8); // Send keypress 
    releaseKey(); 
  }
  if(btnCount>29) btnCount=4;
  oldState=btnState;
}

void getBtn() { /* function getABtn */
  //// Read button states from keypad
  if (analogRead(btnPin) > 200) {
    btnState=false;
  } else {
    btnState=true;
  }
  delay(100); //anti-bounce delay
}


void releaseKey() {
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8); // Send Release key
}

Para simplificar el código y evitar tener que encontrar los keycodes, puedes usar la librería USBKeyboard, Keyboard.h (para placas compatibles) o HID-project (con HoodLoader2).

Configuración del dispositivo HID

Para transformar el Arduino en un dispositivo HID, necesitamos modificar el código del puerto USB controlado por el ATmega16U2. Para ello utilizaremos el software Flip, que nos permitirá cambiar el firmware del microprocesador.

arduino-hid-flip Convierte tu Arduino en un dispositivo HID
  • Seleccione el microprocesador de la lista
arduino-hid-flip-select-device Convierte tu Arduino en un dispositivo HID
  • Reinicia el puerto USB conectando los dos pines más a la izquierda del puerto ICSP2. (los LEDs Tx y Rx deberían encenderse).
  • Selecciona Configuración>Comunicación>USB Ctrl+U, y luego haz clic en «Abrir».
arduino-hid-flip-open-usb Convierte tu Arduino en un dispositivo HID
arduino-hid-flip-load-hex Convierte tu Arduino en un dispositivo HID

Resultado

Una vez hecho esto, desconecte y vuelva a conectar el puerto USB. Abrir un archivo de texto. Al pulsar el botón, los caracteres deben aparecer sucesivamente. Observará que las teclas a,q,w,z están invertidas porque el teclado está configurado en AZERTY.

arduino-hid-keyboard-result Convierte tu Arduino en un dispositivo HID

Cambiar el Arduino de un dispositivo HID a un dispositivo serie

Pour retrouver un fonctionnement normal de l’Arduino, on refait la manipulation avec le logiciel Flip mais à la place du fichier arduino-keyboard.hex on charge le fichier Arduino-usbserial-uno.hex.

Reinicia el puerto USB con un puente entre los pines ICSP, luego carga el archivo hexadecimal y pulsa «Ejecutar».

arduino-hid-flip-usb-serial Convierte tu Arduino en un dispositivo HID

Aplicaciones

  • Crea un teclado o un mando de videojuegos con Arduino
  • Utilizar Arduino para manejar un ordenador automáticamente

Fuentes