Bootloader en Arduino

¿Has escuchado acerca del bootloader en una placa programable con Arduino?

El bootloader es una pieza esencial para muchos microcontroladores en el desarrollo de proyectos con Arduino, ya que le da esa versatilidad y rapidez de la que gozamos los makers a la hora de programar nuestras tarjetas desde el IDE oficial, basta con unos segundos después de que tu programa compile para que empiece la transferencia y tengas tu programa ejecutándose.

IDE de Arduino, versión 1.8.9

Un microcontrolador AVR se programa a través de una serie de pines por los que se envía el programa en sí después de ser compilado, a través de un protocolo llamado AVR ISP (In-System Programming), se utilizan tres pines principales para programar, así como algunos para alimentar el microcontrolador, MISO, MOSI y SCK para programar y VCC, RESET y GND para alimentar.

Para que una computadora pueda programar a través de este método se utiliza un programador compatible con AVR ISP y un pequeño programa llamado AVR DUDE (AVR Downloader/UploaDEr) que se encarga de monitorear, comunicarse con el programador e iniciar la transferencia del programa.

Programador AVR ISP MKII utilizado ámpliamente para programar AVRs, imagen por Lab401

Circuito minimalista para programar un AVR a través de ISP, imágen por Kanda

El bootloader del microcontrolador de un Arduino se programa de fábrica mediante AVR ISP, a través de su header ICSP (lo marcamos en naranja).

¿Pero que hay del bootloader?

Consiste en una pequeña porción de código programado de fábrica (en el caso de las placas Arduino) en las últimas direcciones de memoria para ejecutarse cuando el microcontrolador es energizado o cuando es reseteado, ya sea por el botón RESET o mediante una técnica de software (el IDE de Arduino abre y cierra el puerto serial en un lapso corto de tiempo).

El bootloader nos ayuda a evitarnos todo el rollo de adquirir un programador por separado y conectar al header ISP de nuestro Arduino cable por cable, lo único que hay que hacer es conectar nuestro Arduino, seleccionar el puerto COM apropiado y presionar el botón para programar.

En muchas de las placas Arduino viene implementado un convertidor USB a serial, este se encarga de resetear por software el microcontrolador cada vez que queremos subir un programa, así entra el bootloader y este permite que subamos nuestro código a la memoria del programa pero a través de comunicación serial, no SPI.

El bootloader está diseñado para no borrarse como lo hacen los códigos de Arduino cada vez que subes algo nuevo, si reseteas tu microcontrolador y el bootloader detecta que no se tiene intención de subir un código nuevo simplemente continúa con el que ya esté guardado, en el caso de muchas placas Arduino conocidas, cada vez que entra el bootloader, el LED incluído parpadea dos veces o «palpita» en el caso del Arduino Leonardo.

En el siguiente mapa de memoria puedes ver dónde se encuentra el bootloader; «Boot Flash Section».

Mapa de memoria de un ATmega 328, incluído en el Arduino UNO R3, imagen por Arduino

Muchas veces el bootloader es llamado de manera incorrecta como el «firmware» del microcontrolador, cuando realmente lo que se podría interpretar de esa manera es cualquier programa que tu subas a la memoria.

Desafortunadamente tiene una desventaja de la que nos gustaría contarte, el bootloader usa el mismo bloque que la memoria del programa, por lo que dependiendo de tu placa, el espacio disponible es menor ya que puede ocupar hasta 2KB. En un microcontrolador de 32KB de memoria solo te quedarían 30KB para tus proyectos, a pesar de esto en muchas ocasiones esto no es una gran tragedia, ya que a cambio tenemos esa gran versatilidad y velocidad que el bootloader ofrece.

Aprende a «quemar» el bootloader en una tarjeta Arduino

Algunas veces, es posible que se corrompa la sección de memoria que guarda el bootloader en tu Arduino y lo haga imposible de programar, tal vez tienes algún Arduino por ahí que tiene una falla inexplicable, podrías intentar arreglarlo «quemando» o grabando el bootloader de nuevo.

Este proceso se realiza a través de un programador ISP, pero ¡tenemos buenas noticias! un Arduino también puede ser utilizado como programador ISP, así que basta con tener otro Arduino funcional para usarlo como programador.

En el IDE de Arduino busca en el menú Archivo -> Ejemplos -> ArduinoISP, abre y sube ese programa al Arduino «programador».

Conecta los pines MOSI, MISO y SCK de ambas placas en paralelo, el pin 10 (Arduino UNO) al pin RESET así como la alimentación correspondiente y luego ve al menú de herramientas -> Programador y selecciona «Arduino as ISP».

Arduino tiene una tabla con la cual puedes conectar tu Arduino programador al Arduino al que se le quemará el bootloader:

En el caso de los Arduino UNO, los pines MOSI, MISO y SCK corresponden con los pines 11, 12 y 13, así que es muy sencillo conectarlos, encontramos esta imagen que te podría ayudar, igual puedes consultar la tabla de más arriba en el caso de que tengas algún otro modelo.

No olvides conectar el pin 10 del Arduino programador al pin reset del Arduino a programar.

Luego deberás seleccionar exactamente la placa a la que se va a programar el bootloader en el menú Herramientas -> Placa -> «Arduino a programar», en este caso seleccionamos el Arduino/Genuino UNO.

Está todo listo, ahora selecciona en el menú Herramientas -> Quemar Bootloader y al paso de unos cuantos segundos tendrás el bootloader quemado en la placa, ¡como nuevo!

Pon atención a los posibles errores que puedan surgir, el más común es que no se cableó de manera adecuada los pines de programación, que las placas no compartan la misma alimentación y/o referencias (conexiones iguales y a la misma tierra) o en el peor de los casos, si ya estás seguro de que todas las conexiones están conectadas de manera correcta puede ser simplemente que el microcontrolador que intentas quemar haya sufrido anteriormente de daños irreversibles, de cualquier forma puedes dejar un comentario y podemos ayudarte.

Ya sabes que es el bootloader… ¡A quemar microcontroladores!

Comentarios