Cargar Bootloader en Atmega con Arduino

Las placas de desarrollo Arduino, como bien ya conocemos, poseen en su interior un microcontrolador Atmel de la familia Atmega, en muchos casos traen el Atmega328p muy conocido y con prestaciones competitivas.
Cuando desarrollamos algún firmware desde la herramienta Arduino IDE vamos a generar una compilación de nuestro programa que a su vez genera un objeto y un archivo hexadecimal que sera el que vamos a cargar dentro de la memoria flash del microcontrolador Atmega328p.
Si nosotros usamos un microcontrolador recién comprado, el mismo viene con la memoria en blanco, es decir no tiene nada dentro o tal vez algún ruido y bits que no significan nada pero que en definitiva no trae nada especial o útil.
Cuando nosotros tenemos que cargar ese objeto hexadecimal en la memoria flash del microcontrolador debemos utilizar alguna interfaz entre la pc y el microcontrolador que nos permita pasar el código compilado a la memoria interna del microcontrolador. 
Para ello usamos programadores comerciales o bien alguno construido por nosotros mismos. Esta tarea de tener que pasar el firmware a la memoria flash del mcu es una tarea que debemos realizar todas las veces que modifiquemos o cambiemos nuestro programa, es una tarea que podría ser sencilla si el microcontrolador montado en su placa tiene un puerto ISP o ICSP, donde accederemos a los pines de programación de forma sencilla o bien debemos quitar el micro de la placa que estamos utilizando y montarlo en el programador.
Esto parece sencillo pero también debemos adquirir el programador, lo cual es un costo extra que en la mayor parte de las veces es muy costoso (en relación a lo que cuesta el microcontrolador).
Para no depender del hardware de interfaz entre la PC y el MCU, podríamos utilizar un pequeño programa sencillo que canalice datos y los guarde en determinado sector de la memoria flash, es decir, cuando usamos el programador de microcontroladores el mismo envía el programa de forma serial a través de algunos pines dedicados y lo guarda en un determinado sector de la memoria. La solución seria realizar el programa que tome los datos y los guarde en la memoria interna, pero hasta aquí es lo mismo que hace el programador, salvo que la diferencia esta en que no necesitamos pines extra especiales para la programación, o niveles de tensión diferentes a los de alimentación. 
Podríamos tener este programita que tome los datos desde UART y así solamente usar dos gpio como datos y que no requiera mas de 5V o 3V3 de alimentación.
Este programa recibe el nombre de Cargador de Arranque, o Bootloader.
Esto no es algo nuevo, se usa desde hace muchos años ya, nos permite transferir el programa compilado a la memoria del mcu de forma sencilla y sin la necesidad de un programador externo, es decir desde el UART del mcu al puerto serie de la PC. 
En nuestro caso sera al USB, pero utilizaremos un circuito integrado que convierta el USB en Serial, este integrado no es mas que un puente o Bridge USB.
Arduino posee en su placa una fuente de alimentacion, unos header para conectar cables y shields, el microcontrolador Atmega328p y un Bridge USB, este bridge suele ser un Atmega32u4 o un FTDI, aunque hoy en dia vemos otras opciones como el super económico CH340 que están implementando los clones de Arduino.
Entonces Arduino resuelve el tema de la programación cargando un Bootloader dentro del Atmega328p y utilizando el puerto UART del mismo mediante el bridge USB a la PC.
Hasta aquí todo bien, ya describimos el Arduino, pero que pasa si cuando estamos montando nuestro proyecto electrónico y queremos diseñarle su propio PCB dedicado (con los componentes que queremos utilizar) y dentro de su gabinete como producto final terminado, esta claro que no vamos a poner dentro de un gabinete una placa Arduino (aunque he visto algunos casos que si............) ya que no tiene sentido porque el Arduino es una placa de desarrollo, es para probar y depurar nuestro proyecto y una vez que lo tenemos bien pulido lo cargamos en un microcontrolador solo y montamos solamente el microcontrolador en la placa.
Para ello tenemos dos caminos, o usamos un programador y pasamos a través de el cada vez que modificamos el programa, o le cargamos un bootloader.
En cualquiera de los dos casos necesitaremos un programador, ya que para cargar el bootloader debemos usar el programador, al menos sera la única vez que lo usaremos.
Arduino resuelve este dilema convirtiendo la misma placa Arduino (puede ser cualquier modelo) en un programador!
Para ello debemos tomar el arduino que tengamos a mano y cargarle un programa especial que se llama "Arduino ISP" con este programa convertimos a nuestro Arduino en programador, y luego simplemente conectamos el Arduino al microcontrolador externo y lo programamos, podríamos pasarle de esta manera el Bootloader que queramos, por ejemplo el de un modelo UNO.


Luego de cargar este ejemplo, se nos abrirá otra ventana y nos aparecerá el programa que debemos cargar en el Arduino que tenemos conectado a la PC.



Como podremos ver, nos describe que pines usaremos para programar el Atmega328p externo, Reset, MOSI, MISO y SCK, que corresponden a los pines 10, 11, 12 y 13.
Si usamos un Arduino MEGA como programador los pines serán los de la columna de la derecha.
También nos da la opción de conectarle tres leds en los pines 7, 8 y 9, que serán monitoreo de datos, pero esto es opcional, si van a armar un programador como un Shield, tal vez se podrían implementar los LEDs, pero si lo van a hacer una o dos veces solas, no tiene sentido.

Para saber los pines que utilizaremos en nuestro Atmega328p podremos ver la siguiente imagen

Aquí podremos ver todo el pinout y el correspondiente a la placa Arduino. Como podremos ver, tenemos que alimentar el Atmega328p y también conectar su cristal de 16MHz con sus capacitores para que este funcione y pueda ser programado.
Para ello les dejare la siguiente imagen.
En este diagrama podremos ver las conexiones MISO, MOSI, SCK, también la conexión de Reset con una resistencia de 10k de PullUp y por ultimo el cristal de 16MHz con sus dos capacitores de 22pF.

Una vez que tenemos nuestra placa Arduino con el programa ArduinoISP (osea que la convertimos en programador) y tenemos conectado el micro externo de la manera que la vemos en el diagrama de arriba, podremos cargarle el bootloader.
Para ello debemos elegir que bootloader vamos a cargarle a nuestro micro externo, para ello vamos a la sección donde elegimos el Arduino



En este caso yo quiero grabarle el bootloader del Arduino UNO dentro del micro externo, por ello elegimos este, y luego elegimos la opción "Quemar Bootloader"



Luego de presionar el botón, se cargara el bootloader del Arduino UNO en nuestro microcontrolador externo y cuando se encuentre dentro del mismo, tendremos un Arduino UNO!, 
Solo resta montar ese microcontrolador en el circuito que necesitemos y listo, nuestro Arduino IDE lo reconocerá como otro Arduino UNO sin problemas.