Ejercicio 2: apéndice

A estas alturas somos unos expertos en el arte de hacer que un LED se encienda o se apague, hemos visto la estructura de un Sketch y hemos utilizado los comandos más usuales en los ejemplos de programación de Arduino.

En este apéndice repasaremos los comandos vistos hasta ahora, su función, su sintaxis y disiparemos algunas dudas sobre ellos.

En los WorkShops suelo preguntar a los asistentes quien tiene conocimientos de C, a los que levantan la mano les digo que ya saben programar un Arduino. Naturalmente no es cierto, es una broma, pero no está alejado de la realidad. Como ya hemos visto la estructura de un Sketch es la misma que la de un programa en C y el lenguaje de programación de Arduino, Wired, es un derivado de C, sin embargo las particularidades de Arduino hacen que Wired tenga unos comandos muy específicos que la gente que ha programando en C no ha visto nunca.

Arduino no utiliza como entrada un teclado y como salida una pantalla (la configuración más habitual en ordenadores), si no que se conecta directamente a su entorno físico o a periféricos que serán los que interactuarán con el entorno físico. Arduino es un ordenador que enciende y apaga luces, mueve cosas, mide temperaturas, presiones, emite sonidos y se comunica con otros dispositivos. Estas capacidades requieren que los comandos con los que es programado sean específicos para estas tareas de la misma forma que el C de consola tiene comandos específicos para leer datos de un teclado y mostrar resultados por pantalla.

Empecemos:

1
pinMode (número-de-pin, modo);

El comando pinMode() sirve para establecer a cada pin de entrada o salida digital que vayamos a utilizar el modo en el que lo haremos, es decir, declararemos un pin identificado por su número como entrada o como salida.

El número del pin se puede introducir tal cual está serigrafiado en la placa (del 0 al 13) , pero es muy recomendable introducirlo como una variable, constante o definición con el valor introducido previamente en la parte del Sketch en la que se hace la definición de variables. Esto nos permitirá cambiar su valor sin tener que repasar todo el código para cambiar el número de pin de forma manual y en las ocasiones en las que trabajamos con cables y, por la razón que sea, los queremos cambiar de pin resulta sumamente práctico.

Como modo pondremos OUTPUT o INPUT dependiendo de si queremos que el pin sea una salida o una entrada digital. En mayúsculas, recordemos que en este lenguaje se hace distinción entre mayúsculas y minúsculas, si escribimos una palabra mal el compilador nos dará un error.

Declararemos solo los pines que vayamos a utilizar, no tiene sentido declarar pines a los que no vamos a conectar a nada. ¿Que pasa con los pines que no declaramos? por definición Arduino trata a todos los pines como entradas a menos que especifiquemos lo contrario, esto significa que los pines que vayamos a utilizar como entradas no sería necesario declararlos con el comando pinMode(), solo los que vayamos a utilizar como salidas. Pero esto último no es nada recomendable, de hecho casi sería mejor que no lo hubiera dicho.

No cuesta nada declarar cada pin que utilice el Sketch como entrada o salida en el setup() y si lo documentamos correctamente ganamos en claridad y limpieza. Esto es especialmente útil si vamos a publicar nuestro Sketch o si lo vamos a tener que volver a editar en el futuro.

1
2
pinMode (pulsador, INPUT);  // declara el pin al que está conectado el
//pulsador como entrada

Este ejemplo es perfectamente comprensible para todo el que lo lee hoy y dentro de seis meses, si no lo hacemos así y suponemos que un pin está conectado a un pulsador y trabajamos con el directamente será difícil de entender por otra persona… en unos meses incomprensible incluso para nosotros.

1
digitalWrite (número-de-pin, estado);

El comando digitalWrite() sirve para establecer la salida digital en el pin que establezcamos. Para el parámetro del número de pin digital sirve todo lo dicho en la explicación del comando pinMode(), mejor desde una variable, constante o definición y por los mismos motivos.

Este comando sólo admite dos estados HIGH o LOW, alto o bajo y que se corresponden con un 1 ó un 0. De hecho podríamos introducir el comando de las siguientes formas:

1
2
3
digitalWrite(pin, HIGH);   // la forma correcta de hacerlo
digitalWrite(pin, 1);   // no es nada conveniente hacerlo así
digitalWrite(pin, estado);   // donde estado es una variable

En el último caso la variable de nombre estado, declarada en la cabecera del Sketch, puede ser del tipo entero (int) y contener un 0 o un 1 o asignarle los valores HIGH o LOW. Incluso puede ser una variable de tipo boolean y contener un TRUE equivalente a un HIGH o un FALSE que equivaldría a un LOW. Como se puede ver tenemos unas posibilidades inmensas para trabajar con las salidas de forma matemática, aunque eso lo dejaremos para más adelante.

De momento usaremos siempre HIGH o LOW o estos mismos valores contenidos en una variable del tipo entero (int) para que nuestro código sea limpio y comprensible.

Eléctricamente un nivel HIGH de corresponde a +5v en la salida del pin y el nivel LOW a 0v, con una pequeña tolerancia, por lo que las medidas con el multímetro entre el pin y GND pueden oscilar entre 4’9v y 5’1v para HIGH y 0v y 0’1v para LOW.

Los modelos de Arduino que trabajan a 3’3v tienen esta misma salida para el nivel HIGH.

1
delay(número);

El comando delay() detiene la ejecución del Sketch durante el tiempo que le especifiquemos expresado en milisegundos.

Generalmente utilizaremos este comando de forma muy limitada precisamente por esa característica suya de detener completamente la ejecución del Sketch. Es útil en algunos procesos de comunicación para darle tiempo a un periférico a que procese la información que le mandamos y nos devuelva un resultado o para impedir rebotes en la lectura de sensores, y en estos casos el intervalo de tiempo lo introduciremos de forma directa como un número.

Si necesitamos pasarle al comando delay() el tiempo dentro de una variable hay que tener en cuenta que esta debe ser del tipo unsigned long, es decir, un número de 32 bits sin signo (veremos lo que esto significa en el siguiente comando).

1
millis();

El comando millis() nos devuelve el número de milisegundos que han transcurrido desde la última vez que Arduino se puso en funcionamiento y el momento en el que se ejecuta este comando.

El valor que nos devuelve es del tipo unsigned long, un número entero sin signo de 32 bits cuyo valor puede ser de 0 a 4,294,967,295. Cuando el temporizador interno de Arduino supera ese valor máximo vuelve a empezar desde 0, esto hay que tenerlo en cuenta en los sistemas conectados permanentemente y que hacen uso de este comando, pues el valor de retorno de millis() desborda cada 50 días.

El comando millis() no acepta parámetros dentro del paréntesis, si intentamos darle alguno el compilador nos devolverá un error. Sin embargo forma parte de su sintaxis y, aunque vacío, no debemos olvidar nunca los paréntesis.

 

Y con esto terminamos la aburrida teoría por ahora, vamos a hacer cosas chulas: para el próximo ejercicio necesitaremos un servo y un potenciómetro de 10KOhms.

3 Comments

  1. explicaciones claras y redacción amena, muy bueno!! ha sido de gran utilidad,
    GRACIAS

  2. Gracias por tu aportación, es muy clara sin tanto rollo

  3. Buena explicación , buen detalle

Deja un comentario

Required fields are marked *.