Arduino sin bootloader

El el siguiente instructivo hablaremos sobre temas relacionados con el concepto de llevar a Arduino al siguiente nivel: producción. Arduino es un proyecto destinado a un mercado de código abierto, comunitario, donde “compartir” es parte de la esencia del proyecto. Pero no es raro saber de proyectos que luego comenzar sobre Arduino desean pasar al siguiente nivel, producción. Sea que utilicen placas Arduino (o compatibles) o pasen directamente a producir sus propias placas, hay conceptos nuevos que deberán explorar, y hoy veremos algunos de ellos.

Programar un Arduino sin bootloader

Lo que hace especial a Arduino no es su microcontrolador, ni su placa electrónica, sino el concepto de su facilidad de integración con una computadora y su fácil programación. Esto último se basa en el concepto de un bootloader que es un pequeño programa que todos los Arduinos comparten y que nos permiten subir nuestros programas a la placa Arduino de manera sencilla, una y otra vez, y solo con un cable USB.

Sin embargo, lo anterior presenta varias limitaciones con las que debemos vivir o hacer algo al respecto. Primero, el bootloader (el programa que nos permite cargar Sketch de manera sencilla en nuestro Arduino) ocupa lugar, y sigue ahi, permitiendo cargar un nuevo programa. Segundo, los programas cargados en un Arduino de la manera tradicional, se pueden descargar y copiar. Tercero, los programas descargados, pueden someterse a una Ingeniería inversa para saber qué hacen y copiar las ideas/conceptos.

Existen en el mercado un gran oferta de programadores de microcontroladores profesionales que podrían hacer muchas de las cosas que explicaremos aquí, pero como la audiencia de nuestra página es orientada al hobby, lo haremos a nuestra manera, con un Arduino. En nuestro caso, usaremos un Arduino UNO como “Programador” para programar otros Arduinos.

El Programador

El Programador será un Arduino UNO al que dedicaremos a esta función para este instructivo. Lo único que debemos hacer para preparar nuestro Arduino UNO como Programador es cargarle un Sketch específico de nombre ArduinoISP el cual encontrará dentro de los ejemplos que Arduino IDE trae como parte de su instalación. Encontrará este Sketch accediendo al menu en Archivo > Ejemplos > ArduinoISP (en mi caso dice 11. ArduinoISP).

ArduinoISP

Simplemente cargue el Sketch en su Arduino, y ya estará listo para usarlo como programador. Si lo desea, marque su Arduino UNO Programador de manera de no confundirlo con otros Arduinos (en especial si programará otros Arduinos UNO del mismo tipo que el usado para programar).

Conectando el Arduino destino

Para poder programar un Arduino debemos saber como conectar el Programador al Arduino destino. El Arduino destino será la placa que queremos programar. La conexión es sencilla, y simplemente deberá conectarlas de la siguiente manera:

 Programador Arduino UNODestino Arduino UNO
MOSI1111
MISO1212
SCK1313
RESET10Reset
5V5V5V
GNDGNDGND

Su conexión deberá quedar como la siguiente imagen:

Conexion Arduino UNO como ISP programando otro Arduino UNO

Observe que si en lugar de programar un Arduino UNO, quisiera programar un Arduino Nano, solo deberá adaptar las conexiones anteriores a los pines del Nano. Otros Arduinos (como el Mega 2560) poseen distintas configuraciones de pines, por lo que recomendamos revisar la documentación del microcontrolador a programar antes de trabajar con ellos.

Observación: si se dispone a programar un Arduino de 3,3v, tenga cuidado con las tensiones. No puede conectarlo como en el diagrama ya que las tensiones del Programador son de 5v y terminará dañando el Arduino destino cuyas tensiones son de 3,3v. Arduino.cc recomienda alimentar en ese caso al Programador con 3,3v en lugar de 5v.

Programando

Para comenzar a programar hay una cosa más que deberá hacer, pero veámoslo con un caso práctico. Programaremos el Sketch de Ejemplo que trae Arduino IDE de led parpadeante (Blink). Para ello buscaremos el Sketch mencionado en el menu de Arduino IDE en Archivo > Ejemplos > Basics (o 01.Basics) > Blink.

Luego iremos nuevamente al menu y cambiaremos una configuración de nuestro Arduino IDE que le dice qué programador usar. Como programaremos de manera diferente (sin usar el bootloader), debemos cambiar el programador accediendo al menu de Arduino IDE en Herramientas > Programador y elegimos la opción “Arduino as ISP”.

Arduino IDE - Programador como Arduino as ISP

