Emular un dispositivo HID con Arduino

Es posible utilizar algunas placas Arduino como dispositivos HID. Esto nos permitirá emular un teclado, mouse o joystick y utilizarlo conectado a una computadora. No todas las placas Arduino permiten esta función, en concreto usaremos la placa Arduino Pro Micro.

La placa Arduino Pro Micro

Similar al Arduino Mini Pro excepto que esta basado en el microcontrolador ATMEGA32U4. Este micro permite añadir conectividad USB eliminando los populares FTDI o CH340G.

En un tamaño reducido, el PRO MICRO posee las funciones con las que estamos familiarizados:

  • 4 canales ADC de 10-bit
  • 5 pines PWM
  • 12 pines digitales I/O
  • Comunicación serie, I2C, SPI

La librería Keyboard

El IDE de Arduino incluye la librería «Keyboard» que permite emular un teclado con interfaz HID. Es posible enviar cadenas de texto, teclas sueltas o combinadas.

A continuación una lista de las instrucciones disponibles:

  • Keyboard.begin() – Inicia el teclado virtual
  • Keyboard.end() – Finaliza el teclado virtual
  • Keyboard.print() – Escribe un texto usando el teclado
  • Keyboard.println() – Escribe un texto usando el teclado y salta de línea
  • Keyboard.write() – Escribe un texto usando el teclado
  • Keyboard.press() – Pulsa una tecla
  • Keyboard.release() – Suelta una tecla
  • Keyboard.releaseAll() – Suelta todas las teclas

Implementación

El siguiente ejemplo utiliza dos pulsadores, conectados en los pines 2 y 3 de la placa Arduino Pro Micro, para emular las teclas FLECHA IZQUIERDA y FLECHA DERECHA.

El circuito es muy sencillo, simplificándolo a la mínima expresión utilizando las resistencias internas pull-up del microcontrolador:

Placa Arduino PRO Micro. Se utilizan las resistencias pull-up internas.

El código fuente para cargar y hacer las primeras pruebas es el siguiente

/*
   EJEMPLO TECLADO HID
*/

// incluir la librería teclado
#include <Keyboard.h>

// constantes
int const DERECHA = 2;
int const IZQUIERDA = 3;

// variables
boolean pul1 = false;
boolean pul2 = false;

void setup() {

  // configuración de pines
  pinMode(DERECHA, INPUT_PULLUP);
  pinMode(IZQUIERDA, INPUT_PULLUP);

  Keyboard.begin();
  delay(5000); // demora para facilitar la reprogramación de la placa
}

void loop() {

  if (digitalRead(IZQUIERDA) == LOW) {
    pul1 = true; // cambio la variable del antirrebote
  }
  if (digitalRead(IZQUIERDA) == HIGH && pul1 == true) {
    Keyboard.press(KEY_LEFT_ARROW); // envio la tecla flecha izquierda
    delay(50);
    Keyboard.releaseAll();
    pul1 = false; // cambio la variable del antirrebote
  }

  if (digitalRead(DERECHA) == LOW) {
    pul2 = true; // cambio la variable del antirrebote
  }
  if (digitalRead(DERECHA) == HIGH && pul2 == true) {
    Keyboard.press(KEY_RIGHT_ARROW); // envio la tecla flecha derecha
    delay(50);
    Keyboard.releaseAll();
    pul2 = false; // cambio la variable del antirrebote
  }
}

Ejemplo de uso

Mediante el código publicado más arriba es posible construir un joystick para utilizar con videojuegos. En la captura de pantalla vemos la configuración del emulador de NES Nestopia. Para utilizar nuestro dipositivo bastará con seleccionar como entrada el teclado, y mapear los botones.

Más tutoriales de Arduino

  1. Leer un LDR con Arduino
  2. Controlar un motor DC con Arduino
  3. Usar un teclado PS/2 con Arduino
  4. Emular un dispositivo HID con Arduino
  5. Detección de sonido en Arduino