Programar Fácil Con Arduino
Programar Fácil Con Arduino
Tómalo con calma, es un artículo muy largo. Casi podemos decir que es un libro de Arduino.
Cualquier sugerencia o cualquier duda la puedes escribir en los comentarios.
Espero que lo disfrutes y sobre todo, que aclare las dudas que puedas tener.
Indice de contenidos
2 El proceso del prototipado con Arduino
3 Curso de Arduino: Introducción al software y hardware
4 Fundamentos de la programación con Arduino
5 Conclusiones curso de Arduino
El proceso del prototipado con Arduino
En este apartado no me voy a extender mucho. Tienes un artículo muy detallado sobre el proceso
de prototipado con Arduino. Aún así haré un resumen de todo lo que se habla en ese artículo.
Arduino es una placa orientada al prototipado. No sólo porque todo lo que está en la propia placa
y el software están pensados para prototipar de una forma muy fácil y rápida. Además, tenemos
sensores, actuadores y shields alrededor de Arduino que nos facilitan esta tarea.
¿Qué es lo primero que se hace cuando queremos hacer un proyecto con Arduino? Puede que
pineses: “uhmmmmm pues conecto los componentes y a programar“. ¡¡¡ NO !!! Se trata de un
error muy típico que me encuentro todas las semanas.
Cuando tenemos que empezar a crear un proyecto con Arduino lo primero que tenemos que
hacer es plantear ese proyecto. Debemos plasmarlo con lápiz o bolígrafo en un papel. Así de
sencillo.
Si lo que estás planteando, por ejemplo, es hacer un proyecto con Arduino para medir la
temperatura, en esta fase el proyecto no tiene que ser una simple estación meteorolótica. Tiene
que ser el satélite Meteosat :). No te cortes y plasma todo en un simple papel.
Un dibujo sencillo, sin complicaciones, donde vengan todos los componentes que te gustaría
tener en tu proyecto.
Al final de esta fase tendrás un listado de ideas y especificaciones del satélite Meteosat ;) Este
sería el inicio de la siguiente fase, el prototipo mínimo.
El prototipo mínimo
Vale, ya tienes ese maravilloso proyecto con Arduino en un papel. Junto a ese diseño tienes un
listado de ideas y especificaciones. Ahora tienes que tirar de tu yo más racional, digamos que
ahora eres Lisa de la familia Simpson.
Debes plantearte una pregunta crucial ¿seré capaz de enviar un satélite al espacio? ¿No sabes
la respuesta? Ya te lo digo yo, ¡NO!. No estoy dudando de tus capacidades, para nada. Si que
dudo de tus recursos. A no ser que seas Elon Musk, veo difícil poner un satélite en órbita.
Y como este ejemplo muchos otros. A veces me preguntan si no sería mejor hacer una PCB o
circuito impreso para algún proyecto. Por supuesto que si pero ¿qué experiencia tienes
diseñando PCBs?¿qué experiencia tienes con electrónica?¿dónde vas a fabricar ese circuito
impreso?
Por eso es importante centrarse en el objetivo principal de tu proyecto. Esta fase consiste en
eliminar todo aquello que no es importante y que solo aportan funcionalidades extra.
Si lo que quieres es medir la temperatura para algo concreto ¿por qué mides la presión? ¿por
qué lo conectas a Internet? Céntrate en eso concreto y consigue crear un prototipo mínimo que
sea capaz de hacer la funcionalidad principal de tu proyecto.
Debes ser capaz de conocer tus limitaciones y de los medios que dispones. Es simple, si consigues
hacer un prototipo mínimo en poco tiempo, no sentirás la frustración de no llevar tu idea a la
realidad. Esta fase es crucial para aprender Arduino.
Debes ser capaz de con muy poco, obtener resultados. Siempre tendrás tiempo de ir mejorando
el proyecto con Arduino y añadir nuevas funcionalidades.
El diseño incremental
Ahora sí, ya tienes las ideas claras de lo que tienes que hacer para llevar a cabo tu prototipo
mínimo. Lo has plasmado todo y ahora empieza la fase de creación. Ya puedes empezar a crear
los circuitos y a programar Arduino a partir de ese prototipo mínimo.
Mi consejo es que apliques el diseño incremental. Básicamente consiste en dividir ese gran
problema que vas a resolver, en pequeños problemas. Puedes verlo como un pintor.
Haz un bosquejo de lo que quieres conseguir y poco a poco ves dando forma a esa idea primitiva.
Aunque sea sólo medir la temperatura con un sensor, plantea y reflexiona lo que tienes que hacer
en el código, investiga sobre las características del hardware y el software. Solo cuando tengas
toda esta información deberás ejecutar las acciones necesarias para realizar tu prototipo mínimo.
Si has llegado hasta aquí, es porque quieres aprender Arduino. Pero al contrario que otras
tecnologías como pueda ser un ratón o un teclado, denominadas tecnologías Plug&Play, Arduino
no es un hardware que se conecte y listo.
En un curso de Arduino debes aprender todas las nociones para que puedas configurar y
programar el microcontrolador de Arduino.
Esta programación, ya sea para Arduino, para otro tipo de placa o para otro lenguaje de
programación, se suele hacer a través de un IDE o entorno de desarrollo. Pero, ¿qué es un IDE o
entorno de desarrollo?
Déjame que te lo explique con una analogía. Cuando estás escribiendo un informe o cualquier
documento para tu trabajo ¿con qué software lo haces? Normalmente se utiliza Office de
Microsoft o la versión de código abierto Libre Office.
Pero también lo podrías hacer con un Bloc de Notas. ¿Qué ventajas tiene escribir un documento
de este estilo con un programa como Word?
Cuanto más azúcar más dulce. Un procesador de texto potente te permitirá añadir tablas, utilizar
listas y demás herramientas que facilitan el crear un documento. Seguramente todo esto no lo
puedas hacer con el Bloc de Notas de Windows por ejemplo.
Con los entornos de desarrollo ocurre algo parecido. Con el IDE de Arduino podemos escribir
nuestro código de una forma muy fácil y sobre todo, con muchas ayudas.
Por ejemplo, cuando escribimos una palabra reservada nos la cambia de color. Podemos contraer
estructuras de control o funciones. Insertar y gestionar librerías a través del menú o formatear
el código.
Pero lo más importante del IDE de Arduino es que podemos cargar el código a la placa. Podríamos
escribir todo nuestro código en el Bloc de Notas o algún otro editor de texto y sería totalmente
válido. El código no es más que texto.
Sin embargo, el IDE de Arduino nos permite hacer una cosa fundamental: compilar el código y
subirlo a la placa. Esa es la clave. No te preocupes si ahora no entiendes qué es eso de compilar,
muy pronto lo veremos.
Otra característica importante del IDE de Arduino es que es de código abierto. Pero ¿qué quiere
decir esto? Bueno, Arduino es una plataforma abierta. Dentro de esta plataforma se incluye el
IDE de Arduino.
Esto significa que ya no solo tenemos el software de forma gratuita, también lo podemos
modificar a nuestro antojo. Eso sí, para hacer cualquier mejora o cambio debes conocer el
lenguaje de programación con el que se programa el propio entorno de desarrollo de Arduino.
¿Quieres montar tu primer proyecto con Arduino?
Con este curso gratuito crearás un Sistema de Riego Automático con Arduino, paso a paso y en
sólo una semana.
UNIRSE AL CURSO
Aceptas que almacene tu nombre y email para poder enviarte información de
Programarfacil.
No confundir tecnologías libres con tecnologías gratuitas. Aunque una cosa lleve a la otra, no
quita que detrás de este tipo de proyectos haya mucha gente trabajando y muchas horas de
dedicación. Entonces ¿cómo podemos colaborar? Hay diferentes formas. Si nos centramos en
Arduino la más sencilla es comprar placas originales y no copias. Pero también puedes ayudar
haciendo una donación. Eso servirá para pagar el hosting de la página web, a los trabajadores o
cualquier gasto derivado del proyecto.
Versiones del IDE de Arduino
Se trata de un software que está en constante actualización. Arduino no tiene un periodo fijo a
la hora de hacer actualizaciones. Cuando sale una nueva versión se añaden nuevas opciones o se
corrigen errores.
Lo más importante es que de momento (vamos por la versión 1.8.6) el IDE sigue manteniendo
su mismo aspecto. Esto es más importante de lo que parece. Las opciones suelen estar siempre
en el mismo sitio y por lo tanto, cuando se actualiza apenas notarás la diferencia.
Pero por ahora tampoco cambia el código. Esto quiere decir que si tu tienes un programa que
hiciste con la versión 1.4 de Arduino, también te servirá para cargarlo a la placa con la versión
1.8.
Podemos decir que este es el primer paso técnico en un curso de Arduino. Como dicen en la
película de Los Goonies: “todo parte de aquí“.
Accede a la sección de software de Arduino. En la actualidad podemos programar de dos formas
a través del IDE oficial de Arduino. Hay una versión web y un versión de escritorio. Para empezar
te recomiendo que lo hagas a través de la versión de escritorio.
Debes elegir la versión para tu sistema operativo. Hay una versión para Windows, para Linux o
para Mac OS X. Cuando le das a descargar, aparece una ventana donde te pide una contribución
al software de Arduino.
No es obligatorio hacer ninguna donación aunque si que es recomendable. Como ya te he
comentado, podemos colaborar de múltiples formas. Cualquier ayuda es buena.
Todo lo demás que continúa a partir de aquí es una secuencia de pantallas que lo único que hacen
es instalar todo lo necesario para poder programar con el IDE de Arduino. A continuación un
resumen rápido de la secuencia de instalación.
Solo advertir que voy a hacerlo para Windows. Esto es debido a una cosa simplemente. A día de
hoy es el sistema operativo más utilizado del mundo aunque nos pese. Si tengo que elegir uno
prefiero este para poder ayudar al mayor número de personas.
Puedes seguir estos tutoriales para instalar el IDE de Arduino en Linux y en Mac OS X.
#5 Instalar complementos
#6 Terminar instalación
Como has podido comprobar es muy sencillo. Cualquier problema con la instalación me dejas un
comentario en este artículo. Justo abajo del todo ;)
Relájate, no te preocupes, piensa que vamos a escribir una carta a un amigo y que has instalado
un procesador de textos como el Word.
En esta sección vamos a dar un repaso rápido por las funciones más importantes del IDE de
Arduino. Aprenderás lo básico para empezar a programar tus propios programas.
Aprender Arduino requiere de este fuerzo previo por conocer las herramientas. No conseguirás
avanzar rápido si antes no dominas los conceptos básicos del software y hardware de Arduino.
Seleccionar la placa correcta y el puerto serie
Seleccionar la placa es relativamente sencillo. En este curso de Arduino vamos a trabajar con el
modelo Arduino UNO(luego lo veremos más en profundidad).
Con el IDE podemos trabajar con todos los modelos de Arduino e incluso con modelos que no
son de la misma marca. Un ejemplo el ESP8266.
Cada vez que sale una nueva placa, el IDE se actualiza para poder programarla. Con los años verás
como va creciendo esta lista :)
El puerto serie es por donde se comunican Arduino y el ordenador. Es necesario que tengas
conectado tu Arduino al ordenador. Es muy sencillo, no tiene pérdida.
Para seleccionar el puerto lo hacemos a través del menú Herramientas>Puerto. Puede que
aparezca más de uno y además el nombre varía según el sistema operativo.
Truco. Si tienes más de una placa conectada y no sabes cuál es, solo tienes que conectar tu
Arduino al ordenador, abrir el listado de puertos, desconectar Arduino UNO del ordenador y
volver a abrir el listado de puertos. El que haya desaparecido ese es :)
Preferencias del sistema
Como en casi todos los programas que utilizamos, en el IDE de Arduino tenemos una opción
para configurar las preferencias del sistema. Nos permite modificar el idioma, el tamaño de letra
y alguna cosas más que veremos.
Si has creado un programa o sketch (sketch significa esquema o bosquejo) verás que tiene una
extensión .ino.
Cuando guardas un archivo en tu ordenador, el propio IDE de Arduino ya lo organiza por ti. Crea
una carpeta con el mismo nombre que el archivo y dentro guarda el fichero.
Por ejemplo, si creas un nuevo programa y vas al menú Archivo>Salvar, te permitirá guardarlo
con un nombre.
Puedes darle el nombre que quieras siempre y cuando cumplas las reglas de tu sistema operativo.
Te recomiendo que sea un nombre descriptivo y que no utilices caracteres especiales.
Cuando haces esto suceden varias cosas. Por un lado cambia el nombre en el IDE de Arduino. Así
sabes en todo momento con que programa estás trabajando.
Y luego, en la ruta que hayas elegido habrá creado una carpeta con el mismo nombre y dentro
el fichero.
La ruta por defecto donde se guarda es la que hemos configurado en preferencias.
Aquí es donde más vamos a trabajar ya que es donde escribimos nuestro código. Pero no solo
eso, también tenemos acceso a las funciones más utilizadas.
En la parte central encontramos el propio editor. Incluye el número de línea útil, por ejemplo,
para detectar errores.
Justo arriba del editor tenemos los accesos directos a las funciones más utilizadas.
Todos estos accesos directos tienen su correspondencia en el menú de opciones y también tienen
su atajo de teclado.
El área de mensajes
En este área de mensajes se muestra la última acción que has realizado. También muestra
mensajes cuando se está realizando alguna tarea como subiendo un programa a la placa.
La consola
La consola nos va a dar información muy valiosa. Nos puede dar información sobre una acción
concreta, por ejemplo los datos tras subir un programa a la placa. Pero lo más importante, nos
informa si hay algún error.
En la parte izquierda nos informa del número de línea donde está situado el cursor. En la parte
de la derecha tenemos un resumen de la placa que tenemos seleccionada y el puerto serie que
estamos utilizando.
Hemos visto una introducción al IDE de Arduino que no es más que una herramienta para
programar.
En esta sección vamos a ver los fundamentos de Arduino. No me voy a poner muy técnico,
recuerda que lo importante es seguir avanzando.
Si haces una pequeña búsqueda en Internet, encontrarás que hay multitud de placas de Arduino.
Hay originales, copias y un amplio abanico de modelos dependiendo de cual es su funcionalidad.
Así que lo primero que debes preguntarte es ¿qué quiero conseguir?
No es lo mismo comprar una placa con conexión WiFi que sin ella. Por ejemplo, Arduino
MKR1000 puede conectarse a Internet a través de la WiFi y transmitir datos.
Un Arduino UNO o un Arduino Mega no pueden por si solos. Necesitan algún tipo de shield ya
sea ethernet o WiFi.
Salvo estas características especiales de cada placa, el 99% del código te va a servir para cualquier
placa. Por ejemplo, el acceso a los pines se hace en todas las placas igual. Esa es la magia de
Arduino.
Yo recomiendo empezar con un Arduino UNO, sobre todo para un curso de Arduino como este.
También vale un Arduino Leonardo o un Arduino Mega.
Se trata del buque insignia de la marca, el más famoso y el más vendido. Muchos otros modelos
se han construido a partir de este.
Pero lo realmente increíble de Arduino, es que una vez que te inicias con una placa, es muy
sencillo utilizar otros modelos de placa e incluso de otras marcas.
Cuando hablo de placas, lo realmente importante y sobre lo que todo gira es el microcontrolador
que tienen integradas esas placas.
¿Qué es un microcontrolador?
Si miramos de cerca la placa nos da la sensación de que se trata de un circuito sacado de un
electrodoméstico. La realidad es que Arduino está creado con un único objetivo: facilitarnos la
programación de un microcontrolador.
Pero también existen los microprocesadores. Son los típicos procesadores que encontramos en
los ordenadores por ejemplo. Existe una diferencia principal entre una MCU o microcontrolador
y un microprocesador, su utilidad.
Una MCU tiene como objetivo una tarea concreta. Por ejemplo, cerrar las puertas de un
ascensor, captar la temperatura de un sensor, etc..
Sin embargo, un microprocesador es de propósito general. Puede hacer varias cosas a la vez.
Recopilar información de los datos, enviar por email, mostrar en una pantalla, etc…
Ahora imagínate que tuvieras que programar este circuito integrado o chip, ¿cómo lo conectas
al ordenador? ¿cuáles son los pines digitales y analógicos? ¿donde está el pin de 5V y el de GND?
Sin embargo, hubo una persona que pensó que había que democratizar el uso de
microcontroladores y creo Arduino. El es David Cuartielles uno de los cofundadores de Arduino
y el padre de la criatura.
Todo lo que rodea a la placa de Arduino está pensado para facilitarnos la programación y
conexión con el microcontrolador.
La huella o forma en la que están dispuestos los pines, la conexión serie USB para programar y
alimentar, el alimentador de baterías o pilas, cada componente está puesto en su sitio para
que todo sea más fácil para nosotros.
Puerto USB
Se llama puerto USB pero realmente estamos trabajando a través del puerto serie. Dentro de la
propia placa hay un conversor de USB a serie, también conocido como TTL o FTDI.
Imagino que ya te habrás dado cuenta lo que nos facilita la tarea de cargar los programas a través
del puerto USB desde cualquier ordenador.
Pero no solo sirve para cargar los programas, también nos sirve para alimentar la placa con 5V.
Se alimenta así sobre todo cuando lo estás programando.
En el lado de la placa de Arduino, estos pines tienen un acceso muy fácil para poder conectar
diferentes componentes. Pero no son más que plástico, contactos y cables que se conectan con
las patillas correspondientes del microcontrolador.
Su función es facilitarnos su uso. Pero ¿qué podemos conectar a estos pines? Bueno, pues
podemos conectar otros circuitos compatibles con cada uno de los pines. Vamos a ver los 3
zócalos que nos vamos a encontrar en Arduino UNO.
Pines digitales
¿Qué quiere decir digital? Digital es algo abstracto así que mejor verlo con una analogía.
Imagínate que eres pintor. Cuando vas a pintar un cuadro solo te permiten utilizar dos colores:
blanco y negro. Si quieres pintar con un gris claro por ejemplo, no puedes, no existe ese color.
Solo puedes elegir entre blanco o negro.
Si esto lo llevamos al mundo de la electrónica a través de un voltaje, solo podríamos tener dos
voltajes. Esto es lo que ocurre en los pines digitales de Arduino donde solo podemos tener dos
estados HIGH o LOW que equivalen a 5V y 0V.
En realidad esto no es cierto totalmente. Podríamos tener un voltaje de 3V por ejemplo. Para
estos casos hay una regla interna que determina si un voltaje es HIGH o LOW.
Esto quiere decir que cualquier voltaje dentro de este rango, el microcontrolador no sabrá si es
estado HIGH o LOW.
Modo entrada (INPUT): puede leer voltajes. Por ejemplo, ¿está pulsado un botón? si (HIGH)
o no (LOW).
Modo salida (OUTPUT): puede suministrar un voltaje. Por ejemplo, encender/apagar un
led on (HIGH) o off (LOW).
Excepción (PWM): algunos pines del microcontrolador pueden funcionar en modo salida
suministrando un valor entre el rango 0V y 5V. Esto ya no sería un pin digital. Estos pines
van marcados con el símbolo ~ y hay 6 dentro de la placa de Arduino (3, 5, 6, 9, 10, 11).
Por último señalar que los pines 0 y 1 son Rx (recibir) y Tx (transmitir). Se utilizan para la
comunicación serie entre el ordenador y Arduino y están conectados a los LEDs de la placa donde
pone RX y TX. Se recomienda no utilizar estos pines.
El pin 13 es el de la mala suerte dentro de Arduino UNO según cuenta la historia …. :), es broma.
Este pin está conectado a un LED integrado dentro de la placa.
Hay algún pin más dentro de este zócalo pero como ya te he dicho al principio de este curso de
Arduino, aquí vamos a ver lo esencial para ponernos en acción.
Pines analógicos
¿Recuerdas al pintor que solo podía pintar con dos colores, blanco o negro? Pues en el mundo
analógico tenemos una amplia gama de colores, ahora podemos pintar con diferentes tonos de
gris.
Si nos llevamos esto al mundo de la electrónica con Arduino, con estos pines podemos medir
diferentes voltajes entre 0V y 5V. Es decir, podemos tener un voltaje de 3,5V en uno de estos
pines y Arduino sería capaz de leerlo.
Por otro lado, Arduino no es capaz de medir cualquier voltaje, me explico. ¿Cuántos números hay
entre 0 y 5?….. realmente hay infinitos números. Puedes empezar con el 0 e ir aumentando de
0,000001 o en 0,00000000000001.
La consecuencia de todo esto es que Arduino solo entiende datos digitales y además estos
deben estar acotados. El ADC se encargará de convertir esos valores en datos digitales y además
solo podrán ser un número concreto de valores. A esto último se le llama resolución.
El ADC que viene integrado dentro de la MCU que lleva Arduino UNO tiene una resolución de
10-bit. Esto equivale a que solo vamos a poder medir 1024 valores posibles que van del 0 al 1023.
Básicamente lo que estamos haciendo es dividir el rango de 0V a 5V en 1024 partes.
Pines de alimentación
El zócalo de pines de alimentación nos sirve para alimentar los componentes, sensores y
actuadores.
Por último vamos a ver una serie de características secundarias que es importante destacar.
La huella que forman los pines se ha convertido en un estándar para conectar los shields.
El botón reset resetea la placa y hace que empiece a ejecutar el código desde el principio.
Concector jack de alimentación. Es igual que el pin Vin pero a través de un conector jack. El voltaje
de alimentación que soporta es de 6V a 12V.
#5 Cadena de herramientas de Arduino (Toolchain)
En esta el último apartado del software y hardware dentro del curso de Arduino te voy a hablar
del toolchain o caja de herramientas.
Básicamente son los procesos y herramientas que están por detrás y que hacen que cuando tu
des al botón de subir programa, este se compile y se cargue en el microcontrolador.
Como ya te he dicho a lo largo de este curso de Arduino, no voy a entrar en detalle. Solo te daré
los conceptos básicos para que entiendas que sucede entre bambalinas dentro de Arduino.
Desde que concibes la idea en tu cabeza hasta que el libro llega a las librerías, el proyecto pasa
por diferentes procesos hasta materializarse el libro. Voy a hacer una enumeración básica:
¿Qué tiene que ver escribir un libro con la cadena de herramientas de Arduino? Como verás a
continuación, es un ejemplo perfecto de la vida real donde se utiliza un toolchain o cadena de
herramientas.
El toolchain de Arduino
En este curso de Arduino vamos a ver el toolchain o cadena de herramientas en 3 fases. Algunas
partes las hemos visto ya, como el IDE de desarrollo. Sin embargo, es sólo una de las
herramientas.
1. El IDE de Arduino
2. El compilador
3. AVRdude
El IDE de Arduino
Ya hemos visto lo que es y las funciones más importantes del IDE en este curso de Arduino. Su
función es la de procesador de textos.
Es como cuando escribes el libro. Necesitas una herramienta como un ordenador y el procesador
de textos o una máquina de escribir (ya extinguidas).
Para nosotros el IDE hace la misma función. La diferencia es que en vez de utilizar el idioma
español, inglés o francés, vamos a utilizar el lenguaje que entiende el microcontrolador (más
bien el compilador), el lenguaje C++.
Este lenguaje se llama de alto nivel ya que se entiende perfectamente por los seres
humanos. Sólo tienes que tener ciertos conocimientos en inglés.
El IDE hará la función del procesador de textos. Muestra información sobre errores y aporta
ayudas a la hora de programar.
El gran inconveniente es que el microcontrolador no entiende este lenguaje pensado para los
seres humanos. El microcontrolador solo entiende el lenguaje máquina así que necesitamos de
un traductor.
El compilador
El compilador cogerá el código en C++ que has escrito en el IDE de Arduino y lo convertirá en
código máquina para que lo entienda el microcontrolador. El que utiliza Arduino se llama AVR-
GCC.
Se puede decir que es como el editor en la cadena de herramientas para publicar un
libro. Reordena el código y busca errores. Eso sí, como encuentre un simple error te tira para
atrás el trabajo y no te deja continuar.
Como salida del compilador obtenemos un archivo hexadecimal, con extensión .hex, en código
máquina. Ahora ya si que el microcontrolador entiende lo que le estamos diciendo.
AVRdude
La última etapa del tootlchain de Arduino es cargar el código al microcontrolador. Hasta ahora lo
que tenemos es un archivo en código máquina pero necesitamos cargarlo dentro de la memoria
del microcontrolador.
El AVRdude es un programa que hace esta tarea. Coge el archivo hexadecimal en código
máquina y lo carga microcontrolador a través del puerto USB. Esto ha mejorado mucho gracias
a Arduino.
Antiguamente se necesitaba un hardware externo para esta tarea. Por ejemplo los
programadores PIC. Yo esta etapa me la perdí así que no puedo opinar mucho. Sin embargo si
que aprecio la facilidad de aprender Arduino.
Dentro del circuito integrado tiene cargado un software muy básico que se llama Bootloader.
Ya viene instalado dentro de la placa cuando la compras así que no tienes que hacer nada cuando
recibes una placa sin usar.
Con esto habríamos terminado la parte de introducción del software y hardware dentro del curso
de Arduino. Ahora ya estaríamos preparados para empezar a programar. Es lo que vamos a ver a
continuación, los fundamentos de la programación con Arduino.
Al contrario de lo que pueda parecer, existe una estrecha relación entre la gramática y la
puntuación de un idioma y la sintaxis de la programación.
Me gusta decir que si sabes leer y escribir, sabes programar. Seguramente estés familiarizado
con la puntuación y la gramática. Sabrás qué es un punto, una coma, guiones, tildes o punto y
coma.
Además de todo esto, un idioma tiene formas verbales, sustantivos y todo tipo de gramática.
El compilador leerá ese código y lo traducirá a código máquina para que lo entienda el
microcontrolador.
Podemos decir que el compilador será tu profesor de lengua del instituto. La diferencia es que
este profesor es el más exigente que hayas conocido ya que siempre requiere un 10 en tus
programas :).
No te preocupes si al principio te cuesta, es normal. Poco a poco irás entendiendo que te está
diciendo el compilador y donde están los errores. Te aseguro que si pones interés, se convertirá
en tu segunda lengua después de la materna.
Un aviso importante. No se trata de hacer un informe completo sobre lo que hace algo del código,
se trata de poner algo descriptivo para ayudar a entenderlo.
Es una parte fundamental cuando estamos escribiendo un programa para Arduino. Sin
embargo, no se compila es decir, no se traduce al código máquina. Cada vez que el compilador
encuentra un comentario, se salta esa línea.
1 // Esto es un comentario
2 int miVariable = 0;
Todo lo que hay a la derecha de la doble barra (//) se considera un comentario y se pone en color
gris. El IDE de Arduino lo cambia de color para indicarnos que se trata de un comentario.
1 /*
2 Esto es un comentario
3 */
4 int miVariable = 0;
La otra forma de poner un comentario es poniendo /* para abrir y */ para cerrar. Todo lo que
haya entre estas dos marcas de apertura y cierre se considera comentario. Como tal, su color
cambia a gris.
Punto y coma
En el lenguaje de programación C++, el punto y coma (;) es como un punto y aparte.
Básicamente lo que está diciendo es que hemos terminado una sentencia y a partir de ese
momento, empezamos algo nuevo sin relación a lo anterior a nivel de sintaxis.
1 // Esto es un comentario
2 int variable = 0;
Seguramente el código anterior no significa nada para ti si no has programado nunca antes. Sin
embargo, quiero que te fijes en el punto y coma final. El compilador interpreta que a partir de
ese punto y coma todo lo que escriba será una sentencia nueva, sin nada que ver con la anterior.
En este punto ya podemos hacer una prueba para ver como actúa el compilador. Abre un nuevo
programa en el IDE de Arduino y copia el siguiente código. No hace falta ni que conectes la placa
a tu ordenador.
Si te fijas en el área de mensajes, el error está en inglés pero es muy descriptivo, “expected ‘,’ or
‘;’ before void” (en español “espera ‘,’ o ‘;’ antes de void“) es decir, que nos falta poner una coma
o un punto y coma antes de la palabra void.
En la consola nos da todavía más información. Nos indica el archivo donde se ha producido el
error (sketch_may29a puede que tu tengas otro nombre) y la línea donde se ha producido 4.
Por último en el editor nos sale una franja roja indicando la línea donde está el error y donde se
hace referencia en la consola. Ahora cambia el código y pon el punto y coma al final de la línea 2
y verás como compila.
Como ves no estás sólo. El compilador es muy exigente pero también nos ayuda a corregir los
errores.
Palabras reservadas
Seguramente ya hayas copiado y pegado algún código de Arduino de esos que encuentras por
Internet. Al hacerlo, te habrás dado cuenta algunas palabras cambian el color de texto dentro
del IDE de Arduino.
Son palabras reservadas por el lenguaje C++. Cada una de ellas tiene una función específica y
están reservadas por el lenguaje de programación.
Esto quiere decir que no podemos utilizar esos nombres para nombrar una variable por
ejemplo.
Hay más palabras clave que las que hemos visto. Poco a poco te irás familiarizando con ellas
según las vayas necesitando. Lo importante es que si cambia de color en el IDE de desarrollo, es
que es una palabra reservada.
Una función no es más que un trozo de código que se usa frecuentemente dentro de un
programa. El objetivo es facilitar la utilización de ese fragmento de código y que el programa
quede más limpio y legible.
Imagínate que en un programa que estás desarrollando necesitas conocer el área de un círculo.
Esta operación la utilizas en muchos sitios dentro del código. Para calcularlo solo tienes que
multiplicar pi por el cuadrado del radio.
Si traducimos esta fórmula a código quedaría de la siguiente manera.
1 // Area de un círculo
Ahora supón que tienes que utilizar esta línea de código muchas veces en tu programa. Quizás te
interese convertir este fragmento en una función. No voy a mostrarte la implementación, solo te
voy a mostrar la llamada.
1 // Area de un círculo
2 calcularAreaCirculo(radio);
Queda mucho más fácil y mucho más limpio, ¿lo ves? Pero a mi lo que realmente mi interesa es
que entiendas el concepto. En este curso de Arduino, desde el primer momento, vamos a utilizar
funciones y debes ser capaz de entender esta herramienta de programación.
1 Serial.begin(9600);
2 pinMode(6, INPUT);
3 digitalRead(6);
Ahora vamos a centrarnos en la sintaxis a la hora de llamar a una función. Todas las llamadas a
funciones comienzan con el nombre de la propia función. Luego va seguido de un paréntesis
abierto y si la función tiene parámetros, se incluirían a continuación separados por comas.
Por último cerramos el paréntesis y no te olvides del punto y coma para indicar que hemos
terminado con la sentencia.
Los parámetros son información que pasamos a la función para que realice su tarea. En el
ejemplo que hemos visto para calcular el área de un círculo, la función necesita conocer el radio.
Por eso se lo pasamos como parámetro.
1 nombreFuncion();
Y esto es todo lo que necesitas saber, en principio, sobre las funciones. A lo largo del curso de
Arduino se utilizarán muchas funciones con y sin parámetros.
Una variable no es más que una herramienta de programación que nos ayuda a almacenar y
recuperar informaciónen nuestros programas.
Y cuando hablamos de información ¿que se te viene a la memoria? jejejejeje, pues eso, memoria
:)
Imagínate el ejemplo del medidor de nivel de agua en un recipiente. Quieres que tu proyecto
sea capaz de ir controlando el nivel de agua y que en el LCD te muestre el valor máximo al que
ha llegado el agua.
Si queremos saber cual es el nivel máximo de agua, necesitaremos de algún modo guardar la
información del nivel actual y el nivel máximo hasta el momento.
En este punto nos surgen dos cuestiones, ¿cómo guardar esta información en un programa? y
¿cómo recordamos donde está guardada esta información?
Podemos asemejar la memoria a una estantería. En cada hueco de esa estantería guardamos
cosas. Cada hueco, además, tiene un número. Precisamente, ese número sería la variable.
Ya te he dicho que tenemos que almacenar dos datos: el nivel actual de agua y el nivel máximo
que ha alcanzado. Así que en esta estantería, vamos a reservar dos huecos para esos dos datos.
Por ejemplo seleccionamos el hueco 1 para el nivel actual y el 5 para el nivel máximo.
Arrancamos el programa y nos da un nivel de agua de 100 ml (mililitros). Este sería nuestro nivel
actual. En el nivel máximo no tenemos nada almacenado y al comparar el nivel máximo (ningún
ml) con el nivel actual (100 ml), este nivel es mayor.
Debemos parar un momento y reflexionar sobre lo que acabamos de ver. Lo que viene a decir es
que lo que estamos cambiando es el contenido del hueco de la estantería pero el nombre siempre
se mantiene.
Lo mismo ocurre con las variables. Accedes al contenido de la variable y lo modificas pero el
nombre siempre es el mismo. Es decir, el nombre no se refiere al contenido que hay dentro, el
nombre se refiere al espacio de memoria que hay reservado para almacenar información.
Si conoces el nombre de la variable, podrás poner cosas dentro de esa variable para,
posteriormente, hacer uso de esa información. Recuerda, el nombre se refiere a la ubicación no
al contenido que hay dentro.
Tipos de datos
Además de dar un nombre a la variable, tenemos que hacer otra cosa. Tenemos que indicar el
tipo de información que va a almacenar.
No tiene sentido que metas los cuchillos en el hueco de las cucharas de café o los tenedores con
los cuchillos.
Lo lógico y normal es que los clasifiques. Los cuchillos con los cuchillos en un hueco adaptado
para ellos. Los tenedores en otro hueco y las cucharas de café en su hueco especial para ellas.
Si lo haces de otra forma sabes que no va a funcionar. Cuando vayas a buscar un tenedor no vas
a saber dónde está y seguramente tardes más en cogerlo.
Donde quiero llegar es que debemos tener un hueco dentro del cajón para cada tipo de cubiero.
Lo mismo ocurre con las variables, tenemos que especificar el tipo de dato que vamos a
almacenar en cada hueco de memoria.
Si declaras una variable que sólo puede almacenar números enteros, positivos y negativos, no
podrás almacenar un número con decimales como 3,14. Esto produciría un error.
Por lo tanto, cada variable solo podrá almacenar un tipo de dato especificado cuando se declara
dicha variable.
Declaración de variables
Cuando hablo de declarar lo que realmente estamos haciendo es crear una variable. Para
declarar una variable vas a necesitar dos cosas: un nombre y un tipo de dato.
2 int primeraVariable;
En el código anterior he declarado una variable del tipo entero (int) cuyo nombre
es primeraVariable. El tipo de dato int permite almacenar números enteros entre -32.768 y
32.767. A esto se le llama rango.
No hace falta que memorices esta información :). La palabra int es reservada por el lenguaje C++
y como hemos visto antes cambia de color en el IDE de Arduino.
Por cierto, no te olvides del punto y coma al final para indicar que has terminado con la
declaración de la variable.
Para nombrar una variable hay que seguir ciertas reglas. Llevo muchos años programando (más
de 15 años) y he visto de todo :)
A continuación unas reglas básicas que tienes que seguir para nombrar una variable:
Inicialización de variables
Cuando hablo de inicializar una variable no es más que asignar un valor. Todo esto lo tenemos
que hacer una vez que conozcamos el tipo de dato por supuesto. Incluso lo podemos hacer en la
misma línea.
En sentencias separadas.
1 int nivelMaximo;
2 nivelMaximo = 25;
Con esto introducimos algo nuevo. Hasta ahora lo que hemos visto es que declaramos una
variable con el tipo de dato y le damos un nombre. Ahora introducimos el operador de igualdad,
el signo igual (=).
Una declaración de una variable con inicilización a un valor quedaría de la siguiente manera.
Pero el operador de asignación también lo podemos utilizar para asignar un valor.
Como ves es muy sencillo almacenar información en la memoria. Lo primero es conocer que tipo
de dato vamos a guardar. Luego damos un nombre a la variable y asignamos un valor.
Para aprender Arduino tenemos que conocer el lenguaje en el que se programa. Vamos a ver los
7 tipos de datos más importantes de C++, pero no son los únicos.
Entero (int)
Es el tipo de dato más común. En C++ se utiliza la palabra reservada int para declarar un tipo de
dato entero.
1 // Declaración de una variable entero
Puede almacenar un número de 16-bit es decir, 2 bytes (16 unos en binario 1111111111111111).
En total son 65.535 números pero como almacena números positivos y negativos el rango de
un int es de -32.768 a 32.767.
Algo a tener claro con las variables es que si declaras una variable int, estás ocupando 2 bytes de
memoria. Da lo mismo si almacenas el 1 o el 30.000.
Otra particularidad que iremos viendo a lo largo de los tipos de datos es ¿qué ocurre si nos
salimos de rango es decir si intento almacenar el número 32.668?
Lo mismo ocurre por debajo. Si tenemos una variable con el valor -32.768 y restamos uno, el
siguiente número será el mayor positivo, 32.767.
Se que parece increíble pero es así. Cuando declaramos una variable debes ser consciente del
valor que vas a almacenar.
Seguramente hagas operaciones, sumas y restas, y debes ser capaz de intuir los límites para
declarar una variable de un tipo u otro.
Utiliza la misma memoria que una variable int, 2 bytes (16-bit). Lo único que sólo utiliza la parte
entera es decir su rango es de 0 a 65.535.
El funcionamiento es igual, si sumamos uno a una variable cuyo valor es 65.535, el resultado será
0. Si restamos uno a una variable que valga 0, el resultado es 65.535.
Esto dota a este tipo de variables la capacidad de almacenar números solo positivos muy
grandes. Mucho ojo con la memoria ya que es limitada. Debemos hacer un estudio previo para
saber que valores vamos a almacenar.
Decimal (float)
Si quieres almacenar un número decimal con los tipos de datos que hemos visto hasta ahora no
podrías. Para los números con decimales tenemos los números de coma flotante. En C++ se
utiliza la palabra reservada float.
Para separar la parte decimal de la parte entera se utiliza el “.”. Puede resultar extraño ya que
nosotros utilizamos la “,”. Esto es debido a la influencia anglosajona en los lenguajes de
programación.
Con este tipo de datos podemos almacenar valores realmente grandes. El rango es de 3.4028235
x 1038 hasta -3.4028235 x 1038. Eso sí, solo utiliza 4 bytes de memoria (32-bit).
¿Cómo es posible que con un float podamos almacenar números mayores ocupando los
mismos bytes , 4, que unlong por ejemplo?
UNIRSE AL CURSO
Aceptas que almacene tu nombre y email para poder enviarte información de
Programarfacil.
Es debido a como se trata internamente este tipo de datos. Para almacenarlo utiliza la notación
científica.
Esto es beneficioso por un lado, ya que utiliza la memoria de una forma muy eficiente. Por otro
lado es perjudicial ya que aplica un redondeo sin saber muy bien cómo lo hace.
En condiciones normales un float es bueno hasta 6 o 7 cifras incluyendo la parte decimal y la
parte entera.
Byte (byte)
Es el tipo de dato más pequeño que hemos visto hasta ahora. En C++ se utiliza la palabra
reservada byte y como indica su nombre, solo ocupa 1 byte de memoria.
El rango de valores que puede almacenar es de 0 a 255 sin signo. Se puede asignar valores de
diferentes maneras. La más típica es un valor en el sistema decimal pero podemos
también asignar un valor en binario.
Esto último lo hacemos utilizando el formateador B. Indica que después de esta letra viene un
número en sistema bianario.
Booleano (boolean)
Es el tipo de dato que menos memoria ocupa, 1-bit. La palabra reservada en C++ es boolean y
puede tomar dos valores o 1 o 0.
3 boolean boolConCero = 0;
He puesto varios ejemplos para explicar una cosa. Lo primero, 1 equivale a true (verdadero) y 0
equivale a false (falso).
Por otro lado, este tipo de dato es el único que no cumple la regla cuando se sale fuera de su
rango. Como hemos visto anteriormente, cuando salimos por arriba o por abajo empezaríamos
de nuevo.
Con una variable del tipo booleano lo que sucede es que siempre que sea 0 será falso y en caso
contrario será siempre verdadero.
Carácter (char)
El último tipo de dato que vamos a ver en este curso de Arduino es el carácter. Se representa con
la palabra reservada charen C++ y utiliza 1 byte de memoria (8-bit). Nos permite almacenar una
letra de una forma especial.
Realmente estamos almacenando una letra como si fuera un número utilizando el sistema
ASCII. Gracias a una tabla donde viene la correspondencia entre letra y número podemos saber
de qué carácter se trata.
En el ejemplo vemos como podemos asignar un valor a la variable del tipo char de dos
formas. Con la letra entre comillas simples (‘ ‘) o con el código ASCII.
Y con esto terminamos los tipos de datos básicos en Arduino. No son los únicos pero si que son
los más utilizados y con los que más vas a trabajar sobre todo al aprender Arduino.
Un programa empieza con dos funciones vacías, setup() y loop(). Cuanto antes te enfrentes a
ellas, antes vas a aprender Arduino.
Por eso es esencial ahora que estás en la fase de aprender Arduino, entender cómo hacer una
llamada a una función.
Es muy sencillo, sólo tienes que poner el nombre de la función y abrir y cerrar un paréntesis. En
ocasiones, dentro de los paréntesis van los parámetros. Al final del todo el punto y coma.
2 digitalWrite(3, HIGH);
La función digitalWrite nos permite sacar 5V o 0V por un pin. Para hacer esto tenemos que pasar
la información del estado (HIGH serían 5V y LOW sería 0V) además del pin sobre el que queremos
trabajar.
Esto es una llamada a una función típica de Arduino. Debes acostumbrarte con este término lo
antes posible ya que lo utilizarás en muchas ocasiones.
Lo más típico es acudir a la referencia del lenguaje. Es como si fuera una guía o manual de
usuario. Casi todos los lenguajes tienen su referencia.
En Arduino la podemos encontrar en la web oficial. Guarda esta dirección porque la vas a utilizar
más de una vez.
Es cuestión de tiempo que vayas aprendiendo la sintaxis y los parámetros que utilizan las
funciones más comunes en Arduino. Ten paciencia :)
Lo que realmente está haciendo esta función es algo físico. Está activando o desactivando algún
mecanismo electrónico para suministrar 5V o 0V.
Pero existen otro tipo de funciones que nos dan información de un determinado pin. Por
ejemplo, la función digitalRead. Esta función informa en que estado está un pin.
Para almacenar la información del estado del pin utilizamos una variable del tipo entero (int).
Esta función solo puede devolver o HIGH o LOW.
Bien, hasta ahora hemos visto funciones que admiten parámetros pero también hay funciones
que no tienen ningún parámetro. Por ejemplo millis().
Esta función lo que hace es calcular los milisegundos transcurridos desde que la placa de Arduino
empezó a ejecutar el programa. Como ves no necesita ningún parámetro. Por si sola sabe lo que
tiene que hacer.
Devuelve el número de milisegundos que han transcurrido en un entero largo sin signo como
podemos ver en la referencia del lenguaje.
Pero también podemos crear nuestras propias funciones. Imagínate que creas una que nos
permita encender una luz del salón.
2 encenderLuzSalon();
Nosotros solo vemos una parte de la función pero por debajo hay mucha más información. Sin
embargo, al principio sólo tienes que conocer cómo hacer llamadas a funciones. Más adelante
ya serás capaz de programar las tuyas.
Son las funciones más importantes de un programa y esenciales a la hora de aprender Arduino.
Procedimientos de un restaurante
Para que entiendas la función desempeñan setup() y loop() dentro de un programa de Arduino
te voy a poner una analogía, seguro que lo entiendes mejor.
Imagínate que tienes un restaurante de comida rápida. Tu eres el dueño. Normalmente contratas
a estudiantes de la zona para que trabajen unas horas.
Más o menos cada mes tienes algún empleado nuevo al que tienes que formar. Esto te lleva a
tener dos procedimientos:
Procedimiento de apertura.
Procedimiento de atención a un cliente.
Los dos procedimientos están en el restaurante para que los empleados sepan que hacer en esos
momentos.
El procedimiento de apertura indica al trabajador lo que tiene que hacer cuando abre el
restaurante. Por ejemplo, subir el cierre, abrir las puertas, poner el cartel de abierto, sacar los
ingredientes, etc…
Este procedimiento sólo lo hace una vez al día, cuando se abre el restaurante. Una vez terminado,
se guarda en la estantería para la próxima vez que se abra el restaurante.
El segundo procedimiento indica lo que tiene que hacer un empleado cuando llega un cliente
nuevo al restaurante. Es una enumeración de pasos.
Por ejemplo, preguntar cuantos son, buscar una mesa libre, tomar nota de la bebida, tomar nota
de la comida, etc…
Por lo tanto un empleado recurrirá una vez al día al procedimiento de apertura, y cada vez que
venga un nuevo cliente al procedimiento de atención al cliente.
Ahora mismo estás pensando ¿qué tiene que ver un restaurante con Arduino? Bueno, ahora lo
comprobarás, pero un programa de Arduino tiene que hacer cosas similares a las que se hacen
en este restaurante.
La función setup()
En un programa de Arduino, hay cosas que sólo tienen que hacerse una sola vez. Cosas como:
Todas estas tareas se tienen que realizar una sola vez. Podemos decir que son las condiciones
iniciales del programa. Este tipo de tareas son las que van en la función setup().
Vamos a comenzar a ver esta función más en detalle. En primer lugar, al igual que pasaba con las
palabras reservadas o los tipos datos, la función setup() tiene un color especial en el IDE de
Arduino.
Este color indica que el IDE de Arduino identifica esta función como un tipo especial que se utiliza
para el control de la estructura del código. Como toda función tiene un paréntesis que abre y
otro que cierra. Sin embargo esta función no necesita de ningún argumento para operar.
A la izquierda de la palabra setup está la palabra void (significa vacío). Indica que esta función
no devolverá ningún valor o dato.
Por lo tanto, esta función no necesita ningún argumento y no devuelve ningún valor pero si que
hace algo. Su trabajo consiste en ejecutar todo el código que hay dentro de ella. Esto se delimita
con las llaves ({}).
La función setup es lo primero que se ejecuta cuando lanzamos el programa de Arduino. Una
vez que se ejecuta la función setup, el programa irá línea por línea ejecutando cada una de ellas.
Lo más importante de esta función es que SOLO SE EJECUTA UNA VEZ. Esto es muy importante,
el código que hay entre esas dos llaves solo se ejecutará una vez.
La función loop()
En un programa de Arduino, lo siguiente que se ejecuta después de la función setup es la
función loop. Su significado es repetición y la función se parece a la función de setup.
No requiere de ningún argumento pero tiene los paréntesis de apertura y cierre. No devuelve
ningún valor por lo que tiene la palabra void a la izquierda.
A continuación tiene la apertura y cierre de llaves ({}). Al igual que al función setup, cuando se
ejecuta la función loop va línea por línea ejecutándose.
La gran diferencia que existe entre la función setup y loop es que cuando se ejecuta todo el
código de la función loop, el programa vuelve al principio y vuelve a ejecutar todo. Entra en un
bucle sin final una y otra vez.
Sucede lo mismo que en el restaurante con el procedimiento de atención al cliente. Cuando llega
el primer cliente se ejecutan todas las tareas para atenderle. Luego viene otro cliente y se vuelven
a ejecutar las mismas tareas, así indefinidamente.
Una de las preguntas más comunes es ¿cómo de rápido se ejecuta esta función? Esto viene
determinado por cada microcontrolador. En el caso de Arduino UNO, el microcontrolador que
utiliza es el ATmega328P y tiene una velocidad de 20MHz (megahercios).
Esto equivale a 20.000.000 de instrucciones por segundo. Sí, has leído bien, 20 millones :).
Esto no quiere decir que son 20 millones de línea de código. Te recuerdo que el código que tu
escribes luego se traduce a código máquina.
Cada línea de código que tu escribes se puede traducir a múltiples instrucciones pero aún así, si
tenemos 1.000 instrucciones tardaría 0,00005 segundos. ¿Puedes imaginarte lo rápido que
va?
Sin embargo, la analogía con el restaurante no encaja perfectamente con la función loop. El
empleado siempre va a esperar a que llegue un nuevo cliente para iniciar el procedimiento. Esto
no sucede en la función loop.
En el programa de Arduino, siempre que se llegue a la última línea de código de la función loop,
volverá al principio para volver a ejecutar todo. No se espera a cualquier entrada externa para
hacerlo.
Y con esta explicación sobre la función setup y loop damos por terminado este curso de Arduino
desde cero.