Continuación de la entrada anterior: #2 Curso IoT con Arduino y ESP8266 WiFi: Arduino Pro Mini
4.4) Programación
Usar la versión más pequeña y económica de Arduino tiene sus inconvenientes, entre ellos se encuentra la ausencia de conector USB y chip TTL que nos permite cargar nuestros sketches desde el IDE de Arduino.
Por ello necesitamos un programador externo que haga ese trabajo, lo más cómodo es hacer uso de un módulo que cuente precisamente con esos componentes que le faltan a nuestro Arduino, es decir el chip TTL y el conector USB. Aunque esta no es la única forma de programar nuestro Arduino Pro Mini, también podemos hacer uso de un Arduino Uno, o de un programador ISP.
A continuación vamos a ver cómo programar el Arduino Pro Mini de todas estas diferentes formas disponibles.
4.4.1) Adaptador USB: FTDI FT232R, CP2102, Cable TTL
Como mencionábamos, decantarse por un Adaptador USB es la forma más sencilla de poder programar un Arduino Pro Mini.
Un adaptador USB consta de un chip conversor de señal que adapta la señal USB de nuestro ordenador a una señal TTL o Serie, que es justamente el tipo de comunicación que usa Arduino y que necesitamos para poder programarlo. Además de ese chip el adaptador también contara con un conector USB, con los pines de comunicación y el resto de electrónica necesaria para que funcione.
Hay multitud de modelos, y estos hacen uso de una gran variedad de chips conversores cada uno de su propio fabricante. Si queremos ir a lo seguro lo mejor es decantarse por un adaptador que cuente con un chip FTDI FT232R, que es el mismo chip que montaban las primeras versiones de Arduino Duemilanove, Arduino Uno, que sigue montando el Arduino Nano, etc.
La ventaja de usar este chip y no otro es que el propio IDE cuenta con los drivers necesarios para nuestro ordenador, puede que incluso los instale automáticamente Windows o que los incluya ya Linux o Android.
Otra alternativa más económica y que también da muy buenos resultados es el chip CP2102.
Por lo general este adaptador suele venir directamente con el USB que conectaríamos al ordenador, por lo que no necesitamos de ningún cable USB->MiniUSB como si sucede con el adaptador superior.
Una tercera alternativa, más cara pero quizás más elegante, son los cables USB que integran el propio chip conversor en el conector USB, para ello en un extremo del cable tenemos el USB con toda la electrónica y en el otro extremo contamos con los pines necesarios para conectar el Arduino.
El extremo en el que tenemos los pines puede venir o bien con cada cable suelto y entonces contar con 6 conectores de un pin, o bien un solo conector con todos los cables unidos. En este último caso puede que el orden de los cables no coincida con el Arduino Pro Mini dependiendo del ensamblador del cable o del Arduino, sin embargo esto tiene muy fácil solución ya que con un alfiler se pueden sacar los cables del conector para volver a insertarlos en el orden correcto.
GND | Pin de masa. |
3.3 o 5V | Pin de alimentación, necesitaremos uno u otro dependiendo del Arduino. |
RX | Pin de recepción de datos, se debe unir con el de TX de Arduino. |
TX | Pin de transmisión de datos, se debe unir con el RX del Arduino. |
DTR | Es importante contar con este pin ya que va conectado al pin DTR/GRN del Arduino y permite que al cargar un nuevo sketch se resetee automáticamente el Arduino. Durante el encendido el bootloader comprueba si existe una comunicación Serial y de ser así permite su programación, en caso contrario inicia el programa cargado en la memoria FLASH. |
La primera vez que conectemos el adaptador al puerto USB del ordenador puede que el sistema operativo intente instalar los drivers de forma automática descargándolos el mismo desde internet, en caso de que fracase necesitara que se los instalemos a mano para que sea capaz de reconocer el adaptador, en el caso de Windows se hace de la siguiente forma:
Para el chip FTDI FT232R debemos de ir al administrador de dispositivos: Botón derecho sobre Equipo > Administrar > Administrador de dispositivos, si vemos algún dispositivo desconocido con error deberemos de actualizar sus drivers, en este caso se ve muy rápidamente ya que se incluye el nombre FT232R USB UART.
En el caso de que usemos el adaptador CP2102 bastara con que vayamos a la web del fabricante y descarguemos e instalemos sus drivers en formato .exe
Tras la instalación de los drivers del adaptador nos aparecerá un nuevo puerto COM en el IDE de Arduino, tendremos que seleccionarlo. También tendremos que seleccionar la placa correspondiente en este caso el Arduino Pro Mini con procesador ATmega 328 (5V, 16Mhz)
4.4.2) Un Arduino Uno
Si contamos con un Arduino Duemilanove, Uno, u otra versión de Arduino en la cual su microcontrolador vaya colocado en un zócalo y no soldado directamente al PCB, esto nos permitirá usar la placa de Arduino para programar el Arduino Pro Mini.
Para ello es necesario desacoplar el microcontrolador del zócalo, ayudándonos de un destornillador para hacer palanca, y conectar los cables como la imagen.
Después en el IDE deberemos de indicar que estamos usando como placa un Arduino Pro Mini y el puerto COM correspondiente al Arduino Uno.
El que estemos usando un Arduino Uno no afecta en nada a la programación del Arduino Pro Mini, es todo transparente ya que solo hacemos uso de su chip TTL, por lo que se comporta como un adaptador USB como los vistos anteriormente.
4.4.3) Programador ISP: ArduinoISP, USBTinyISP
Este último modo de programar el Arduino Pro Mini es menos común y mucho más laborioso pero tiene la ventaja de que nos permite también grabar el bootloader oficial o de terceros, también nos permite cargar nuestro sketch sin grabar el bootloader ganando espacio para nuestro código, ocupa como unos 2KiB de memoria flash, y haciendo que el Arduino se inicie ligeramente más rápido.
Para este modo de programación es necesario un programador ISP, para ello podemos usar un Arduino Uno en el que se carga un sketch para que se comporte como un programador, o podemos usar un adaptador como el USBTinyISP.
Si usamos un Arduino será necesario cargar el sketch ArduinoISP que se encuentra en el menú de ejemplos del IDE, una vez seleccionado solo hay que darle escribir el programa (subir). Cuando termine es necesario ir al menú: Herramientas > Programador > Arduino as ISP
Si nos decantamos por usar el USBTinyISP tendremos que seleccionar en el menú de: Herramientas > Programador, la opción de USBTinyISP
Para ambos programadores, si lo que queremos es grabar el bootloader en el Arduino Pro Mini, deberemos de seleccionar la placa en Herramientas > Board > Arduino Pro Mini, y el Procesador correspondiente a nuestro modelo: ATmega 328 (5V, 16Mhz). Por ultimo quedara ir al menú de Herramientas y pulsar en Quemar bootloader. Este proceso suele tardar un par de minutos, cuando termine el IDE nos avisara.
Tras cargar el bootloader, que no lo hemos mencionado aun pero ya viene precargado de fábrica, podremos programar el Arduino con un adaptador USB.
Si lo que buscamos es cargar un sketch sin necesidad de usar el bootloader, es suficiente con tener el sketch preparado en el IDE pulsar en Archivo > Subir usando programador.
4.5) Cargar el primer Sketch de prueba
A estas alturas estoy seguro que estaréis cansados del típico Hola Mundo para probar el correcto funcionamiento de vuestros Arduinos, por ello a continuación incluimos un ¡Hola mundo en morse! Más información sobre morse en la Wikipedia.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#define pLED 13 #define CORTO 150 #define LARGO 450 #define PAUSALETRA 150 #define PAUSAPALABRA 1350 #define ESPACIO 450 #define COUNT(x) sizeof(x)/sizeof(*x) const char morse[] = "-... .. . -. ...- . -. .. -.. --- .- .-.. -.-. .- -- .--. ..- ... - . -.-. -. --- .-.. --- --. .. -.-. --- ...- .. .-. - ..- .- .-.."; void setup() { pinMode(pLED, OUTPUT); } void loop() { delay(1000); int letras = COUNT(morse); for( int i=0 ; i < letras ; i++ ) { switch( morse[i] ) { case '.': digitalWrite(pLED, HIGH); delay(CORTO); digitalWrite(pLED, LOW); delay(PAUSALETRA); break; case '-': digitalWrite(pLED, HIGH); delay(LARGO); digitalWrite(pLED, LOW); delay(PAUSALETRA); break; case ' ': if( i+1 < letras && morse[i+1] == ' ' ) { delay(PAUSAPALABRA); i++; } else { delay(ESPACIO); } break; } } while(true); } |
El código de ejemplo no es excesivamente complicado, pero para el que se le dé peor la programación lo comentare un poco por encima.
* Las primeras líneas que incluyen las sentencia #define nos permiten definir constantes de C, una constante es una palabra que será sustituida por el valor de su derecha en tiempo de compilación, de modo que el código grabado en el Arduino no tendrá esas palabras si no directamente sus valores. Esto viene muy bien para definir pines u otros parámetros que no cambiaran de valor, de ahí el nombre de “constantes”.
El último #define del código es bastante especial pues se comporta como una macro, esta nos permite recibir un valor, nombrado como x, y hacer ciertas operaciones con él, en este caso se calcula el número de componentes, o huecos de memoria, que tiene el array que le pasemos. Nos basta con saber que si creamos el array int miArray[] = {10, 21, 32, 43}; nuestra macro nos devolverá un 4, pues es el tamaño del array, si en vez de nuestra macro usáramos directamente sizeof(miArray) nos devolvería 8, pues es la cantidad de bytes que ocupa en memoria ese array, 2 bytes por cada número int almacenado.
* Después de las constantes tenemos un array de solo lectura, eso se especifica con la palabra const, este array almacena un conjunto de caracteres que son los que representan el mensaje en morse a mostrar.
Este array se iterara en el loop() mediante un for carácter a carácter, para saber cuántas iteraciones se han de realizar usamos nuestra macro COUNT(morse). Dependiendo del carácter que se encuentre se realizara una acción u otra, ya sea parpadeo del led, parpadeo largo del led, espacio o pausa.
* Al final del código tenemos la línea while(true); que se encarga de que todo el código del loop solo se ejecute una única vez, ya que ese bucle itera infinitamente. Es útil si queremos precisamente eso.
4.6) Montaje del circuito base en la protoboard
Al tratarse del primer componente que hemos visto hasta ahora el montaje es muy sencillo. Solo necesitaremos las placas de prototipado para pinchar el Arduino y el programador externo que hayamos elegido, en las dos siguientes fotografías se puede ver cómo queda tanto con un adaptador CP2102 como con un cable TTL.
El Arduino está colocado en el centro superior de la placa de prototipado a propósito, pues según avancemos iremos añadiendo componentes por los alrededores, si lo pusiéramos a un lado algunos cables se nos quedarían cortos, estando en el centro no tendremos ese problema.