Nuestras placas Arduino UNO tienen dos microcontroladores:
- El Microcontrolado ATMEGA 328P que es el que nosotros programamos, y en el que además de nuestros programas está el Bootloader de Arduino que nos permite reprogramarlo a través de los pines D0 y D1.
- El chip ATMEGA 16U2 o ATMEGA 8U2. Que está programado con un firmware que monta un puerto serie sobre un puerto USB y lo conecta con los pines D0 y D1 de Arduino. En otras palabras permite que nuestro Arduino se pueda comunicar a través del puerto USB como si fuera un puerto serie.
Tanto el Chip ATMEGA 328P como el 16U2 se pueden programar directamente a través de sendos conectores ICSP usando un programador AVR u otro Arduino usado como programador ISP. Para poder conectar el programador correctamente hay que saber donde está el pin 1 (Señal MISO) de los conectores.
En esta imagen, se muestra la estructura de la comunicación entre el USB el ATMEGA 16U2 y el ATMEGA 328P: enlace
Para que nuestro ordenador o cualquier otro dispositivo reconozca a nuestro Arduino, no como un Arduino sino como un teclado, ratón, joystick etc. Hay que reprogramar el chip ATMEGA 16U2 con el firmware propio de ese dispositivo, reemplazando el firmware original de puerto serie sobre USB. La mala noticia, es que al hacer esto nuestro ordenador dejará de reconocer a nuestro Arduino como un Arduino, por lo que no podremos volver a reprogramarlo a través del puerto USB, hay que reprogramarlo usando ICSP mediante un programador (Pololu AVR u otro Arduino como ICSP).
Afortunadamente, la programación ICSP se puede hacer también desde el Arduino IDE, sólo que para cargar el programa hay que elegir primero el tipo de programador que vamos a usar en el menú: Herramientas-> Programador (Atmel STK 500 para el AVR, o Arduino ISP cuando usemos otro Arduino). Una vez elegido el programador (y por supuesto la placa, como siempre, Arduino/Genuino UNO) cargamos el programa desde el menú: Programa->Subir usando programador (Ctrl + Shift + U).
Hay que mencionar que para que se pueda programar un Arduino con ICSP, éste tiene que estar correctamente alimentado (Led verde ON, encendido). Cuando uso el programador AVR, tengo que alimentar el Arduino con una pila de 9V, ya que el programador no proporciona dicha alimentación. En el caso de usar Arduino como ICSP, el Arduino que hace de programador tiene que alimentar al programado a través del pin de 5V y masa.
Para reprogramar el ATMEGA 16U2 se pueden usar gran variedad de programas, el más común, y el que siempre funciona, es avrdude, que es el que se usa en el Arduino IDE (por debajo) para reprogramar los sketches y los bootloaders.
En mi opinión, lo mejor es usar el Arduino IDE (que a su vez usa el avrdude). La ventaja de este método es que se puede definir una nueva placa (Arduino/hardware/custom/avr/boards.txt) para tener un perfil completo de reprogramación reutilizable, sin tener que usar parámetros en línea de comandos cada vez que queremos reprogramar el chip, lo que siempre es engorroso, y nos permite hacer todo el proceso con el el Arduino IDE. Una ventaja más, es que no necesitamos un programador AVR, en su lugar podemos usar un segundo Arduino que tengamos por casa como ISP. Este procedimiento sirve igualmente para Linux, Windows o Mac. Este método se describe en detalle en el Instructable de dmjlambert: enlace
Hay mucha literatura en Internet sobre como usar el programa dfu_programmer (también dfu-programmer) para poder actualizar el firmware del chip ATMEGA 16U2 o 8U2. Yo no he conseguido hacerlo funcionar aún. Para reprogramar el chip, primero hay que ponerlo en modo DFU. NO en todos los sitios se coincide en la forma de hacerlo. En algunos sitios he leído que solo la versión 0.5.5 de dfu_programmer es válida para esto.
En cualquier caso necesitamos tener a mano los firmwares a programar en el ATMEGA 16U2:
-USB serial firmware (permite volver a reprogramar nuestro Arduino con el Arduino IDE): Arduino-usbserial-uno.hex enlace
-USB Keyboard firmware (permite usar nuestro Arduino como teclado): Arduino-keyboard-0.3.hex enlace
-USB Joystick firmware (permite usar nuestro arduino como un joystick): Arduino-joystick.hex enlace
Hay muchos otros firmwares que se pueden descargar de aquí: enlace
Referencias:
Updating the Atmega8U2 and 16U2 on an Uno or Mega2560 using dfu-programmer (muy sencillo, pero no he conseguido que funcione): enlace
Arduino Uno R3 as HID: enlace
Ivan Mendoza, Arduino UNO como HUID: enlace
How to restore Arduino Uno R3 16U2 firmware usando otro Arduino como ISP: enlace
El mejor, la página web y el github de Nick Gammon Usa un arduino Uno con unos sketches especiales que el ha hecho para
programar por ISP el chip 328P, el 16U2, 8U2 y otros muchos de un segundo Arduino. Usa comandos del serial monitor, muy rápido y limpio. Nota No se menciona
en ninguna parte de la página: Para que los skecthed funcionen bien, la velocidad del serial monitor tiene que ser de 115200 baudios: enlace
Proyecto GitHub de harlequim-tech en el que hay bastantes firmwares para el Atmet16U2 y 8U2. Todos con su make para compilar, construir y
cargar en el micro usando el programador ISP para programar microcontroladores AVR: enlace
Códigos para las teclas del teclado en la página 53 de este documento: enlace or here