ARD02 – El primer sketch

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Vamos a crear un sketch muy simple, que permita que Arduino encienda y apague, de forma intermitente un LED. Un LED es, como seguramente ya sabes, un diodo emisor de luz. Cuando se aplica una tensión continua adecuada, con la polaridad correcta, el LED se enciende. En general, el aspecto de un LED responde al de la figura 2.1. Como puedes ver, uno de los terminales es más largo que el otro.

Figura 2.1. Un diodo LED verde en el que se distingue el ánodo y el cátodo.

Figura 2.1. Un diodo LED verde en el que se distingue el ánodo y el cátodo.

A ese terminal, llamado ánodo, se le aplica el polo positivo de la fuente de tensión. Al otro terminal, el cátodo, se le aplica la masa.

Los LED se fabrican en diferentes colores y tamaños, y se venden en tiendas especializadas en electrónica a muy bajo coste (apenas unos céntimos).

Dado que Arduino funciona con 5V no podemos conectar, directamente el LED a una salida de la placa, ya que se quemaría. Usaremos una resistencia para absorber el exceso de tensión, de forma que el LED funcione perfectamente. En el Apéndice A algunos conceptos básicos de electrónica, para aquellos que no estéis familiarizados con estas cuestiones. En nuestro caso emplearemos una resistencia de 330 ohmios.

 

EL MONTAJE

El montaje completo, empleando la placa protoboard queda como se aprecia en la figura 2.2.

Figura 2.2. Un LED conectado a Arduino mediante el empleo de placa Protoboard.

Figura 2.2. Un LED conectado a Arduino mediante el empleo de placa Protoboard.

Como ves, el cátodo del LED se conecta a la masa (GND). El ánodo se conecta a través de una resistencia, al pin 8 de los digitales de Arduino.

La parte física ya está lista. Ahora falta escribir el programa que haga que Arduino encienda y apague el LED.

En la figura 2.3 vemos el esquema básico que el IDE de Arduino ofrece, por defecto, para crear cualquier sketch (recuerda que, para que puedas arrancar el IDE de Arduino, es necesario que la placa esté conectada al puerto USB. Si no podría no arrancar).

Figura 2.3. Estructura mínima básica de un sketch Arduino.

Figura 2.3. Estructura mínima básica de un sketch Arduino.

Un sketch Arduino, como norma general, se divide en tres partes:

  • La primera se coloca antes de todo, en la línea 1, y se usa para declarar variables y constantes que se vayan a emplear, importar librerías que necesitemos, etc.
  • La segunda parte va dentro del cuerpo llmado setup. Se ejecuta una vez al principio del sketch y ya no se ejecuta más. Se emplea, entre otras cosas, para configurar el comportamiento de los pines que conectan la placa Arduino con el mundo exterior (es decir, con el resto de componentes de nuestro montaje).
  • El tercer bloque, llamado loop, contendrá el cuerpo principal del sketch, que se ejecutará de forma cíclica, es decir, cuando llegue al final vuelve a ejecutarse desde el principio.
Figura 2.4. Nuestro primer sketch Arduino.

Figura 2.4. Nuestro primer sketch Arduino.

En el IDE de Arduino vamos a escribir nuestro sketch completo, como se ve en la figura 2.4.

Una vez escrito lo grabaremos en el disco. Cuando se escribe un programa es buena práctica grabar los cambios con regularidad, porque si se va la corriente o falla el ordenador, perderemos el trabjo realizado.

Para grabarlo, podemos usar el menú Archivo, con la opción Salvar (si es la primera vez que lo grabamos, con la opción Guardar cómo…), o podemos pulsar el boton que hay al efecto debajo del menú, que aparece destacado en la figura 2.5.

Guardaremos el sketch en nuestro disco duro, en la ruta que elijamos, y pulsaremos el botón Verificar, que vemos en la figura 2.6. El IDE crea un directorio con el nombre que le demos, dentro de la ruta elegida, y en dicho directorio almacena el sketch con la extensión .ino.

Figura 2.5. El botón Salvar.

Figura 2.5. El botón Salvar.

Figura 2.6. El botón Verificar.

Figura 2.6. El botón Verificar.

