Intentando recuperar el bootloader de Arduino Nano

 Buenas,

En este proyecto vamos a intentar recuperar el programa de inicio bootloader defectuoso de un arduino nano  

El bootloader funciona a modo de "sistema operativo" al ser el primer programa que  que ha sido escrito previamente en el microcontrolador de la placa y que nos permite cargar código sin necesidad de hardware adicional. 

Para ello necesitaremos utilizar otro microcontrolador arduino que funciona bien para que funcione como ISP y permita reprogramar el arduino que funciona mal

El bootloader del microcontrolador de un Arduino se programa de fábrica mediante ISP, a través de su header ICSP

Síntomas

Este problema de momento me ha pasado con una placa clónica de china, es la primera vez.
 
Detalles del error al intentar cargar cualquier sketch

 
 
 Al intentar cargar cualquier sketch tarda muchísimo y finalmente da un error relacionado con la placa. Buscando información por internet pude comprobar que se debía efectivamente a un mal funcionamiento del primer programa que arranca el microcontrolador y que permite que le pasemos los sketch.

Pinout y diagrama de conexión

En este proyecto haremos uso de otro arduino nano, para lo cual necesitamos saber la correspondencia de pines

Pinout cortesía de https://forum.arduino.cc/index.php?topic=620640.0

Con esta información podremos intentar recuperar el bootloader siguiendo el siguiente esquema de conexión de los 6 pines que se encuentran en la región física del bootloader del arduino que funciona mal a 6 pines del arduino que funciona bien.

Diagrama de Header ICSP Nano a Nano para ISP


Pero que es Arduino ISP

"The Arduino ISP is an In-System-Programmer that is used to program AVR microcontrollers. You can use the Arduino ISP to upload sketches directly on the AVR-based Arduino boards without the need of the bootloader"

La ISP o Programación en Sistema o Programación Serie en Circuito (ISCP In serial Circuit Programmig) permite que un microcontrolador sea reprogramado mientras está instalado en un sistema a través de un protocolo serie, a diferencia de aquellos sistemas que necesitan ser programados antes de instalarse dentro del sistema.

Haciendo uso de esta habilidad de nuestro microcontrolador hermano que funciona bien y siguiendo el esquema indicado en el apartado anterior procederemos a intentar restaurar el bootloader

Pasos para quemar el bootloader

1. Cargamos el ejemplo Arduino ISP y lo quemamos en nuestro arduino que funciona bien
y conectamos el segundo arduino con ISCP tal y como se detalló en el diagrama de conexión.
2. Herramientas /Procesador /Atmega 328P (Confirmamos que lo tenemos seleccionado)
3. Comprobamos que el puerto COM usb es el correcto
4. En el menú Herramientas / Programador elegimos Arduino as ISP
5. En el menú Herramientas elegimos "Quemar bootloader"
En menos de un minuto si todo va bien tendremos restaurado el bootloader.

Error signature

Si tenemos errores a la hora de quemar el bootloader, esto se deberá a que no se reconoce la placa, que el cableado está mal o que no hemos elegido la placa correcta a la hora de cargar los sketchs. Algunas placas clónica se cargan con el ATMega328P (Old bootloader)

En el primer caso deberemos tocar con cuidado en dos ficheros de configuración para retocar o añadir las característica de la placa clónica que no funciona y volver a probar. 

Las rutas de los ficheros de configuración se muestran a continuación:

avrdude: Expected signature for ATmega328P is 1E 95 0F
         Double check chip, or use -F to override this check.
 C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt

C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\

#------------------------------------------------------------
# ATmega328
#------------------------------------------------------------

part
    id            = "m328";
    desc        = "ATmega328";
    has_debugwire    = yes;
    flash_instr        = 0xB6, 0x01, 0x11;
    eeprom_instr    = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
              0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
              0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode    = 0x86;
    # avr910_devcode    = 0x;
    signature        = 0x1e 0x95 0x14;

The last entry of the signature (line 9038) must be changed from 0x0F to 0x14

O crear una nueva entrada para el tipo de placa


#------------------------------------------------------------
# ATmega328-AU-ND
#------------------------------------------------------------

part
    id              = "m328au";
    desc            = "ATMEGA328-AU-ND";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
             0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode  = 0x86;
    # avr910_devcode = 0x;
    signature       = 0x1e 0x95 0xff;


Es importante disponer del driver adecuado para placas chinas en: http://www.wch.cn/download/CH341SER_ZIP.html

Referencias

  • https://forum.arduino.cc/index.php?topic=620640.0
  • https://www.youtube.com/watch?v=9HAnr___gkI
  • https://en.wikipedia.org/wiki/In-system_programming
  • https://fabacademy.org/archives/2013/students/anderson.douglas/atmega328.html
  • https://forum.arduino.cc/index.php?topic=505382.0
  • https://www.instructables.com/2-Arduino-the-ATMEGA328-As-a-Stand-alone-Easy-Chea/
  • https://forum.arduino.cc/index.php/topic,68889.0.html
  • https://forum.arduino.cc/index.php/topic,68889.0.html