Arduino – Capítulo 4 – Interfaz de una nave espacial

Ahora que ya tenemos las bases de la electricidad bajo control, es el momento de aprender a controlar cosas con Arduino. En este capítulo vamos a construir algo que podría ser la interfaz de una nave espacial en una película de ciencia ficción de los años 70. Crearemos un panel de control con un pulsador y luces que se encenderán al accionar dicho pulsador. Un led verde estará encendido hasta que pulsemos el botón. Cuando Arduino reciba la señal del pulsador, la luz verde se apagará y otras dos empezarán a parpadear.

Los pins digitales de Arduino solo pueden leer dos estados: cuando hay tensión en un pin de entrada, y cuando no la hay. Este tipo de entrada es normalmente conocida como digital (o algunas veces binaria, por tener dos estados). A estos dos estados se les refiere como Alto o bajo (HIGH y LOW en inglés). HIGH es lo mismo que decir “¡Tenemos tensión aquí!”, y LOW lo mismo que “¡No hay tensión en este pin!”. Cuando le indicamos a un pin de salida un nivel HIGH utilizando el comando digitalWrite(), lo estamos activando, pero cuando le indicamos un nivel LOW, lo estamos desactivando.

Los pins digitales de Arduino pueden actuar tanto como entradas como salidas. En nuestro código, podemos configurarlos para que funcionen dependiendo de la acción que deseemos que hagan. Cuando dichos pins funcionan como salidas, podemos activar componentes tales como diodos leds. Si los configuramos como entradas, podemos comprobar por ejemplo, si un pulsador ha sido activado o no. Como los pins 0 y 1 se utilizan para la comunicación con el pc, es mejor utilizar los pines a partir del número 2.

Montando el circuito

Pasemos ahora al montaje del circuito. Para ello seguiremos los pasos siguientes:

1 – Conecta la alimentación de 5v y la tierra de la placa Arduino a la protoboard.

2 – Colocamos un led verde y dos rojos en dicha protoboard.

3 – Cogemos una resistencia de 220Ω y conectamos uno de sus terminales al cátodo del led verde (la patilla corta) y el otro, lo conectamos a masa. Cogemos otras dos resistencias de 220Ω y repetimos el proceso para los otros dos leds.

4 – A continuación, realizamos una conexión entre el ánodo del led verde (la patilla larga) y el pin 3 del Arduino.

5 – Los ánodos de los leds rojos, los conectamos uno al pin 4 y el otro al pin 5.

6 – Colocamos un pulsador en la protoboard, tal y como se muestra en la figura de más abajo. Conectamos un lado del pulsador a la alimentación y el otro lado al pin 2 del Arduino. Necesitaremos añadir una resistencia de 10kΩ entre la tierra y la conexión del pulsador con el pin del Arduino.

Tras seguir los pasos anteriores, debería de quedarnos un circuito como el de la figura siguiente:

Protoboard

Su esquema eléctrico correspondiente sería:

Esquema electrico

El código

Todo programa de Arduino posee dos funciones principales. Las Funciones son partes de un programa informático que ejecutan comandos específicos. Dichas funciones tienen nombres únicos, y son “llamadas” cuando se las necesita. Las obligatorias son las llamadas setup() y loop().  Estas funciones necesitan ser declaradas, lo que significa que hay que decirle al Arduino que acción van a llevar a cabo dichas funciones.  setup() y loop() se declaran de la siguiente manera:

void setup(){

}

void loop(){

}

En este programa, vamos a crear una variable antes de adentrarnos en la parte principal del programa. Las variables son nombres que se colocan en la memoria de Arduino y de las que podemos saber el valor de su contenido. Dicho contenido puede cambiar dependiendo de las instrucciones que le demos al programa.

Los nombres de variables suelen describir que tipo de valor están guardando estas. Por ejemplo, una variable cuyo nombre sea switchState, nos estará diciendo que almacena el estado de un pulsador. Por otro lado, una variable cuyo nombre sea “x”, no nos estará diciendo mucho acerca de que valor está guardando.

Para crear una variable necesitamos declarar de que tipo es. El tipo de dato int se refiere a un número entero (también llamado integer); este es cualquier número sin coma decimal. Cuando declaramos una variable, normalmente debemos indicarle un valor inicial; a esto se le llama inicializar una variable. La declaración de dicha variable debe acabar siempre con un punto y coma (;).

1    int switchState=0;

La función setup() solo se ejecuta una vez, cuando Arduino se pone en funcionamiento. Este es el punto donde configuraremos los pines digitales para que sean inputs o outputs, utilizando una función llamada pinMode(). Los pines conectados a los leds serán de salida (outputs) y el pin del pulsador será de entrada (input).

2    void setup(){

3        pinMode(3, OUTPUT);
4        pinMode(4, OUTPUT);
5        pinMode(5, OUTPUT);
6        pinMode(2, INPUT);
7    }

La función loop() se ejecuta de forma continua después de que la función setup() haya concluido. En loop() es donde comprobaremos el voltaje de la entrada, y cambiaremos el estado de las salidas en on o en off. Para comprobar el nivel de voltaje en la entrada, deberemos utilizar la función digitalRead(), la cual comprueba el voltaje del pin escogido. Para escoger el pin que queremos comprobar, digitalRead() espera un argumento.

8    void loop(){

9        switchState = digitalRead(2);
10        //Esto es un comentario.

Los argumentos son información que le pasamos a las funciones, diciéndole a estas como deben realizar su trabajo. Por ejemplo, digitalRead() necesita un argumento: que pin debe comprobar. En nuestro programa, digitalRead() comprobará el estado del pin 2 y guardará dicho valor en la variable switchState. Si hay tensión en el pin cuando llamamos a la función digitalRead(), la variable switchState almacenará el valor HIGH (o 1). Si no hay tensión en dicho pin, switchState guardará el valor LOW (o 0).

En programación, la declaración if() comprara dos cosas, y determina si dicha comparación es cierta o falsa (true o false). A continuación, en función del resultado de la comparación, realizará las acciones que le hayamos indicado. Cuando en programación comparamos dos cosas, utilizamos el símbolo ==. Si solo utilizáramos un signo igual, estaríamos asignando un valor a la variable en lugar de realizar dicha comparación.

11        if(switchState == LOW) {
12        //el pulsador no ha sido presionado.

digitalWrite() es el comando que nos permite enviar 5v o 0v a un pin de salida. Dicha función tiene dos parámetros: a que pin enviar el voltaje y que voltaje enviarle, si HIGH o LOW.

13            digitalWrite(3, HIGH);    //Led verde.
14            digitalWrite(4, LOW);    //Led rojo.
15            digitalWrite(5, LOW);    //Led rojo.
16        }

La condición if() tiene un componente opcional llamado else que permite ejecutar código cuando no se cumple la primera condición. En nuestro caso, tras haber comprobado si el pulsador estaba en un nivel LOW, escribiremos el código para un nivel HIGH dentro de la condición else.

Para hacer que los leds rojos parpadeen cuando el pulsador sea presionado, necesitamos apagar y encender dichos leds dentro de la condición else. El código sería el siguiente:

17        else{    //el pulsador es activado.
18            digitalWrite(3, LOW);
19            digitalWrite(4, LOW);
20            digitalWrite(5, HIGH);

21            delay(250);    //esperamos un cuarto de segundo.
22            //cambiamos los leds.
23            digitalWrite(4, HIGH);
24            digitalWrite(5, LOW);
25            delay(250);    //esperamos un cuarto de segundo.

26        }
27    }//volvemos al principio del bucle.

Después de asignarles a los leds un estado concreto, queremos que Arduino haga una pausa antes de que vuelva a cambiar el estado de los mismos. Si no esperamos, las luces cambiarán de estado tan rápido que nos parecerá que siempre están igual. Esto es debido a que Arduino ejecuta el bucle loop() miles de veces por segundo, y los leds cambian de estado tan rápido que no nos daríamos cuenta. La función delay() nos permite indicarle al Arduino que deje de ejecutar lo que esta haciendo durante el lapso de tiempo que le indiquemos. delay() tiene un argumento que indica el número de milisegundos antes de que siga ejecutando el código siguiente. Hay 1000 milisegundos en un segundo, por tanto, delay(250) realizará una pausa en la ejecución del código de un cuarto de segundo de duración.

Puesta en marcha

Una vez que hemos programado nuestro Arduino, veremos como el led verde esta encendido. Cuando apretemos el pulsador, los leds rojos empezarán a parpadear y el verde se apagará. Probemos a cambiar el tiempo de las dos funciones delay(); prestemos atención a lo que ocurre con las luces y como cambia la respuesta del sistema en función del tiempo de parpadeo. Cuando invocamos a la función delay() en nuestro programa, ésta detiene cualquier otra funcionalidad. No se leerá ningún sensor hasta que no haya concluido el periodo de tiempo establecido. Los delays se utilizan con frecuencia, pero cuando diseñemos nuestros propios proyectos tenemos que tener cuidado con que no interfieran con nuestra interfaz de manera innecesaria.

Bien. En este proyecto hemos creado nuestro primer programa de Arduino para controlar el estado de unos leds en función de un pulsador. Hemos utilizado variables, el condicional if()…else y funciones para leer el estado de una entrada y cambiar el estado de las salidas.

Espero que os haya gustado.

Un saludo y muchas gracias por leer este artículo.  ^_^

Referencias

Artículo basado en el capítulo “Project 02 – Spaceship Interface” del libro “Arduino Projects Book” distribuido por Arduino.cc junto con su “The Arduino Starter Kit“.

Anuncios

9 pensamientos en “Arduino – Capítulo 4 – Interfaz de una nave espacial

  1. Pingback: Arduino – Capítulo final – Hackeando botones | El gato inquieto

  2. Cuando intento compilar el programa me da error en void setup, lo he copiado todo igual aunque no estoy seguro de si he puesto bien los espacios ni si el principio lo he copiado bien. Sabe alguien como solucionarlo?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s