Вы находитесь на странице: 1из 10

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).

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 UNO Destino Arduino UNO

MOSI 11 11

MISO 12 12

SCK 13 13

RESET 10 Reset

5V 5V 5V

GND GND GND


Su conexión deberá quedar como la siguiente imagen:
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”.

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.

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:

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: httpss://www.cs.ou.edu/~fagg/classes/general/atmel/avrdude.pd
f
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: httpss://www.amazon.com/dp/B00K73TSLM/?coliid=I9R6QEIIY
2KC4&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: httpss://www.amazon.com/AVOLUTION-
Burning-Bootloader-Programmer-
Arduino/dp/B07FM55QYH/ref=sr_1_12?ie=UTF8&qid=1533173725&sr=8
-12

Вам также может понравиться