Este proceso nos informa si hay algún error de sintaxis en la programación del sketch. Resulta muy útil en procesos de depuración y puesta a punto. Si todo va bien (sin errores de sintaxis), se nos mostrará, en la parte inferior de la ventana, un mensaje informándonos de ello, similar al de la figura 2.7.

Figura 2.7. Una verificación correcta

Figura 2.7. Una verificación correcta

Si se ha producido algún error de sintaxis, alguna palabra mal escrita, paréntesis no cerrados, etc., el resultado aparece en un llamativo color naranja, para que te quede claro que algo no va bien.

Figura 2.8. Errores de verificación.

Figura 2.8. Errores de verificación.

Además, aparece un listado de las líneas que presentan errores, como ves en la figura 2.8.

Una vez la verificación es correcta, pulsamos el botón Subir, que vemos en la figura 2.9.

Esto envía nuestro sketch, directamente, a la placa Arduino, que lo recibe y empieza a ejecutarlo. Si has hecho el montaje tal como aparece en la figura 2.2 y has cargado el sketch, ahora estás viendo tu LED encenderse y apagarse con una latencia de medio segundo de duración. Si no es así, verifica el montaje físico, asegurándote de que las patillas del LED estén introducidas con la polaridad correcta (el cátodo a terminal de masa y el ánodo, a través de la resistencia, al pin 8 de la placa Arduino).

Figura 2.9. El botón subir.

Figura 2.9. El botón subir.

ENTENDIENDO LO QUE HEMOS HECHO

El lenguaje Arduino es bastante simple de entender y utilizar, sobre todo si antes has programado con JavaScript, PHP, Java o cualquier otro lenguaje. En otro artículo de esta serie publicaremos una guía de referencia de Arduino. Aquí vamos a explicar lo que hemos hecho en este sketch.

PRIMERA SECCIÓN

Como ya sabemos, la primera sección de un sketch Arduino es donde, entre otras cosas, se declaran las variables y constantes a emplear en el sketch. En este mismo capítulo, un poco antes, hemso descrito brevemente estas tres secciones.

int const LED = 8;
int cambio = 0;

La primera línea declara una constante a la que llamamos LED, de tipo int, cuyo valor es 8. Esto se usará en la segunda sección para indicar que es el pin 8 el que vamos a emplear para actuar sobre el LED. El nombre de la constante podría haber sido cualquier otro, como BOMBILLITA, por ejemplo, pero conviene, por comodidad, emplear nombres breves y, desde luego, que sean descriptivos sobre el uso que se le va a dar a la constante o la variable.

El tipo int indica que vamos a manejar un valor numérico entero. En el artículo sobre sintaxis publicaremos una lista completa de los tipos de datos que puede manejar Arduino.

La palabra clave const nos indica que lo que definimos es una constante, es decir, que su valor va a mantenerse inalterable durante todo el ciclo de vida del sketch.

En la segunda línea declaramos una variable. También es de tipo int (número entero). En este caso no hemos empleado la claúsla const, así que el valor podrá cambiar durante la ejecución del script.

La segunda parte del sektch es la que va contenida bajo el epígrafe setup. Esta sección siempre tendrá ese nombre, en cualquier sketch, y la vamos a usar para determinar el comportamiento del pin que empleamos en este montaje. Esta sección se ejecuta una vez, y solo una, a continuación de la sección anterior.

void setup() {
    pinMode (LED, OUTPUT);
}

En esta sección encontramos la instrucción pinMode. Aunque deberías consultar el Artículo sobre sintaxis para ver la sintaxis completa, te aclaro que esta instrucción se emplea para determinar el comportamiento de los pines empleados en el montaje. Recibe dos argumentos: el primero se refiere al pin cuyo comportamiento vamos a definir. En este caso, al emplear la constante LED, Arduino ya “sabe” que nos referimos al pin 8, tal como habíamos definido esta constante previamente. El segundo argumento se emplea para indicar si el pin referido será una salida (Arduino escribirá “algo” en él) o una entrada (Arduino leerá un valor que entre por dicho pin). Para ello empleamos, respectivamente, las palabras clave OUTPUT o INPUT.

Cabe destacar, llegado a este punto, que los únicos pines cuyo sentido de datos (entrada o salida) puede ser definido son los que están en la fila de pines digitales, numerados de 0 a 13. Los que hay en la fila de pines analógicos, numerados de A0 a A5 son SIEMPRE de entrada de datos.

