viernes, 22 de mayo de 2015

Arduino Uno R3 como teclado (parte 1)


En esta entrada dejaré asentado como crear un teclado a partir de la placa Arduino Uno. (la utilidad de un teclado configurable se la da cada uno).

Es importante añadir que existen muchos de estos tutoriales, en inglés, y mi intención es siempre acercárselos a los que por ahí no se les da tanto el inglés. (...además de ayuda memoria para mí...:)

La placa utilizada es una Arduino Uno R3 con MEGA16U2 como interfaz serie USB.


Estas entradas estarán divididas en varias partes. Las iré publicando y puliendo sobre la marcha. Es que no quiero pasar tanto tiempo sin publicar así que sepan entender si existen errores y les agradezco desde ya sus feedback.

Primero deberemos instalar las herramientas necesarias para poder cambiar el firmware de la placa. Es decir re-flashearemos al Mega16u2, el cual es el encargado de darnos comunicación USB entre nuestra placa y la PC.

Recuerden que al hacer esto el IDE de Arduino no reconocerá más el dispositivo, ya que lo modificaremos de una "Arduino Uno" a un "Keyboard Demo".

Instalar DFU programmer para Linux.

Se recomienda descargar el codigo fuente y compilarlo.

Para ello instalar previamente (como root):

# apt-get install usbutils dfu-util libusb-dev automake 
# apt-get install libusb-1.0-0-dev

luego en la carpeta donde han descomprimido el archivo descargado, ejecutan:

/home/tuusuario/descargas/dfu-programmer# ./bootstrap.sh
/home/tuusuario/descargas/dfu-programmer# ./configure
/home/tuusuario/descargas/dfu-programmer# make

Si no hay errores, está listo. Ahora se dirigen a la carpeta /src dentro de dfu-programmer

y lanzan:

/home/tuusuario/descargas/dfu-programmer/src# ./dfu-programmer --targets

Este comando les devolverá los dispositivos compatibles con la version del dfu-programmer ejecutada, en el caso de la que compilé el resultado es:

8051 based controllers:
    at89c51snd1c       at89c51snd2c       at89c5130          at89c5131      
    at89c5132      
AVR based controllers:
    at90usb1287        at90usb1286        at90usb1287-4k     at90usb1286-4k 
    at90usb647         at90usb646         at90usb162         at90usb82      
    atmega32u6         atmega32u4         atmega32u2         atmega16u4     
    atmega16u2         atmega8u2      
AVR32 based controllers:
    at32uc3a0128       at32uc3a1128       at32uc3a0256       at32uc3a1256   
    at32uc3a0512       at32uc3a1512       at32uc3a0512es     at32uc3a1512es 
    at32uc3a364        at32uc3a364s       at32uc3a3128       at32uc3a3128s  
    at32uc3a3256       at32uc3a3256s      at32uc3a4256s      at32uc3b064    
    at32uc3b164        at32uc3b0128       at32uc3b1128       at32uc3b0256   
    at32uc3b1256       at32uc3b0256es     at32uc3b1256es     at32uc3b0512   
    at32uc3b1512       at32uc3c064        at32uc3c0128       at32uc3c0256   
    at32uc3c0512       at32uc3c164        at32uc3c1128       at32uc3c1256   
    at32uc3c1512       at32uc3c264        at32uc3c2128       at32uc3c2256   
    at32uc3c2512   
XMEGA based controllers:
    atxmega64a1u       atxmega128a1u      atxmega64a3u       atxmega128a3u  
    atxmega192a3u      atxmega256a3u      atxmega16a4u       atxmega32a4u   
    atxmega64a4u       atxmega128a4u      atxmega256a3bu     atxmega64b1    
    atxmega128b1       atxmega64b3        atxmega128b3       atxmega64c3    
    atxmega128c3       atxmega256c3       atxmega384c3       atxmega16c4    
    atxmega32c4    


Luego para visualizar los dispositivos USB conectados deben conectar la placa y lanzan:
$lsusb

...entre los resultados debería aparecer una línea como la siguiente:


Bus 001 Device 019: ID 2341:0001 Arduino SA Uno (CDC ACM) 

Nuestro Arduino fue reconocido correctamente, ahora, sin desconectar la placa hacen un puente momentaneo entre el pin de reset y GND. Lanzan nuevamente:
$lsusb

Entre los resultados desaparece el anterior y obtenemos algo parecido a lo siguiente:

Bus 001 Device 018: ID 03eb:2fef Atmel Corp.

Esto nos informa que el dispositivo está en modo DFU listo para ser flasheado con el nuevo firmware.

Borramos el firmware residente:
/home/tuusuario/descargas/dfu-programmer-0.7.0/src# ./dfu-programmer atmega16u2 erase
Checking memory from 0x0 to 0x2FFF...  Not blank at 0x1.
Erasing flash...  Success
Checking memory from 0x0 to 0x2FFF...  ERROR.


Flasheamos el firmware de teclado:
/home/tuusuario/descargas/dfu-programmer-0.7.0/src# ./dfu-programmer atmega16u2 flash --debug 1 Arduino-keyboard-0.3.hex
Checking memory from 0x0 to 0xFFF...  Empty.
0%                            100%  Programming 0x1000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0x1000 bytes written into 0x3000 bytes memory (33.33%).




Luego reseteamos la placa con:

/home/tuusuario/descargas/dfu-programmer-0.7.0/src# ./dfu-programmer atmega16u2 reset

Listo, al lanzar:

$lsusb
Bus 005 Device 008: ID 03eb:2042 Atmel Corp. LUFA Keyboard Demo Application

Ahora el dispositivo es reconocido como un teclado.

Para volver a flashear el firmware de Arduino Uno 

/home/tuusuario/descargas/dfu-programmer-0.7.0/src# ./dfu-programmer atmega16u2 erase

/home/tuusuario/descargas/dfu-programmer-0.7.0/src#./dfu-programmer atmega16u2 flash --debug 1 Arduino-usbserial-uno.hex
Checking memory from 0x0 to 0xFFF...  Empty.
0%                            100%  Programming 0x1000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0x1000 bytes written into 0x3000 bytes memory (33.33%).


/home/tuusuario/descargas/dfu-programmer-0.7.0/src# ./dfu-programmer atmega16u2 reset

De esta manera nuestro IDE ya reconocerá nuevamente nuestra placa, para 
cargar los sketch en el MEGA.

RECOMIENDO QUE LUEGO DEL RESET DESCONECTEN Y VUELVAN A CONECTAR LA PLACA. 

TO DO:
*- A medida que pueda agregaré algunas imágenes.

*- También en próximas entradas lo explicare para realizarlo desde Window$ con la herramienta Flip de Atmel.

T'T.