Y luego de configurar el Programador, podemos subir nuestro programa al Arduino destino, solo que esta vez no lo haremos como de costumbre. En su lugar, para subir el Sketch (una vez que lo tenga abierto y listo para subirlo), lo subiremos con la opción para . Encontrará esta opción en el menu del Arduino IDE en Programa > Subir Usando Programador. Luego de lo cual su Arduino destino tendrá el Sketch instalado.

Observación: Cuando cambie el Programador recuerde que luego deberá volverlo a su valor inicial para poder continuar programando Sketch de la manera tradicional. Si no lo hiciera, le dará error al intentar programar un Arduino con el Programador equivocado.

Cargando un bootloader en un Arduino

Luego de probar lo anterior, le sugiero intente subir un Sketch cualquiera al Arduino UNO (o el que haya usado) de la manera tradicional. Si todo salió bien, el Sketch no subirá. La razón es que su Arduino no posee más el bootloader que es el programa básico que todo Arduino tiene para facilitar la carga de programas al microcontrolador.

Para solucionar lo anterior, prepare un Arduino como Programador como explicamos arriba (en mi caso un Arduino UNO), y conecte el Arduino al que desea cargarle el bootloader también siguiendo las instrucciones de arriba. Luego de seleccionar el Programador “Arduino as ISP”, deberá usar la opción del menu de Arduino IDE Herramientas > Quemar Bootloader.

Arduino IDE - Quemar Bootleader

Luces de monitoreo para el Programador

Convertir un Arduino en Programador es una herramientas muy útil y a veces una a la que le damos mucho uso. Para esos casos, usted puede conectarle 3 leds de monitoreo a su Arduino UNO para saber cómo resultan las operaciones de carga. No son necesarias pero pueden ser un primer monitoreo rápido si van a grabar muchos Arduinos. Las conexiones especificadas por la página oficial de Arduino son:

ArduinoISP - leds de monitoreo

El led de actividad marca que el Programador está funcionando. El de error obviamente si ocurrió algún error grabando. Y el led de programando marca comunicación entre el Programador y la placa destino.

Leyendo y copiando un Sketch

Algunas personas no saben pero el bootloader es bidireccional. Esto significa que sirve tanto para escribir (grabar un nuevo Sketch) como para leer (leer un Sketch subido), lo que usualmente Arduino IDE hace automáticamente cuando subimos un Sketch para verificar que el programa subió bien.

Arduino IDE hace todo lo anterior mediante un programa llamado avrdude el cual podemos usar para hacer otras cosas interesantes como veremos. avrdude es un programa de línea de comandos que sirve para interactuar con microcontroladores Atmel. Posee varios parámetros (no los veremos todos) para configurar cosas como puerto de comunicación, programador, chip a leer/escribir, velocidad de comunicación, etc.

Algunos de los parámetros de avrdude que veremos son:

-c [programador] – Acá se indica cual es el programador que usará, para nosotros será “arduino” o “stk500v1
-P [puerto] – Se especifica cual es el puerto al que está conectado nuestro programador. Ejemplo: com5
-p [chip] – Este parámetro indica cual es el chip (microcontrolador) que programaremos. En un Arduino UNO sería “m328p” o “ATMEGA328P
-b [velocidad] – Junto con el puerto, se puede especificar cuál será la velocidad de comunicación en baudios. Ejemplo: 19200
-C [configuración] – Con éste parámetro especificamos el archivo de configuración que usaremos
-U [operación] – Es el último de los parámetros que veremos y no podemos explicarlo en detalle pero con él especificaremos el tipo de operación a realizar y sobre qué tipo de memoria (ejemplo eeprom, flash, fusibles, etc.)

Para mayor referencia sugerimos ver el manual de avrdude: https://www.cs.ou.edu/~fagg/classes/general/atmel/avrdude.pdf

Leer y descargar un programa

Copiar un programa cargado en un Arduino no es una tarea compleja, pero requiere varios pasos ya que las distintas “memorias” que tiene el microcontrolador de una placa Arduino debe leerse por separado. Esto se puede lograr con avrdude y las distintas memorias se especifican con el parámetro -U.

El Sketch que alguna vez compilamos y subimos es convertido (durante la compilación) en código ejecutable o ensamblador. Cuando leemos (y descargamos) un programa desde un microcontrolador de una placa Arduino, solo podemos bajar el código resultante, es decir, el código en ensamblador. No cubriremos hoy nada respecto a desensamblar el código ni mucho menos a lo que sería Ingeniería inversa que sería comprender un programa que no hicimos nosotros, pero sepa que un Arduino programado de la manera tradicional puede ser leído, y eventualmente, copiado o comprendido (no sin mucho esfuerzo).

