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.
KEY | HEX | DEC |
---|---|---|
KEY_LEFT_CTRL | 0x80 | 128 |
KEY_LEFT_SHIFT | 0x81 | 129 |
KEY_LEFT_ALT | 0x82 | 130 |
KEY_LEFT_GUI | 0x83 | 131 |
KEY_RIGHT_CTRL | 0x84 | 132 |
KEY_RIGHT_SHIFT | 0x85 | 133 |
KEY_RIGHT_ALT | 0x86 | 134 |
KEY_RIGHT_GUI | 0x87 | 135 |
KEY_UP_ARROW | 0xDA | 218 |
KEY_DOWN_ARROW | 0xD9 | 217 |
KEY_LEFT_ARROW | 0xD8 | 216 |
KEY_RIGHT_ARROW | 0xD7 | 215 |
KEY_BACKSPACE | 0xB2 | 178 |
KEY_TAB | 0xB3 | 179 |
KEY_RETURN | 0xB0 | 176 |
KEY_ESC | 0xB1 | 177 |
KEY_INSERT | 0xD1 | 209 |
KEY_DELETE | 0xD4 | 212 |
KEY_PAGE_UP | 0xD3 | 211 |
KEY_PAGE_DOWN | 0xD6 | 214 |
KEY_HOME | 0xD2 | 210 |
KEY_END | 0xD5 | 213 |
KEY_CAPS_LOCK | 0xC1 | 193 |
KEY_F1 | 0xC2 | 194 |
KEY_F2 | 0xC3 | 195 |
KEY_F3 | 0xC4 | 196 |
KEY_F4 | 0xC5 | 197 |
KEY_F5 | 0xC6 | 198 |
KEY_F6 | 0xC7 | 199 |
KEY_F7 | 0xC8 | 200 |
KEY_F8 | 0xC9 | 201 |
KEY_F9 | 0xCA | 202 |
KEY_F10 | 0xCB | 203 |
KEY_F11 | 0xCC | 204 |
KEY_F12 | 0xCD | 205 |
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.