como-emular-un-teclado-o-un-raton-con-arduino

Cómo emular un teclado o un ratón con Arduino

Una funcionalidad poca conocida de ciertos microprocesadores es la de poder emular un teclado o ratón cuando los conectamos con un ordenador y otro dispositivo compatible por USB.

Esta funcionalidad de emulación HID (Human Interface Device) está disponible de forma nativa en placas que incorporan los procesadores ATMEGA 32u4 (Micro, Leonardo) o SAMD (Zero, Due, MKR).

Otros procesadores fuera del “ecosistema” de Arduino también pueden incorporar la función de emulación HID. Incluso existen ciertos ‘apaños’ para que procesadores como el Atmega 328 hagan de HID pero, en general, no funcionan muy bien.

¿Para qué puede ser útil esto? Por ejemplo, para interactuar con máquinas o programas sobre los que no tenemos acceso para instalar un programa. Por ejemplo, podemos controlar un reproductor de video Android, o incluso en máquinas industriales, en las que no podemos instalar software pero se controlan por teclado o ratón.

Otro uso común es combinar la funcionalidad HID con algún sensor para hacer nuestros “propios” controladores HID. Por ejemplo, controlar un videojuego con potenciómetros, o un guante con acelerómetros, o con ultrasonidos, etc.

Finalmente, otro uso posible es automatizar tareas en dispositivos. Por ejemplo, si tienes que ejecutar un proceso en muchos ordenadores, o meter una contraseña de forma discreta, puedes configurarte uno o varios dispositivos que ejecuten los procesos. Lo van pinchando, y listo.

Como decimos, una funcionalidad muy sencilla de usar y en ocasiones olvidada, que puede ser útil en bastantes situaciones y bien merece que dediquemos una rápida entrada.

Arduino como teclado

Para emplear Arduino como teclado disponemos de la librería ‘Keyboard’ que se incluye en el IDE estándar de Arduino. Su uso es muy sencillo, aquí tenemos un resumen de las funciones principales de la librería.

// Inicia y finaliza el teclado virtual
Keyboard.begin()
Keyboard.end()

// Escribe un texto usando el teclado
Keyboard.print()
Keyboard.println()
Keyboard.write()

// Pulsar y soltar una tecla
Keyboard.press()
Keyboard.release()
Keyboard.releaseAll()

Como vemos, su uso es muy parecido a usar la librería Serial. Pero vamos a verlo con algunos ejemplos.

Ejemplo teclado sencillo

Vamos a empezar con un ejemplo sencillo. Con el siguiente código escribimos ‘Hola mundo!’ usando la emulación de teclado.

#include <Keyboard.h>

void setup() {
  Keyboard.begin();
  delay(5000);
}

void loop() {
  Keyboard.println("Hola mundo!");
  delay(1000);
}

Hemos dejado una pausa de 5 segundos en el ‘Setup’, para que sea más sencillo reprogramarlo. Si no dejamos ninguna pausa el programa se pondrá a escribir inmediatamente, que escribiría en el propio IDE, y resulta molesto para reprogramarlo.

Si no ponéis pausa, y os da problemas para reprogramar, podréis hacerlo conectándolo el Arduino al USB justo cuando el IDE haya terminado de compilar.

Ejemplo teclado con combinaciones de teclas

Si queremos usar teclas combinaciones de teclas (por ejemplo, Control+…) podemos usar las funciones ‘press’ y ‘release’. En el siguiente código vemos dos formas diferentes de, por ejemplo, pulsar Control+n.

#include <Keyboard.h>

void setup() {
  Keyboard.begin();
}

void loop() {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('n');
  delay(100);
  Keyboard.releaseAll();
  
  // otra forma de hacer el release, tecla a tecla
  //Keyboard.release(KEY_LEFT_CTRL);
  //Keyboard.release('n');
  
  delay(1000);
}

Aquí tenéis un listado de las teclas y modificadores disponibles, y su correspondencia en código hexadecimal y decimal.

KEYHEXDEC
KEY_LEFT_CTRL0x80128
KEY_LEFT_SHIFT0x81129
KEY_LEFT_ALT0x82130
KEY_LEFT_GUI0x83131
KEY_RIGHT_CTRL0x84132
KEY_RIGHT_SHIFT0x85133
KEY_RIGHT_ALT0x86134
KEY_RIGHT_GUI0x87135
KEY_UP_ARROW0xDA218
KEY_DOWN_ARROW0xD9217
KEY_LEFT_ARROW0xD8216
KEY_RIGHT_ARROW0xD7215
KEY_BACKSPACE0xB2178
KEY_TAB0xB3179
KEY_RETURN0xB0176
KEY_ESC0xB1177
KEY_INSERT0xD1209
KEY_DELETE0xD4212
KEY_PAGE_UP0xD3211
KEY_PAGE_DOWN0xD6214
KEY_HOME0xD2210
KEY_END0xD5213
KEY_CAPS_LOCK0xC1193
KEY_F10xC2194
KEY_F20xC3195
KEY_F30xC4196
KEY_F40xC5197
KEY_F50xC6198
KEY_F60xC7199
KEY_F70xC8200
KEY_F80xC9201
KEY_F90xCA202
KEY_F100xCB203
KEY_F110xCC204
KEY_F120xCD205

Ejemplo teclado abrir notepad

En este último ejemplo vemos un caso algo más funcional, lanzando el bloc de notas en Windows. Para ello, pulsamos la tecla Windows+R, escribimos “notepad” + ENTER en la ventana que aparece. Finalmente, escribimos “Hola mundo!” en la ventana del bloc de notas.

#include <Keyboard.h>

void setup() {
  Keyboard.begin();
}

void loop() {
  Keyboard.press(KEY_RIGHT_GUI);
  Keyboard.press('r');
  delay(100);
  Keyboard.releaseAll();  
  delay(1000);
  
  Keyboard.println("notepad");
  
  Keyboard.press(KEY_RETURN);
  delay(100);
  Keyboard.releaseAll();
  
  Keyboard.print("Hola mundo!");
}

Emular ratón con Arduino

También es posible emular un ratón con la librería ‘Mouse’ incluida en el IDE estándar. Las funciones de esta librería son las siguientes.

// Iniciar y detener el ratón virtual
Mouse.begin()
Mouse.end()

// Movimiento relativo del ratón
Mouse.move()

// Hacer click con el ratón
Mouse.click()
Mouse.press()
Mouse.release()
Mouse.isPressed()

Ejemplo ratón sencillo

Vamos a ver un ejemplo sencillo de cómo emular un ratón con Arduino. El siguiente ejemplo mueve el ratón 10px a izquierda y arriba y hace clic.

#include "Mouse.h"

void setup() {
  Mouse.begin();
}

void loop() {
  Mouse.move(10, 10, 0);
  Mouse.click();
  delay(100);
}

Librería ratón mejorada

La librería ‘Mouse’ tiene la desventaja de que sólo permite movimientos relativos del ratón. Esto puede ser suficiente para interactuar con programas (ejemplo, un videojuego) desde un dispositivo movido por un usuario (por ejemplo, un potenciómetro o un giroscopio).

Pero en muchas ocasiones resulta conveniente poder mover el ratón a unas coordenadas de la pantalla, en valor absoluto. Por ejemplo, para hacer click en un botón de un programa.

Para ello tenemos la librería https://github.com/per1234/MouseTo que incorpora muchas funcionalidades respecto a la librería ‘Mouse’. La librería dispone de varios ejemplos que podéis revisar para ver su uso.