Por último tenemos la sección loop, que se ejecutará repitiéndose de forma indefinida durante todo el ciclo de vida del sketch.

void loop() {
    if (cambio == 0) {
        digitalWrite(LED, LOW);
        cambio = 1;
    } else {
        digitalWrite(LED, HIGH);
        cambio = 0;
    }
    delay (500);
}

Lo primero que encontramos es un condicional. En él se evalúa una condición determinada. Si es cierta, se ejecuta la parte del condicional que está bajo la instrucción if. Si la condición no es cierta, se ejecuta la parte que está bajo else. En ambos casos, la otra parte no se ejecuta y la ejecución continúa por debajo de la llave de cierre del condicional.

La condición que se evalúa es si la variable cambio contiene el valor 0. Para ello se emplea el operador de comparación ==. Los operadores también están detallados en el aartículo relativo a la sintaxis.

Dentro de la primera parte del condicional encontramos la instrucción digitalWrite(LED, LOW);. Esta instrucción se emplea para escribir un valor digital (binario), esto es, un 0 (representado por la palabra clave LOW), o ausencia total de tensión) o un 1 (representado por la palabra clave HIGH), o presencia total de tensión. En este caso, “presencia total” se refiere a la tensión de 5 voltios empleada por Arduino. La instrucción digitalWrite recibe dos argumentos. El primero es un número, variable o constante que se refiere al pin en el que vamos a escribir. En este caso escribiremos en el pin 8, que es representado por la constante LED. Podemos escribir en este pin porque lo hemos definido como de salida anteriormente, en la sección setup. El valor que vamos a escribir es LOW. Esto significa que no habrá tensión en el pin, es decir, que el diodo LED que tenemos conectado no recibirá voltaje y, por lo tanto, permanecerá apagado.

Además, en esta parte del condicional se cambia el valor del la variable cambio. Antes valía 0 y ahora pasa a valer 1. Sin embargo, como la condición ya ha sido evaluada, el hecho de que ahora cambio valga 1 no se evalúa. La parte que queda contenida bajo la instrucción else ya no se ejecuta en este ciclo.

Después de la llave de cierre del condicional, y aún dentro del bucle loop, encontramos la instrucción siguiente:

delay (500);

Lo que hace esta instrucción es generar un retardo, es decir, bloquear temporalmente la ejecución del skech. La duración de este retardo va como argumento de la instrucción y se expresa en milisegundos.

A continuación, se reinicia el bucle loop. Al evaluar la condición nos encontramos con que ya no es cierta. La variable cambio conserva el valor 1 que le habíamos asignado, por lo que ya no vale 0, así que se ejecuta, directamente, la segunda parte del condicional, la que está bajo else. En esta encontramos una instrucción digitalWrite que escribe, en el pin LED (el 8) el valor HIGH, es decir, que establece 5V, lo que hace que el LED se encienda. Además, se cambia el valor de la variable cambio a 0 de nuevo.

Despúes, un retardo de medio segundo, igual que antes, y el bucle se reinica de nuevo. De este modo, el LED se apaga y enciende intermitentemente, cada medio segundo.

Este código podría optimizarse. Optimizar un código es escribir una versión que haga lo mismo que el original, subsanado los bugs que pudiera haber (si fuera el caso), y que sea más compacto y legible. Observa la siguiente versión del sketch.

En este caso vemos que la variable cambio cambia su valor, sea el que sea, en cada iteración del bucle loop. De este modo, evitamos cambios específicos en el condicional. Esta es una técnica muy empleada cuando hay que usar variables que actúan como conmutadores binarios. Restamos a 1 el valor actual de la variable. Si esta era 0, el nuevo valor es 1; si era 1 el nuevo valor es 0.

Aún podemos optimizar más el código. las constantes LOW y HIGH son una forma de representar en Arduino los valores digitales 0 y 1, respectivamente. En la escritura digital (instrucción digitalWrite) podemos emplear estas constantes, los valores 0 y 1 o unas variables que los representen en cada caso. Sabiendo esto, podemos evitar el uso del condicional, así:

De este modo, hemos reducido el código, es más legible, y funciona igual.

     

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *