Buenas, primero de todo, quiero dar las gracias a Daniel Gallardo, profesor de un curso de Arduino-Processing al que estoy asistiendo, y es quien me ha explicado cómo hacer esto.
Dado que bastante gente quiere usar Arduino como un teclado, mouse o joystick, he decidido hacer este tutorial.
Lo normal, es que cuando se quiere hacer esto, es usar un Arduino Leonardo, Micro, Due o Esplora, que son los que nos permiten esta funcionalidad directamente, usando unos comandos específicos para estos modelos.
El caso es que también se puede hacer con un Arduino UNO o con un Mega. El truco está en re-grabar el firmware del Atmega 16u2 que llevan estos modelos, para la comunicación USB-Serial.
En este tutorial, explicaré cómo hacer que un Arduino UNO, se comporte como un teclado, conectado al USB de un PC con Windows. Todo lo que voy a explicar aquí, es para poder hacerlo bajo Windows, ya que es el sistema operativo del que dispongo.
Bien, pues empecemos, en la siguiente página web:
http://hunt.net.nz/users/darran/
Tenemos toda la información, firmwares y sketches de prueba, para hacer todo esto. Para hacer el teclado, nos basaremos en este:
http://hunt.net.nz/users/darran/weblog/b3029/Arduino_UNO_Keyboard_HID_version_03.html
Lo primero que tenemos que hacer, es subir el sketch al arduino, ya que una vez re-grabado el firmware del 16u2, perdemos la posibilidad de cargar el sketch por el puerto USB, ya que incluso deja de ser detectado por el PC como un arduino, y pasa a detectarse como un teclado. El sketch de prueba es este:
http://hunt.net.nz/users/darran/weblog/b3029/attachments/2d281/kbd_usb_demo.pde
/* Arduino USB Keyboard HID demo
*
* Sends Volume up, hello world, and Volume Down to the host PC
*
*/
uint8_t buf[8] = { 0 }; /* Keyboard report buffer */
void setup();
void loop();
#define KEY_LEFT_CTRL 0x01
#define KEY_LEFT_SHIFT 0x02
#define KEY_RIGHT_CTRL 0x10
#define KEY_RIGHT_SHIFT 0x20
void setup()
{
Serial.begin(9600);
delay(200);
}
char *str = "+hello world-";
void loop()
{
char *chp = str;
delay(5000);
while (*chp) {
if ((*chp >= 'a') && (*chp <= 'z')) {
buf[2] = *chp - 'a' + 4;
} else if ((*chp >= 'A') && (*chp <= 'Z')) {
buf[0] = KEY_LEFT_SHIFT; /* Caps */
buf[2] = *chp - 'A' + 4;
} else {
switch (*chp) {
case ' ':
buf[2] = 0x2c; // Space
break;
case '+':
buf[2] = 128; // Volume up
break;
case '-':
buf[2] = 129; // Volume down
break;
default:
/* Character not handled. To do: add rest of chars from HUT1_11.pdf */
buf[2] = 0x37; // Period
break;
}
}
Serial.write(buf, 8); // Send keypress
buf[0] = 0;
buf[2] = 0;
Serial.write(buf, 8); // Release key
chp++;
}
}
Este código, según dice el comentario que hay al principio, envía un "subir volumen", después la frase "hello world" tal y como si la hubiésemos tecleado, y un "baja volumen", y esto, lo repite cada 5 segundos. Realmente, no voy a entrar en las particularidades del sketch, ya que quien quiera más información sobre cómo funciona, lo puede ver en el link que dejé más arriba. Lo importante de este post, es el tema de re-grabar el firmware del arduino y demostrar que puede hacerse con un UNO.
Una vez subido el sketch al arduino, lo siguiente que necesitamos es el Atmel Flip.
Esto es una aplicación para grabar archivos .hex directamente en el 16u2 a través de puerto USB.
Aquí el link de descarga:
Instalamos el Atmel Flip, lo ejecutamos y tenemos esto:
Lo siguiente que tenemos que hacer, es darle al icono del chip que hay a la izquierda del todo, o ir al menu "device/select" y seleccionar el ATmega 16u2 y aceptar.
Ahora, vamos a poner el chip en modo DFU. Para eso, teniendo el arduino conectado al ordenador por el cable USB, hacemos un reset al chip 16u2, haciendo un puente en los pines que aparecen en rojo en la siguiente imagen:
Soltamos el puente que hemos hecho, y Windows, nos reconocerá el arduino como un dispositivo desconocido. Le cargamos el driver que hay en "C:\Program Files (x86)\Atmel\Flip 3.4.7\usb" y ahora sí que nos lo reconocerá como un ATmega 16u2. Dentro del Administrador de dispositivos de Windows, lo podemos ver dentro de la categoría "Atmel USB Devices".
En el link que puse antes:
http://hunt.net.nz/users/darran/weblog/b3029/Arduino_UNO_Keyboard_HID_version_03.html
Tenemos el .hex que es el firmware que debemos cargar al 16u2 con el programa Atmel Flip. Aquí el link de descarga:
http://hunt.net.nz/users/darran/weblog/b3029/attachments/03237/Arduino-keyboard-0.3.hex
Lo descargamos, y en Flip, en el Menu "File/Load HEX file..." cargamos el archivo.hex que nos acabamos de descargar que será el "Arduino-keyboard-0.3.hex". Después, le damos al icono con forma de cable USB y seleccionamos USB, también podemos hacerlo desde el menu "Settings/Communication/USB" y en la nueva ventana que nos aparece en la que pone "USB Port Connection" seleccionamos "Open".
Vamos al menu "device/Erase" y luego "Device/program". Con esto ya tenemos el Arduino re-programado como un teclado. A partir de este momento, para poder comprobar que funciona, abrimos un "Wordpad" de windows, desconectamos el USB del arduino y lo volvemos a conectar, para que el 16u2 salga del modo DFU y sea detectado por el PC como un teclado USB.
Veremos que cada 5 segundos aparece la frase "hello world". Lo de subir y bajar el volumen, la verdad es que yo no lo he visto en ningún momento, pero sí que nos escribe en el PC la frase, tal y como si la hubiésemos tecleado.
Pues bien, ya tenemos el UNO como un teclado. En el siguiente mensaje de este post, os enseñaré cómo volver a dejar el arduino como estaba antes.