Introduction: Extracting the Arduino´s Soul / Extrayendo El Alma De Arduino / Arduino Bootloader

Picture of Extracting the Arduino´s Soul / Extrayendo El Alma De Arduino / Arduino Bootloader

Sí, sé que es un poco exagerado el título, sin embargo, al bootloader que contienen los microcontroladores de las placas Arduino me gusta llamarlo de esa manera, explicare el por qué a continuación y se explicara como cargar este bootloader a un microcontrolador.

Materiales

  • 1 Tarjeta Arduino UNO
  • 1 Tarjeta de programación de bootloader (descarga aquí los diagramas), más abajo se explica cómo construirla.
  • Cables de conexión
  • IDE Arduino
  • 1 microcontrolador ATMEGA328P (puede ser encapsulado PDIP o SMD)
  • 1 cristal de 16 MHz

Step 1: Arduino

Picture of Arduino

Como todos sabemos, Arduino es una plataforma de desarrollo que está basada en una placa o tarjeta (PCB) con un microcontrolador, como elemento principal (hardware) y un entorno de desarrollo IDE, con su lenguaje de programación (software).

Para saber más, puede consultar la página oficial de Arduino, comenzando por su guía de introducción

En los microcontroladores que vienen incluidos en la placa Arduino NO podemos usar toda la capacidad de la memoria Flash porque existen 512 bytes (aprox.) ocupados por un código pre-programado de fábrica (el llamado “bootloader” o “gestor de arranque“), el cual nos permite usar la placa Arduino de una forma sencilla y cómoda sin tener que conocer las interioridades electrónicas más avanzadas del microcontrolador. Los ATMEGA328P que podamos adquirir individualmente normalmente no incluyen de fábrica éste pequeño programa, por lo que sí ofrecen los 32KB de la memoria flash de programa íntegros, pero a cambio no podemos esperar conectarlos a una placa Arduino y que funcionen ya que les faltará tener grabada esa “pre-configuración”.

Step 2: Un Poco De Teoría… Bootloader (gestor De Arranque)

Picture of Un Poco De Teoría… Bootloader (gestor De Arranque)

Como se mencionó anteriormente, dentro de la memoria de programa Flash del microcontrolador incluido en las placas Arduino viene pregrabado un pequeño programa llamado “bootloader” o “gestor de arranque” que resulta imprescindible para un cómodo y fácil manejo de la placa en cuestión. Este software (también llamado “firmware”, porque es un tipo de software que raramente se modifica) ocupa, en la placa Arduino UNO, 512 bytes de espacio en un apartado o sección especial de la memoria Flash, el llamado “bootloader block”, pero en otros modelos de placas Arduino puede ocupar más (por ejemplo en el Arduino Leonardo ocupa 4 Kilobytes).

La función de este firmware es gestionar de forma automática el proceso de grabación en la memoria flash del programa que queremos que el microcontrolador ejecute. Lógicamente, el bootloader realizara esta grabación más allá del “bootloader block” para no sobrescribirse a sí mismo.

Más concretamente, el bootloader se encarga de recibir nuestro programa de parte del entorno de desarrollo Arduino (normalmente mediante una transmisión realizada a través de conexión USB desde la computadora donde se está ejecutando dicho entorno hasta la placa) para proceder seguidamente a su correcto almacenamiento en la memoria flash del microcontrolador. Una vez realizado el proceso de grabación, el bootloader termina su ejecución y el microcontrolador dispone a procesar de inmediato y de forma permanente (mientras este encendido) las instrucciones recientemente grabadas.

En la placa Arduino UNO, el bootloader siempre se ejecuta durante el primer segundo de cada reinicio. Durante estos instantes, el gestor de arranque se espera a recibir una serie de instrucciones concretas de parte del entorno de desarrollo para interpretarlas y así realizar la correspondiente carga de un posible programa. Si esas instrucciones no llegan pasado ese tiempo, el bootloader termina su ejecución e igualmente se empieza a procesar lo que haya en ese momento en la memoria flash.

Estas instrucciones internas de programación de memorias Flash son ligeramente diferentes según el tipo de bootloader que tenga la placa, pero casi todas son variantes del conjunto de instrucciones ofrecido oficialmente por Atmel para la programación de sus microcontroladores, el llamado protocolo STK500 (http://www.atmel.com/tools/STK500.aspx). Un ejemplo es el bootloader que tiene pregrabado el ATMEGA238P del Arduino UNO, basado en un firmware libre llamado Optiboot (http://code.google.com/p/optiboot), el cual logra una velocidad de grabación de 115 kilobits de programa a cargar por segundo gracias al uso de instrucciones propias derivadas del “estándar” STK500. Otro ejemplo de bootloader derivado del protocolo STK500 es el bootloader “wiring”, grabado de fábrica en el microcontrolador de la placa Arduino Mega. El bootloader que viene en la placa Leonardo (llamado “Caterina”) es diferente, ya que entiende otro conjunto de instrucciones independiente llamado AVR109 (también oficial de Atmel). Toda esta información se puede obtener consultando el contenido del fichero llamado “boards.txt”, descargado junto con el entorno de desarrollo Arduino.

Si adquirimos un microcontrolador ATMEGA328P hay que tener en cuenta que no dispondrá del bootloader, por lo que deberemos incorporarle uno nosotros “a mano” para hacer uso de él a partir de entonces, o bien no utilizar nunca ningún bootloader y cargar entonces siempre nuestros programas en la memoria flash directamente. En ambos casos, el procedimiento requiere el uso de un aparato especifico (en concreto, un “programador ISP” –In System Programmer–) que debemos adquirir aparte. Este aparato de ha de conectar por un lado a nuestro computador y por otro a la placa Arduino, y suple la ausencia de bootloader haciendo de intermediario a nuestro entorno de desarrollo y la memoria flash del microcontrolador. Por lo tanto, podemos resumir diciendo que el gestor de arranque es el elemento que permite programar nuestro Arduino directamente con un cable USB y nada más.

Por conveniencia, dentro del paquete instalador del entorno de desarrollo de Arduino (descargable se su web oficial) se distribuyen además copias exactas bit a bit de los bootloaders oficiales que vienen grabados en los diferentes microcontroladores Arduino. Estas copias exactas son ficheros con extensión “.hex” que tienen un formato interno llamado “Intel Hex Format”. Para el uso normal de nuestra placa no necesitamos para nada estos ficheros “.hex”, pero si dispusiéramos de un programador ISP y en algún momento tuviéramos que “reponer” un bootloader dañado (o bien grabar un bootloader a algún microcontrolador que no tuviera ninguno), Arduino nos ofrece estos ficheros para cargarlos en la memoria flash de nuestro microcontrolador siempre que queramos.

El formato Intel Hex Format es el utilizado por todos los chips AVR para almacenar contenido en sus memorias Flash, por lo que hay que aclarar que no solamente los bootloaders son alojados internamente de esta forma en la memoria Flash, si no que todos nuestros propios programas que escribamos en el entorno de desarrollo también serán alojados allí en formato “.hex”.

Evidentemente, los bootloaders Arduino también son software libre, por lo que al igual que ocurre con el entorno de programación Arduino, siempre tendremos disponible su código fuente (escrito en leguaje C) para poder conocer cómo funciona internamente e incluso para poderlo modificar, si así se estima oportuno.

Step 3: Fuera De La Placa Arduino

Si bien la placa Arduino nos ofrece un gran número de entradas y salidas con conectores para una cómoda, rápida y fácil conexión y desconexión hacia el protoboard con nuestro circuito a controlar, o bien a algún otro circuito impreso, nos deja un poco limitados cuando requerimos de un diseño en específico de nuestro circuito, ya sea en protoboard o en un PCB.

Para esto, Arduino nos ofrece una alternativa, que es usar la placa Arduino como un ISP (In-System Program) para que podamos programar el bootloader o gestor de arranque en un microcontrolador que no contiene éste programa tan importante. La información la podemos consultar en los siguientes links:

Tutorial ArduinoISP

Arduino To Breadboard

Standalone

Ahora, con base en la información proporcionada en los links anteriores, se desarrollara una pequeña placa con la cual se pueda extraer o programar el bootloader en un microcontrolador ATMEGA328P y una vez cargado éste, cargar al microcontrolador cualquier programa desarrollado desde el IDE de Arduino.

Con esto se podrá disponer del microcontrolador para usarlo en algún diseño específico de PCB o protoboard en el cual podamos prescindir de toda la placa Arduino.

Step 4: Diagrama Esquemático

Picture of Diagrama Esquemático

Como primer paso se desarrolló un diagrama esquemático el cual contiene las conexiones necesarias para que el microcontrolador sea programado por medio de la placa Arduino dispuesta como ISP, es decir, el conector 1 (CONN1) en el circuito contiene las conexiones necesarias (VCC, GND, RESET, MISO, MOSI, SCK) hacia el microcontrolador a programar. También dispone de su conexión hacia el cristal oscilador (X1), el conector 2 (CONN2) corresponde a las señales RX y TX que son necesarias para cargar el programa desde el IDE de Arduino una vez cargado el bootloader, el conector 3 (CONN3) sirve para conectar y desconectar la resistencia de la señal RESET, más adelante se explicará su funcionamiento, finalmente se agregó un LED para ejecutar pequeños programas de prueba y corroborar el correcto funcionamiento del microcontrolador.

Step 5: Haciendo El PCB

Picture of Haciendo El PCB

En la mayoría de los programas que existen para el diseño y desarrollo de PCBs (Eagle, Proteus, Altium, PCBWizard etc…) primeramente tenemos que tener nuestro diagrama esquemático (el cual se describió en la sección anterior), partiendo de éste se hace el diseño del PCB, en este caso, por el diseño de los componentes (SMD y Thru Hole) la placa se diseñó en doble cara. (Ver tutorial PCB doble cara).

Una vez que fabricamos nuestra tarjeta, soldamos los pines y componentes necesarios:

  • 1 resistencia de 10 kOhms
  • 1 resistencia de 220 Ohms
  • 1 LED
  • 1 base para circuito integrado de 28 patitas
  • Tira de pines macho
  • Tira de pines hembra
  • 2 Capacitores de 22pF

Descripción de la tarjeta

En la tarjeta se puede observar:

  • Una base para circuito integrado en este caso, es para montar el microcontrolador ATMEGA328P en encapsulado PDIP y cargarle el bootloader.
  • Las pistas disponibles (sin soldadura y sin soldar el circuito) para montar o sobreponer el microcontrolador ATMEGA328P en encapsulado SMD para cargarle el bootloader
  • Un LED con su resistencia para ejecutar pequeños programas de prueba
  • Una resistencia de 10KOhms para el reset
  • Un par de pines con su conector “jumper” para conectar y desconectar la resistencia de reset según nos convenga
  • 6 pines para la conexión ISP
  • Un par de pines para la conexión de las señales RX y TX
  • Un conector hembra para montar y desmontar el cristal según nuestras conveniencias. Ya que también es posible cargar el bootloader del Arduino para que funcione con su oscilador interno
  • 2 Capacitores de 22 pF (en este caso no contaba con capacitores :( pero usted no olvide ponérselos)

Step 6: Programando Nuestro Arduino Como ISP (In-System Programer)

Picture of Programando Nuestro Arduino Como ISP (In-System Programer)

Ahora se tiene que preparar a la tarjeta Aduino UNO para que pueda actuar como programador, para esto se le carga un programa “ArduinoISP” el cual se encuentra en la sección de ejemplos.

Step 7: Conexiones

Picture of Conexiones

Una vez preparada la tarjeta Arduino UNO como ISP, realizamos las conexiones de la siguiente manera.

Para cargar el bootloader a un microcontrolador ATMEGA328P sin bootloader

En la tarjeta, la conexión de los pines (6 pines centrales) hacia la tarjeta Arduino es la siguiente.

  • Pin 1 (MISO) ------> 12 (de la tarjeta Arduino UNO)
  • Pin 2 (VCC) ------> 5V (de la tarjeta Arduino UNO)
  • Pin 3 (SCK) ------> 13 (de la tarjeta Arduino UNO)
  • Pin 4 (MOSI) ------> 11 (de la tarjeta Arduino UNO)
  • Pin 5 (RESET) ------> 10 (de la tarjeta Arduino UNO)
  • Pin 6 (GND) ------> GND (de la tarjeta Arduino UNO)

Además de esto asegúrese de que el “jumper” de la resistencia de reset de la tarjeta esté conectado.

Conecte el cristal de 16 MHz en su base correspondiente.

Sitúe el microcontrolador ATMEGA328P (en este caso se usó uno en encapsulado SMD) sobre las pistas correspondientes (o en su base, si es usado uno con encapsulado PDIP) y presione con algún objeto que no dañe al microcontrolador, esto con el objetivo de que las patitas hagan contacto con las pistas (en este caso se hizo con un marcador).

Step 8: Cargando Bootloader

Picture of Cargando Bootloader

Ya que se tienen las conexiones de la tarjeta hacia el Arduino UNO y el microcontrolador puesto en su sitio, se realiza la carga del Bootloader o gestor de arranque. Esto desde el IDE de Arduino, en la sección Herramientas – Grabar Secuencia de Inicio.

NOTA: en este caso se cargara la versión del bootloader correspondiente al Arduino UNO, existen otras versiones de bootloader (como se mencionó en la sección “un poco de teoría”) como por ejemplo la versión que existe para el microcontrolador ATMEGA2560 (Arduino Mega). En este caso asegurar que este seleccionada la tarjeta correcta, para el bootloader correspondiente.

Una vez terminada la carga ya se tiene grabado el bootloader o gestor de arranque el microcontrolador que anteriormente no lo tenía.

Step 9: Cargando Programa De Prueba

Picture of Cargando Programa De Prueba

Ahora que ya se tiene un nuevo microcontrolador con el bootloader de Arduino cargado, se puede cargar cualquier programa desde el IDE que hayamos hecho para montar el ATMEGA328P en cualquier parte fuera de la tarjeta. Esto lo hacemos de la siguiente manera.

Retire el ATMEGA328P de la tarjeta Arduino UNO

Conecte dos cables desde los pines RX y TX de la tarjeta hacia RX y TX del Arduino UNO

Cambie el pin 3 (reset) de la tarjeta hacia la conexión RESET del Arduino UNO (anteriormente estaba en la conexión 10). Puede dejar o desconectar los pines de MISO, MOSI y SCK.

Desconecte el jumper de los pines de la resistencia de reset de la tarjeta.

Step 10: Listo, a Cargar Programas Fuera De La Tarjeta Arduino

Ahora, ya se puede cargar cualquier programa desde la tarjeta Arduino UNO hacia el microcontrolador fuera de la tarjeta y montar éste en cualquier circuito que necesitemos. Y para reprogramarlo solo se requiere de 5 conexiones que son: VCC, GND, RX, TX, RESET.

Con esto se pueden hacer diseños especiales de tarjetas PCB a la medida con la plataforma Arduino y poder ir más allá de ésta placa o del protoboard.

En la última imagen se puede ver un ATMEGA328P el cual tiene programado el bootloader o gestor de arranque montado en un PBC con un diseño especial. Este PCB cuenta con un puerto de 5 conexiones (VCC, GND, RX, TX, RESET) necesarias para la reprogramación del microcontrolador desde la plataforma Arduino.

Comments

ÑaJ3 (author)2015-12-28

Muy buen blog, disculpa puedo cargar el bootloade desde la placa Arduino Uno sin necesidad de comprar algún “programador ISP”.

AM Robotics (author)2014-12-07

Muy buena eplicacion, una pregunta solamente. Es posible usar la placa Leonardo en vez de la UNO para cargar el ISP ?

IAP (author)AM Robotics2014-12-09

Hola, claro que sí. Programas el Arduino Leonardo como ISP y
para cargar el bootloader seleccionas Arduino UNO

javi_el_largo (author)2014-12-04

Un tutorial estupendo; sencillo, claro, conciso y completo. Enhorabuena.

About This Instructable

4,958views

16favorites

License:

Bio: Preguntame / Ask me :)
More by IAP:Extracting the Arduino´s Soul / Extrayendo el Alma de Arduino / Arduino bootloaderTutorial PCB doble cara. Método de planchado / PCB double layer
Add instructable to: