Módulo 4: Primeros pasos en Arduino

1. Temario

4.1. Lógica de programación de Arduino
4.2. Tipos de datos
4.3. Variables
4.4. Operadores
4.5. Primer programa con Visualino

2. Introducción al módulo

¡Llegamos al módulo 4 y último de este curso!

Hemos visto a lo largo del curso las distintas herramientas que podemos utilizar para trabajar con nuestro Arduino. Para empezar a desarrollar nuestros códigos nos corresponde ahora entender los tipos de datos, operadoras, estructuras y funciones que nos ayudarán con la lógica de la programación. 

En resumen, en este módulo 4 realizaremos pequeños sketchs de programación en bloques. Veremos tipos de datos y operadores, estructuras y funciones, módulos y sensores. Finalmente, abordaremos algunos ejemplos. ¡Adelante! 

3. Desarrollo de contenido

4.1. Lógica de programación con Arduino

¿Cómo el microcontrolador sabe cuánto tiempo pasa? Para el funcionamiento del microcontrolador, es vital generador de reloj o un cristal de cuarzo. Es un oscilador, también es un reloj. (Clock en inglés es reloj). 

Las placas Arduino suelen tener un oscilador de 16 MHz, el generador de reloj hace algo muy simple: acciona el microcontrolador a su propia frecuencia de reloj, es decir, un cristal de 16 MHz acciona el microcontrolador 16 millones de veces por segundo.  y así navega en el tiempo. 

Una de las funciones de retardo de tiempo más simple es delay()

delay (tiempo) Suspende la ejecución del código por milisegundos. Durante delay() el código no se ejecuta.

1 segundo [s] son 1000 milisegundos [ms] 

Otra consideración importante es la manera en la que se programa, si bien es cierto que el lenguaje de programación, y lo que finalmente se “carga” en el microcontrolador, es un lenguaje estructurado; la idea, la lógica y la manera de organizar esas acciones no necesariamente deben pensarse a nivel de código.

Existen herramientas para organizar y dar forma a los procesos que ayudan a la lectura previa a escribir el código en el lenguaje correspondiente.

Estas herramientas son: diagramas de flujo y pseudocódigo. Los diagramas de flujo permiten organizar las acciones necesarias y principales en bloques unidos por flechas que, de manera rápida, permiten distinguir cuáles serán las ejecuciones, decisiones, retornos, etc.; todo escrito en lo que se conoce como “lenguaje humano” legible por todos, sin conocimientos de un lenguaje de programación. 

En la siguiente imagen vemos un ejemplo de diagrama de flujo y a la derecha, la simbología asociada:

Consideraciones y requisitos

Entre llaves

Las llaves sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan para los bloques de programación setup(), loop(), if.., etc. Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”

Punto y coma

El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de programación C. También se utiliza para separar elementos en una instrucción de tipo “bucle for”. Si olvidamos poner un punto y coma al fin de una línea se producirá en un ERROR de COMPILACIÓN.

// línea de comentarios

Una línea de comentario se utiliza frecuentemente después de una instrucción, para proporcionar más información acerca de lo que hace esta o para recordarla más adelante.

/*… */ bloque de comentarios

Los bloques de comentarios, o comentarios multi-línea son áreas de texto ignorados por el programa que se utilizan para las descripciones del código o comentarios que ayudan a comprender el programa. Debido a que los comentarios son ignorados por el compilador y no ocupan espacio en la memoria de Arduino pueden ser utilizados con generosidad.

Existe una guía de estilo para escribir código claro de Arduino y que sea fácil de entender. No es obligatorio, pero es una recomendación: Documentar al máximo Usar esquemas Predominar la facilidad de lectura sobre la eficiencia del código Poner el setup() y loop() al principio del programa Usar variables descriptivas Explicar el código al principio Usar identación

Estructura sketch 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.

Estructura básica de un sketch de 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.
void setup() { … } void loop() { … }

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 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.

En resumen

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.

4.2. Tipos de datos

En programación, un tipo de dato es un atributo que le indica al ordenador (y/o al programador) la clase de datos que se va a trabajar. Esto incluye imponer restricciones en los datos, como qué valores pueden tomar y qué operaciones se pueden realizar. Los tipos de datos comunes son: números enteros, números con signo (negativos), números de coma flotante (decimales), cadenas alfanuméricas, estados (booleano), etc.

byte
Byte almacena un valor numérico de 8 bits sin decimales. Tienen un rango entre 0 y 255. Sin signo.  

int (entero)
Enteros son un tipo de datos primarios que almacenan valores numéricos de 16 bits sin decimales comprendidos en el rango 32,767 a -32,768.

long (entero largo)
El formato de variable numérica de tipo extendido “long” se refiere a números enteros (tipo 32 bits = 4 bytes) sin decimales que se encuentran dentro del rango -2147483648 a 2147483647.

float (decimales)
El formato de dato del tipo “coma flotante” o “float” se aplica a los números con decimales. Los números de coma flotante tienen una mayor resolución que los de 32 bits que ocupa con un rango comprendido 3.4028235E+38 a -3.4028235E+38.

Los números de punto flotante no son exactos, y pueden producir resultados extraños en las comparaciones. Los cálculos matemáticos de coma flotante son también mucho más lentos que los del tipo de números enteros, por lo que debe evitarse su uso si es posible. En Arduino el tipo de dato double es igual que el float.

char (carácter)
Un char representa un carácter que ocupa 1 byte de memoria. Los caracteres simples se representan con comillas simples ‘a’ y para múltiples caracteres o strings se representan con comillas dobles “Hola!”.

Recordar que los caracteres se almacenan como números usando la codificación ASCII, lo que significa que es posible hacer operaciones aritméticas con los caracteres.

4.2. Variables

Una variable es un lugar donde almacenar un dato, tiene un nombre, un valor y un tipo.
Los nombres de variables pueden tener letras, números y el símbolo ’_’. Deben empezar por una letra 

Declaración de variables

Una variable tiene un nombre, un valor y un tipo. Con la asignación, se puede cambiar el valor de la variable.

Todas las variables deben ser declaradas antes de su uso. Las declaraciones deben aparecer al principio de cada función o bloque de sentencias.

Al declarar una variable se debe indicar primero el tipo de variable y luego su nombre, opcionalmente se le puede dar un valor, lo que se llama inicializar la variable.

Las variables pueden inicializarse en la declaración:
float pi=3.1416;
unsigned long contador=0;

Ámbito de una variable

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ó

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().

4.4. Operadores

Un operador es un elemento de programa que se aplica a uno o varios operandos en una expresión o instrucción. Un operador, es un símbolo que indica al compilador que se lleve a cabo ciertas manipulaciones matemáticas o lógicas.

4.4.1. Aritméticos

Los operadores aritméticos que se incluyen en el entorno de programación son suma, resta, multiplicación, división, módulo y asignación.

La operación se efectúa teniendo en cuenta el tipo de datos que hemos definido para los operandos (int, double, float, etc..), por lo que, por ejemplo, si definimos 9 y 4 como enteros “int”, 9 / 4 devuelve de resultado 2 en lugar de 2,25 ya que el 9 y 4 se valores de tipo entero “int” (enteros) y no se reconocen los decimales con este tipo de datos.

4.4.2. Compuestos

Las operadores compuestos combinan una operación aritmética con una variable asignada. Estas son comúnmente utilizadas en los bucles tal como se describe más adelante. Estas asignaciones compuestas pueden ser:

++, – –
+= , -= , *= , /=

4.4.3. Comparación

Operadores de comparación. Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las estructuras condicionales del tipo if, while, etc.. para testear si una condición es verdadera.

==, !=, <, >, <=, >=

4.4.4. Booleanos

Los operadores lógicos o booleanos son usualmente una forma de comparar dos expresiones y devuelve un VERDADERO o FALSO dependiendo del operador. Existen tres operadores lógicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan en estamentos de tipo if.

4.4.5. Entradas y salidas digitales

pinMode(): configura en el pin especificado si se va a comportar como una entrada o una salida.

digitalWrite(): Escribe  un valor HIGH o LOW en el pin digital especificado. Si el pin está configurado como OUTPUT pone el voltaje correspondiente en el pin seleccionado. Si el pin está configurado como INPUT habilita o deshabilita la resistencia interna de pull up del correspondiente pin.

digitalRead(): Lee el valor del pin correspondiente como HIGH o LOW.

4.5. Primer programa con Visualino

Parpadear Led:

Ejemplos ARDUINO IDE

Salidas digitales
Entradas digitales

Salida digital I
Led (pin13) parpadea cada 1 segundo
led = encendido;
pausa = 1 segundo;
led = apagado;
pausa = 1 segundo;

4. Cierre del módulo

¡Terminamos el módulo 4! Haciendo un breve resumen, en este módulo realizamos pequeños sketchs de programación en bloques. Vimos tipos de datos y operadores, estructuras y funciones, módulos y sensores.

Te invitamos a avanzar al cuestionario y la actividad final, ¡adelante!