Archivo de la categoría: Sketch

Programación Arduino

El lenguaje de programación de Arduino es C++. No es un C++ puro sino que es una adaptación que proveniente de avr-libc que provee de una librería de C de alta calidad para usar con GCC (compilador de C y C++) en los microcontroladores AVR de Atmel y muchas utilidades opensource específicas para las MCU AVR de Atmel como avrdude: https://learn.sparkfun.com/tutorials/pocket-avr-programmer-hookup-guide/using-avrdude

Las herramientas necesarias para programar los microcontroladores AVR de Atmel son avr-binutils, avr-gcc y avr-libc y ya están incluidas en el IDE de Arduino, pero cuando compilamos y cargamos un sketch estamos usando estas herramientas.

Aunque se hable de que hay un lenguaje propio de programación de Arduino, no es cierto, la programación se hace en C++ pero Arduino ofrece unas librerías, también llamado core, que facilitan la programación de los pines de entrada y salida y de los puertos de comunicación, así como otras librerías para operaciones específicas. El propio IDE ya incluye estas librerías de forma automática y no es necesario declararlas expresamente. Otra diferencia frente a C++ standard es la estructuctura del programa ya que no usa la función main(), sino que usa las funciones setup() y loop().

En el 99% de los casos se puede hacer un proyecto de Arduino de cierta complejidad con la librería que nos ofrece el core de Arduino y no es necesario añadir más instrucciones ni tipos de datos que los que hay en el core. Toda la información para programar con el core de Arduino se encuentra en el reference de la web de Arduino: https://www.arduino.cc/en/Reference/HomePage

Una buena chuleta para tener a mano cuando programemos. Cheat Sheet: https://dlnmh9ip6v2uc.cloudfront.net/learn/materials/8/Arduino_Cheat_Sheet.pdf

Lenguaje de programación C++

Es posible usar comandos estándar de C++ en la programación de Arduino siempre que estén incluidos en el avr libc:

En Internet hay muchas webs de referencia donde consultar dudas a la hora de programar en C++:

Un manual sencillo de entender para la programación es el “arduino programming notebook” de brian w. Evans. Puedes consultarlo o descargarlo desde:

Cuando compilamos y cargamos el programa en Arduino esto es lo que ocurre:

Variables

Una variable puede ser declarada al inicio del programa antes de la parte de configuración setup(), a nivel local dentro de las funciones, y, a veces, dentro de un bloque, como para los bucles del tipo if.. for.., etc. En función del lugar de declaración de la variable así se determinará el ámbito de aplicación, o la capacidad de ciertas partes de un programa para hacer uso de ella.

Una variable global es aquella que puede ser vista y utilizada por cualquier función y estamento de un programa. Esta variable se declara al comienzo del programa, antes de setup().

Recordad que al declarar una variable global, está un espacio en memoria permanente en la zona de static data y el abuso de variables globales supone un uso ineficiente de la memoria.

Una variable local es aquella que se define dentro de una función o como parte de un bucle. Sólo es visible y sólo puede utilizarse dentro de la función en la que se declaró. Por lo tanto, es posible tener dos o más variables del mismo nombre en diferentes partes del mismo programa que pueden contener valores diferentes, pero no es una práctica aconsejable porque complica la lectura de código.

En el reference de Arduino hay una muy buena explicación del ámbito de las variables: http://arduino.cc/en/Reference/Scope

El modificador de variable static, es utilizado para crear variables que solo son visibles dentro de una función, sin embargo, al contrario que las variables locales que se crean y destruyen cada vez que se llama a la función, las variables estáticas mantienen sus valores entre las llamadas a las funciones.

Los tipos de variables en Arduino son:

Además de usar este tipo de datos que son los que aparecen en el reference de Arduino (https://www.arduino.cc/en/Reference/HomePage), es posible usar cualquier tipo de variable de C++ estándar con las limitaciones propias de cada micorcontrolador.

Tipos de variables estándar en C++:

Más información sobre los tipos de variable Arduino en: https://aprendiendoarduino.wordpress.com/2016/06/29/tipos-de-datos-2/

Arrays

Un array es un conjunto de valores a los que se accede con un número índice. Cualquier valor puede ser recogido haciendo uso del nombre de la matriz y el número del índice. El primer valor de la matriz es el que está indicado con el índice 0, es decir el primer valor del conjunto es el de la posición 0. Un array tiene que ser declarado y opcionalmente asignados valores a cada posición antes de ser utilizado.

Para manejar arrays en C++ dispones de las funciones estándar: http://www.cplusplus.com/reference/array/array/

string (char array)

Un string es un array de chars. Cuando se trabaja con grandes cantidades de texto, es conveniente usar un array de strings. Puesto que los strings son en si mismo arrays de chars.

Reference de Arduino para string: https://www.arduino.cc/en/Reference/String

Para manejara strings (char array) disponemos de las funciones de string.h que define diversas funciones para manipular strings y arrays http://www.cplusplus.com/reference/cstring/

También es posible usar la clase string de C++: http://www.cplusplus.com/reference/string/string/

Más información para aclarar la diferencia entre string y la clase string: https://www.tutorialspoint.com/cplusplus/cpp_strings.htm

String (Objeto)

Se trata de una clase que permite usar y manipular cadenas de texto de una forma más sencilla que los strings. Puedes concatenar, añadir, buscar, etc… usando los métodos/funciones que ofrece esta clase.

Toda la información de la clase String en el reference de Arduino https://www.arduino.cc/en/Reference/StringObject

Los Strings tienen un uso intensivo de memoria, pero son muy útiles y se van a utilizar mucho en el apartado de comunicación, por ese motivo es importante aprender a manejar los Strings.

Tener en cuenta que al no ser un tipo de dato propiamente dicho sino una clase, tienes unas funciones asociadas (métodos), operadores y unas propiedades. Es una abstracción del dato y para aprender a usarlo hay que leerse la documentación correspondiente.

Operadores

El core de Arduino ofrece una serie de operadores según su reference:

Pero además es posible usar los operadores estnándar de C /C++ y más información: http://es.wikipedia.org/wiki/Anexo:Operadores_de_C_y_C%2B%2B

Estructuras de control

Las estructuras de control en Arduino según el reference son:

Funciones definidas por usuario

Una función es un bloque de código que tiene un nombre y un conjunto de instrucciones que son ejecutadas cuando se llama a la función. Son funciones setup() y loop() de las que ya se ha hablado.

Las funciones de usuario pueden ser escritas para realizar tareas repetitivas y para reducir el tamaño de un programa. Segmentar el código en funciones permite crear piezas de código que hacen una determinada tarea y volver al área del código desde la que han sido llamadas.

Más información sobre las funciones en C++: http://www.cplusplus.com/doc/tutorial/functions/

Ejercicio: http://jecrespo.github.io/PrimerosPasosArduino/

Anuncio publicitario

Primer proyecto: “blink”

En lugar del clásico “hola mundo” que es el primer programa que se hace cuando se aprende un lenguaje de programación, en Arduino el equivalente es el proyecto blink.

El primer programa o sketch será hacer parpadear el led integrado que lleva Arduino u otro led conectado a un pin digital a través de una resistencia.

NOTA: en caso de usar un led, no olvidar poner una resistencia con un valor entre 220 ohms y 1K ohms

Este es el esquema a usar:

Conexiones internas de la protoboard son así:

Como usar una protoboard o breadboard: https://learn.sparkfun.com/tutorials/how-to-use-a-breadboard

Pasos a seguir:

  • Abrir la aplicación Arduino
  • Abrir el ejemplo blink

  • Leer el programar y entender lo que está haciendo
  • Seleccionar la placa y el puerto adecuado

  • Cargar el programa pulsando el botón “subir”. El programa se compila y luego se verá parpadeando los leds Tx y Rx de Arduino, indicando que se está cargando el fichero binario (.hex) en la flash del Arduino. Cuando aparezca el mensaje “subido” habremos acabado.
  • Unos segundos después veremos el LED parpadeando.

Una explicación completa del proyecto y enlaces a las funciones usadas está en: http://arduino.cc/en/Tutorial/Blink

Probar a cambiar el valor de delay para hacer parpadear el led más rápido o más lento.

Práctica: Mejora blink con impresión en consola

Modificar el programa para que cada vez que encienda y apague imprima por el puerto serie la cadena “encendido”, “apagado” cuando corresponda. Luego guardarlo en nuestro entorno de trabajo.

Será necesario usar la librería Serial: http://arduino.cc/en/Reference/Serial

NOTA: Cuando programamos en cualquier lenguaje sobre un ordenador, para interaccionar con el programa usamos el standard input que generalmente es el teclado y el programa muestra los resultados por el standard output que en general es la pantalla. En Arduino esto no es así, sino que para interaccionar con el programa creado se hace a través de la comunicación del puerto serie entre arduino y el ordenador mediante el cable USB que hemos conectado. En este caso la salida del programa manda una cadena de texto por el puerto serie que podemos leer gracias al monitor serie.

Solución:  El código de la solución se encuentra en: https://github.com/jecrespo/Aprendiendo-Arduino/blob/master/Ejercicio01-Blink/Ejercicio01-Blink.ino

Práctica: Arduino Serial Plotter

Desde la versión 1.6.6 del IDE de Arduino disponemos de la herramienta Arduino Serial Plotter que hace la gráfica de los datos mandados por puerto serie.

Hacer la gráfica con Arduino Serial Plotter de la función y=x*x y otra con la lectura de una entrada analógica y ver la gráfica en el Serial Plotter.

Ver código en https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio45-Serial_Plotter

Práctica: Digital Read Serial

Monitorizar el estado de un botón (pulsado/no pulsado) con Arduino y mostrarlo por el monitor serie.

Revisar el código del programa DigitalReadSerial de los ejemplos en Basis. Cargar y ejecutar en Arduino.

Esquema de conexión:

Explicación completa de la práctica: http://arduino.cc/en/Tutorial/DigitalReadSerial

¿Que valores lee si dejo al aire la entrada digital 2?

Más prácticas

El IDE de Arduino trae muchos ejemplos que podemos ver y probar: https://www.arduino.cc/en/Tutorial/BuiltInExamples

Las 10 primeras cosas que debes hacer con tu arduino: http://antipastohw.blogspot.com.es/2009/12/first-10-things-everyone-does-with.html

Estructura sketch en Arduino

Un programa de Arduino se denomina sketch o proyecto y tiene la extensión .ino. Importante: para que funcione el sketch, el nombre del fichero debe estar en un directorio con el mismo nombre que el sketch.

No es necesario que un sketch esté en un único fichero, pero si es imprescindible que todos los ficheros estén dentro del mismo directorio que el fichero principal y que este contenga obligatoriamente las funciones setup() y loop().

void setup() {

 // put your setup code here, to run once:

}

void loop() {

 // put your main code here, to run repeatedly:

}

La estructura básica de un sketch de Arduino es bastante simple y se compone de al menos dos partes. Estas dos partes son obligatorios y encierran bloques que contienen declaraciones, estamentos o instrucciones.

Adicionalmente se puede incluir una introducción con los comentarios que describen el programa y la declaración de las variables y llamadas a librerías.

setup() es la parte encargada de recoger la configuración y loop() es la que contiene el programa que se ejecuta cíclicamente (de ahí el término loop –bucle-). Ambas funciones son necesarias para que el programa trabaje.

La función de configuración (setup) debe contener la inicialización de los elementos y esta función sólo se ejecuta una vez justo después de hacer el reset y no se vuelve a ejecutar hasta que no haya otro reset. Es la primera función a ejecutar en el programa y se utiliza para configurar, inicializar variables, comenzar a usar librerías, etc…

La función bucle (loop) contiene el código que se ejecutará continuamente (lectura de entradas, activación de salidas, etc). Esta función es el núcleo de todos los programas de Arduino y se usa para el control activo de la placa. La función loop se ejecuta justo después de setup.

La estructura del sketch está definida en el siguiente enlace: http://arduino.cc/en/Tutorial/Sketch

Los componentes principales de un sketch de Arduino son:

  • Variables, son un espacio en memoria donde se almacenan datos y estos datos pueden variar.
  • Funciones, son un trozo de código que puede ser usado/llamado desde cualquier parte del sketch. A la función se le puede llamar directamente o pasarle unos parámetros, en función de cómo esté definida.
  • setup() y loop(), son dos funciones especiales que es obligatorio declarar en cualquier sketch.
  • Comentarios, fundamentales para documentar el proyecto

Se puede resumir un sketch de Arduino en los siguientes diagramas de flujo:

Diagrama de flujo del sketch blink:

Por ejemplo para un robot que esquiva obstáculos, el diagrama sería:

Y en un caso más complejo, este puede ser el diagrama de flujo de un sistema de control de acceso mediante lectura de tarjetas RFID:

El código asociado a este diagrama se puede encontrar en http://geekchickens.blogspot.com.es/2014/01/control-de-acceso-con-lector-de.html

Proyectos

ArduinoCommunityLogo_EPS

Vamos a experimentar con Arduino y comprobar su funcionamiento. El procedimiento a seguir en cada práctica es:

  • Entender que vamos a hacer y leer la documentación de las instrucciones que se van a usar.
  • Leer el código del sketch y tratar de entender lo que hace. No es necesario entender todo al 100% pero tenemos que intentar comprender lo que hace el programa según el enunciado.
  • Copiar el sketch y cargarlo en Arduino
  • Ejecutar el sketch y abrir el monitor serie. Comprobar cómo funciona.
  • Hacer pequeños cambios en el sketch para cambiar el comportamiento y comprobar si cambia el comportamiento según lo esperado.

Leer una entrada digital

Leer el estado de la entrada digital 2 (pin 2) y mandar por el puerto serie su estado.

Explicación: http://www.arduino.cc/en/Tutorial/DigitalReadSerial

Instrucciones usadas:

Código: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio04-DigitalReadSerial

Tabla ASCII

Escribir por el puerto serie la tabla ASCII con el carácter y su valor en decimal, hexadecimal, octal y binario.

Explicación: http://www.arduino.cc/en/Tutorial/ASCIITable y tabla ascii: http://www.asciitable.com/

Instrucciones usadas:

Código: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio06-ASCII

Regular la intensidad del built-in led

Regular la intensidad del led en función del valor que escribamos desde el monitor serie. Arduino va a leer los datos que recibe del puerto serie. A mayor valor más intensidad.

Instrucciones usadas:

Código ejemplo sencillo: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio07-dimmer

Instrucciones usadas:

Código mejorado: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio07b-dimmer_mejorado

Leer una entrada analógica

Leer de una entrada analógica y sacar por el puerto serie el valor leído y también el voltaje que está leyendo. Luego escribir en el built-in led el valor correspondiente a lo leído.

Explicación: http://www.arduino.cc/en/Tutorial/AnalogReadSerial

Instrucciones usadas:

Código: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio11-Analog

Blink sin delay

Hacer el programa blink pero sin usar la instrucción delay() ya que su uso supone que no es posible hacer otra cosa durante el tiempo que dura el delay.

Explicación y código: http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Instrucciones usadas:

Otra opción usando librerías: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio19-BlinkSinDelay

Análisis de caracteres

Otro ejemplo más de lectura puerto serie: http://www.arduino.cc/en/Tutorial/CharacterAnalysis

Memoria Arduino

Medir el tiempo en milisegundos que tarda Arduino en leer de la memoria RAM un texto grande y luego escribirlo por el puerto serie y luego hacer lo mismo pero el texto está guardado en la memoria flash.

Al compilar fijarse en lo que ocupa la memoria dinámica.

Ver la macro F: https://www.arduino.cc/en/Reference/PROGMEM

Código: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Otros/velocidadMemoria

Más información sobre la memoria de Arduino en: https://aprendiendoarduino.wordpress.com/2015/03/29/memoria-flash-sram-y-eeprom/

EEPROM

Leer y borrar la EEPROM de nuestro Arduino.

Leer: https://www.arduino.cc/en/Reference/EEPROM

Código:

Más ejemplos de Arduino en los built-examples que están en el IDE y están documentados en: http://www.arduino.cc/en/Tutorial/BuiltInExamples

Uso de Arduino en I+D

Veamos un ejemplo de uso de Arduino en una empresa riojana para desarrollo de nuevos productos. Artículos aparecidos en prensa:

Si analizamos los dispositivos que se ven en la imagen:

Primer programa/sketch de Arduino

En lugar del clásico “hola mundo” que es el primer programa cuando se aprende un lenguaje de programación, en Arduino el equivalente es el sketch blink.

Nuestro primer programa será hacer parpadear el led integrado que lleva Arduino (built-in led).

Este es el esquema a usar, pero el led marcado como L está también conectado al pin 13 (en el caso del Arduino UNO) y no es necesario poner un led adicional.:

Pasos a seguir:

  • Abrir la aplicación Arduino
  • Abrir el ejemplo blink

blink

  • Seleccionar la placa y el puerto adecuado

blink2

  • Cargar el programa pulsando el botón “subir”. El programa se compilará y luego se verá parpadeando los leds Tx y Rx de Arduino, indicando que se está cargando el fichero binario (.hex) en la flash del Arduino. Cuando aparezca el mensaje “subido” habremos acabado.
  • Unos segundos después veremos el LED parpadeando.

Una explicación completa del proyecto y enlaces a las funciones usadas está en: http://arduino.cc/en/Tutorial/Blink

Constantes definidas en el IDE Arduino: https://www.arduino.cc/en/Reference/Constants

Demos un paso más y modifiquemos el sketch para que parpadee más rápido y más lento. Modificar el valor de delay y volver a compilar y subir a Arduino.

Vamos a ampliarlo y modificar el programa para que cada vez que encienda y apague saque por el puerto serie la cadena “encendido”, “apagado” cuando corresponda. Luego guardarlo en nuestro entorno de trabajo.

Será necesario usar la librería Serial: http://arduino.cc/en/Reference/Serial

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/blob/master/Ejercicio01-Blink/Ejercicio01-Blink.ino

El IDE trae muchos ejemplos que podemos ver y probar: https://www.arduino.cc/en/Tutorial/BuiltInExamples