Antes de ver el comando que usaremos para leer un programa de un Arduino UNO (el que usaremos como ejemplo), deberemos comprobar cual es el path o ubicación en nuestra computadora del programa avrdude y de su archivo de configuración. Por ejemplo en mi computadora con Windows 10 los mismos se encuentran en:

avrdude – C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
configuración – C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf

Con lo anterior en mente (usted deberá usar las ubicaciones de su computadora obviamente) para leer un programa de un Arduino UNO (microcontrolador ATmega328p) el comando sería:

avrdude -C avrdude.conf -P com12 -b 19200 -p m328p -c arduino -U flash:r:backup_flash.bin:r

El comando anterior asume que su programador está conectado al puerto com12. Que usa un Arduino como programador (en mi caso un Arduino UNO como enseñamos más arriba). Que la placa a leer es también un Arduino UNO. No especifica ubicación ni para el programa avrdude ni para su archivo de configuración ya que los tengo a ambos copiados en un mismo directorio desde donde estoy ejecutando el comando. Y finalmente, el programa leído se grabará en el archivo local (en misma ubicación) con el nombre backup_flash.bin.

El comando anterior solo leerá y descargará el programa alojado en memoria flash. No leerá ni descargará nada de la memoria eeprom, ni las configuraciones de fusibles, ni la firma del microcontrolador lo que se puede hacer pero escapa al objetivo del presente instructivo.

Grabar un programa leido con avrdude

Para grabar un programa previamente leído con avrdude, el comando a ejecutar es similar. Siguiendo con el ejemplo anterior, para grabar el programa en otro Arduino UNO diferente, el comando sería:

avrdude -C avrdude.conf -P com12 -b 19200 -p m328p -c arduino -U flash:w:backup_flash.bin

Lo interesante de la operación anterior es que se puede grabar el programa sin necesidad de contar con el Sketch. Esto no parece muy útil para nuestros propios proyectos a menos que lo complementemos con algo de seguridad.

Protegiendo nuestros Sketches

Todos soñamos con ese Sketch que hace eso increíble y que nos hará ricos. Pero, ¿cómo proteger un Arduino al que le subimos nuestro Sketch para que no nos copien el programa? Como vimos antes, copiar un programa de un Arduino es simple si no está protegido. No se necesita el Sketch original, y alguien con acceso a un Arduino con el programa cargado podría copiar el programa infinitas veces en otros Arduinos.

Sin embargo, existe una manera de proteger nuestro Sketch una vez subido a nuestro Arduino. Lo primero que deberemos hacer es subir nuestro Sketch sin bootloader, y con ello ya no se podrá subir otros programas de la manera tradicional.

Lo segundo que podemos hacer es bajar 2 fusibles de configuración de nuestro Arduino que impiden que sea leído y/o escrito nuevamente. Estos fusibles pueden bajarse con avrdude pero no pueden subirse con él, lo que lo hace ideal como protección de seguridad. Siguiendo todos los pasos anteriores, usando un Arduino UNO como programador, y para proteger un Arduino UNO usaremos el siguiente comando:

avrdude -C avrdude.conf -P com12 -b 19200 -p m328p -c arduino -U lock:w:0xFC:m

Advertencia: una vez bajados los fusibles de un microcontrolador Atmel no podrá volver a leerlo, ni a escribir en él. El chip seguirá funcionando pero con el programa cargado. Se sugiere solo proteger sus Arduino cuando se dedicarán definitivamente a producción.

Observación: existe una manera de volver un Arduino asegurado a su configuración de fábrica. Esto es posible siempre y cuando se den algunas condiciones: el chip deberá poder extraerse. Se deberá contar con un programador profesional que maneje voltajes altos de programación como el siguiente: https://www.amazon.com/dp/B00K73TSLM/?coliid=I9R6QEIIY2KC4&colid=3N0NCUVHJ3NPS&psc=0&ref_=lv_ov_lig_dp_it. De todas maneras, luego de una operación de inicialización, el micro quedará completamente borrado (no se podrá acceder a nada de la configuración y programas anteriores).

Curiosidades

Finalmente quería dejarles un Shield (entre muchos disponibles) que simplifica el trabajo cuando debemos programar el microcontrolador ATmega328p solo en su formato DIP 28 o mediante interface ICSP que posee todo integrado ya: https://www.amazon.com/AVOLUTION-Burning-Bootloader-Programmer-Arduino/dp/B07FM55QYH/ref=sr_1_12?ie=UTF8&qid=1533173725&sr=8-12

Un comentario en “Arduino sin bootloader”

Deja un comentario