🛠 Réparer une UNO muette : 16U2, DFU et programmation ICSP
Objetivos
Recuperar el control de tu placa cuando la carga del programa falla: comprender los dos procesadores del UNO (el ATmega328P de aplicación con su bootloader STK500/Optiboot, y el ATmega16U2 que actúa como puente USB-serie y posee su propio bootloader DFU), saber restablecer uno u otro, y saltarse el bootloader mediante ICSP.
Material
- 1 Arduino UNO R3 «muerta» (puerto USB invisible, o carga que da timeout)
- 1 segundo Arduino (UNO/otro) como programador ISP + 6 cables Dupont, o un programador USBasp/AVRISP
- Arduino IDE con arduino-core AVR, o arduino-cli + avrdude en línea de comandos
- En las antiguas R1/R2: el chip es un ATmega8U2, procedimiento DFU diferente — verifica la referencia marcada en el chip.
Código completo
- Diagnóstico — ¿está vivo el 328P? ¿Se ejecuta un sketch ya cargado? (LED parpadeante = bootloader OK, problema del lado del puerto/IDE). 2) Programación ICSP con un segundo UNO como ISP:
Câblage ISP (UNO programmateur -> UNO cible), broches identiques broche à broche :
1 (MOSI) -> 1 (MOSI) 2 (VCC 5V) -> 2 (VCC)
3 (GND) -> 3 (GND) 4 (MISO) -> 4 (MISO)
5 (SCK) -> 5 (SCK) 6 (RESET) -> 6 (RESET)
# Avec arduino-cli (une fois la carte cible « Arduino Uno » sélectionnée) :
arduino-cli core install arduino:avr
arduino-cli program --protocol arduino --board arduino:avr:uno firmware.hex
# Bootloader : « Graver la séquence d'initialisation » dans l'IDE, ou :
arduino-cli burn-bootloader -b arduino:avr:uno -p /dev/ttyACM0 # via ISP d'une carte ISP
# Si le port USB a disparu (16U2 bloqué par un reflash raté) :
# court-circuiter les deux broches du jump « RESET-ATMEGA16U2 » (à côté de la puce),
# brancher l'USB, puis flasher le firmware USB via DFU :
dfu-programmer atmega16u2 erase
dfu-programmer atmega16u2 flash atmega16u2-mk3-arduino-1.0.1.hex
dfu-programmer atmega16u2 reset
Verificación esperada
Tras grabar el bootloader por ICSP: el 328P vuelve a parpadear su bootloader (LED L a ritmo rápido al arrancar) y la carga por USB vuelve a funcionar. Tras regrabar el 16U2 por DFU: el puerto serie reaparece en el administrador de dispositivos. La prueba final: cargar Blink, luego desconectar/reconectar — el LED vuelve a funcionar solo.
Errores frecuentes
- Confundir los dos chips: un puerto USB que desaparece = 16U2 (DFU); un timeout de carga mientras el puerto existe = 328P (bootloader, a grabar por ICSP).
- Regrabar el 16U2 en DFU y equivocarse de firmware (mk2 vs mk3, o 8U2 en una R3): el puerto permanece invisible hasta el siguiente DFU exitoso — de ahí los jumpers de reset del 16U2, que no se deben confundir con el reset del 328P.
- Olvidar alimentar la placa objetivo en ISP (pin 2 VCC): avrdude responde «target not responding».
- Los clones: regulador y chip USB diferentes, los firmwares oficiales de Arduino no se aplican — busca el firmware del fabricante del clon.
- Alimentación por jack a 20 V durante la operación: el regulador lineal se calienta, y VIN NO tiene NINGUNA protección contra la inversión de polaridad — nunca inyectes potencia por VIN sin un diodo externo.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino