Recuerdo mi primer contacto en la facultad con un microcontrolador (de Texas Instrumens, no recuerdo el modelo). Había que usar complejos y caros programadores para volcar el código, y para volver a usarlos había que borrar sus EPROM con luz ultravioleta. Hoy están mucho más accesibles, y la plataforma Arduino, basada en el microcontrolador Atmega328P, tiene bastante culpa de ello (aunque no son los únicos, claro). Hoy cualquiera con un PC y ganas puede adquirir un Arduino por muy pocos euros y empezar a jugar con él. Ni siquiera es necesario programar en ensamblador ya que el entorno de desarrollo permite programarlos en un lenguaje de alto nivel. El prototipado es, hoy en día, mucho más sencillo y barato gracias a estas nuevas plataformas, pero en algún momento hay que pasar del prototipo al circuito final (o al menos, a un prototipo ya sin la placa de Arduino a cuestas). Vamos a ver cómo usar el microcontrolador Atmega328P en un circuito real e independiente de la placa de Arduino.
El bootloader es parte de la magia de Arduino. Es un pequeño código almacenado en su memoria que se ejecuta al arrancar y que se encarga de leer datos por su puerto serie y almacenarlo en la memoria flash. Es decir, que nos permite cargar nuestro propio código sin necesidad de usar un programador externo. Los Atmega328P se pueden adquirir a muy bajo precio, pero en la mayoría de los casos vendrán sin su correspondiente bootloader (a veces incluso aunque el vendedor diga que sí). Así que, si no lo trae, lo primero que tendremos que hacer es cargar el bootloader en el microcontrolador. La buena noticia es que podemos hacerlo con la ayuda de la propia placa Arduino. Esta es la lista de materiales que vamos a necesitar:
- Arduino UNO.
- Protoboard.
- Un Atmega328P (ojo, no un Atmega328, son distintos).
- Oscilador 16MHz (tipo HC49S)
- Dos condensadores cerámicos de 22pF.
- Dos resistencias (1K y 10K)
- Cables
La distribución de pines del Atmega328P es la siguiente:
Lo mínimo necesario para que el Atmega328P funcione es, por supuesto, conectar los pines 7 y 20 a VCC (5V) y el 8 y 22 a tierra. Aunque el Atmega328P puede funcionar con su reloj interno de 8MHz, sin bootloader no vamos a poder activarlo, así que usaremos uno externo a 16MHz que se conecta a las patillas 9 y 10, con sus correspondientes condensadores (he usado dos cerámicos de 22pF). Si tienes un resonador a 16MHz (yo no tenía ninguno a mano) puedes usarlo en lugar del oscilador y ahorrarte los dos condensadores.
Finalmente el circuito queda así:
El programa que se encarga de escribir el bootloader necesita (como mínimo) una conexión al pin de Reset (con la resistencia de 10K) y a los pines 13, 12 y 11. Así queda el circuito ya montado en la protoboard.
Ahora, con el Arduino conectado al PC y el entorno de desarrollo ejecutándose, seleccionamos en el menú Archivo: Ejemplos > Arduino ISP.
En el menú Herramientas: Programador > Arduino as ISP.
Y finalmente, también en el menú Herramientas, seleccionamos Grabar secuencia de inicio.
Sólo nos queda pulsar el botón para cargar el código en el microcontrolador (el botón de la flechita). Si todo va bien, nuestro Atmega328P ya tiene grabado su bootloader y está listo para que podamos cargar nuestro programa en él. Podríamos pincharlo en el zócalo de una placa Arduino y programarlo normalmente para después volver a ponerlo en la protoboard, pero la buena noticia es que podemos programarlo directamente en la protoboard conectando los pines TX y RX a la placa Arduino. Ojo, antes hay que quitar el Atmega328P que hay en la placa Arduino. Las conexiones quedarían así:
Así es como debe quedar. Nótese que el Arduino tiene el zócalo del Atmega328P vacío.
Pues bien, ahora vamos a programarlo. Usaremos el famoso Blink que trae de ejemplo el entorno de desarrollo. Está en el menú Archivo > Ejemplos > Basic > Blink.
Cambiamos el programador en Herramientas > Programador > AVR ISP.
Finalmente pulsamos el botón de la flechita para cargar nuestro programa. Ahora el código está grabado en el microcontrolador y cada vez que le suministremos 5V y lo pongamos en marcha, lo ejecutará. El programa Blink hace parpadear un led de la placa Arduino que está conectado al pin 13, así que tendremos que poner un led y una resistencia de 1K en la protoboard para poder probar el montaje.
En la fotografía de cabecera del artículo se puede ver el resultado final.
Nuestro circuito aún no estaría completo, ya que en un circuito real es necesario usar algún tipo de regulador de voltaje a 5V como el l7805cv, incluso aunque alimentemos el montaje con pilas, pero para simplificar, alimentaré el circuito con una fuente de alimentación estabilizada. Recuerda que hay que suministrar 5V (el circuito apenas consume 20 miliamperios). Si todo está correcto, el led comenzará a parpadear gracias a nuestro circuito basado en el Atmega328.
Explicacion clara y consisa..
Me gustaMe gusta
HOla amigo sabes.
ayer se me ocurrio hacer exactamente lo mismo pero no me funcionó porque el atemga 328 esta en la placa y es de montaje superficial. Gracias a tu explicación entendí que hay que retirarlo, pero como es de montaje superficial no me atrevo a hacerlo
Me gustaMe gusta
Poco pero muy util
Me gustaMe gusta
Buenas, disculpe, de esta manera es posible crear algún proyecto que corra en el arduino y luego pasarlo a un micro para hacerlo independiente? Sirve para grabar el proyecto arduino a cualquier otro micro? Gracias.
Me gustaMe gusta
Efectivamente, una vez programado el micro, puede sacarse del zócalo de Arduino y usarlo en tus propios circuitos.
Me gustaMe gusta
Alberto un saludo colega, muy interesante su trabajo, solo tengo una duda, después de grabar el bootlader porque ya no se coloca el micro en la placa Arduino y se transfiere el programa, pq hay q conectarlo por tx y rx. Saludos
Me gustaMe gusta
Puede hacerse como dices. Lo de conectarlo por TX y RX es para usar la placa arduino como programador para el 328P. Si diseñas una placa PCB en la que el arduino va soldado directamente o es SMD, no podrías quitarlo de la placa, pero este método del artículo seguiría valiendo.
Me gustaMe gusta
Hola, disculpa, para usar los avr una vez cargados con el bootleader, e instalados en una placa PCB, como sería el circuito de reset, (se le sacaría la red de 10k y se le pondría un pulsador y una pull up?)
Me gustaMe gusta
Para hacer un reset externo hay que poner a nivel bajo el pin de RESET, así que en principio, creo que bastaría con poner un pulsador entre la resistencia R1 y el pin de RESET.
Me gustaMe gusta
Teniendo el Arduino standalone, ¿Puedo usar el puerto serial? como para colocar algun modulo RF o cualquier otro?
Me gustaMe gusta
En principio, que yo sepa, no debe haber problemas para usar los pines RX y TX.
Me gustaMe gusta
buen dia, puede funcionar tambien para recibir lecturas de un sensor?
Me gustaMe gusta
Claro, sólo hay que conectar el sensor a las patillas correspondientes en el encapsulado.
Me gustaMe gusta
hola, trate de grabar el bootloader y me indica el siguiente error;
Arduino:1.8.9 (Windows 10), Tarjeta:»Arduino/Genuino Uno»
avrdude: ser_open(): can’t open device «\\.\COM7»: El sistema no puede encontrar el archivo especificado.
Error quemando bootloader
Este informe podría contener más información con
«Mostrar salida detallada durante la compilación»
opción habilitada en Archivo -> Preferencias.
podria alguien ayudarme para corregirlo?
Me gustaMe gusta
DISCULPEN LO INTENTE DE NUEVO Y ME INDICA AHORA EL SIGUIENTE MENSAJE :
Arduino:1.8.9 (Windows 10), Tarjeta:»Arduino/Genuino Uno»
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x86
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x86
Error quemando bootloader
Este informe podría contener más información con
«Mostrar salida detallada durante la compilación»
opción habilitada en Archivo -> Preferencias.
Me gustaMe gusta
Si no carga el sketch no podra identificar la placa UNO que tiene que hacer al recibir la orden burn bootloader.
Me gustaMe gusta
Buenas noches , para que nuestro micro controlador ejecute el código programado fuera de arduino, es necesario que el cristal de cuarzo de 16MHz y los condensadores téngan que estar conectados con respecto al diagrama?, claro esto después de haber echo el bootloader
Me gustaMe gusta
No entiendo muy bien el sentido de subir al chip el bootloader o el programa mediante una protoboard. No es más simple programarlo todo mediante la propia placa de Arduino?
Por algo tiene el zócalo, digo yo…
Me gustaMe gusta
Hola. Se podria hacer exactamente le mismo montaje, pero con un atmega 328P smd, con el correspondiente adaptador para los pines?
Gracias
Me gustaMe gusta
Hola. Se podria usar un atmega 328P, pero el smd? Con el correspondiente adaptador y todo….
Gracias.
Me gustaMe gusta
Hola con este diseño ahora le podre cargar cualquier codigo a mi atmega328p? Es nuevo sin uso
Me gustaMe gusta
disculca soy nuevo en esto puedo usar el 328 varias veses (colocar un progama y luedo borrarlo y cokocar otro programa) no se si me explico se puede grbar varias veces
Me gustaMe gusta
Buenas tardes, muy instructivo y didáctico.
Como tendría que hacer para grabar varios micros sin tener que desconectar el arduino de la pc?
Me gustaMe gusta
Hola!
será que puedo utilizar el 328P con un módulo receptor de FM TEA5767?
Me gustaMe gusta
Sí, sin problema. El TEA5767 tiene interfaz I2C. Aquí tienen un ejemplo: https://www.prometec.net/radio-tea5767/
Me gustaMe gusta