Arduino – Capítulo 13 – Bola mágica

Bola magica

Las Bolas mágicas nos pueden ayudar a predecir el futuro. Realizas una pregunta a la bola que “todo-lo-sabe”, la giras y te revela la respuesta. Muchos de vosotros habréis visto una bola de estas en alguna película made in USA. Es la típica bola negra de billar (pero más grande claro) con un ocho dibujado, pero que tiene un pequeño lado plano en el que hay una diminuta pantalla electrónica. Las respuestas serán predeterminadas, pero podemos escribir lo que queramos. En nuestro proyecto, usaremos nuestro Arduino para poder escoger entre un total de ocho respuestas. El sensor de inclinación que empleamos en el capítulo del reloj de arena digital nos servirá para replicar el efecto de agitar la bola y poder ver la respuesta.

Para mostrar las respuestas, podemos utilizar una pantalla LCD para mostrar caracteres alfanuméricos. Para este proyecto usaremos una que dispone de 16 columnas y 2 filas, para poder mostrar un total de 32 caracteres. Dicha pantalla tiene muchos pines, los cuales, son para alimentación y comunicación, pero nosotros no necesitamos conectarlos todos. En la siguiente figura podemos ver los que necesitamos unir.

Pins a conectar en el LCDPantalla LCD de 2 filas por 16 columnas

 

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

 – 1 sensor de inclinación.

– 1 potenciómetro.

– 1 resistencia de 10KΩ.

– 1 resistencia de 220Ω.

– 1 una pantalla de cristal líquido de 2 filas x 16 columnas (como la mostrada en la figura anterior).

Una vez tenemos los componentes necesarios, debemos seguir los pasos siguientes. El circuito no es muy complejo, pero tiene mucho cableado. Es por ello que debemos poner especial atención a la hora de realizar las conexiones para asegurarnos de que todo esta correcto.

1 – Conectamos la alimentación y la tierra de nuestro Arduino en la protoboard.

2 – Colocamos el sensor de inclinación en la protoboard y conectamos una de sus patillas a la alimentación de 5V. La otra patilla irá conectada a tierra a través de una resistencia de 10KΩ y al pin digital 6 de nuestro Arduino.

3 – A continuación, antes de conectar el display LCD, veremos para que sirve cada uno de sus pines.

RS: es el pin de selector de registro (Register Select) y es el encargado de controlar el lugar en el que aparecen los caracteres en pantalla.

R/W: pin de lectura/escritura (Read/Write). Se encarga de poner la pantalla en modo lectura o escritura. Nosotros en este proyecto la utilizaremos en modo escritura.

EN: pin de activación (Enable). Es el encargado de decirle al display que esta recibiendo una orden.

– Pines del D0 al D7: pines de datos. Son los pines utilizados para enviar los datos de los caracteres a la pantalla. En nuestro proyecto tan solo utilizaremos cuatro de ellos (D4D7).

V0: pin para regular el contraste de la pantalla. Para poder hacerlo, necesitaremos conectar el potenciómetro a dicho pin.

4 – Ahora que ya sabemos para que sirve cada pin del display, empezaremos a conectarlo. Los pines de los extremos (Vss y LED-) debemos conectarlos a tierra. Procederemos del mismo modo con el pin R/W, de esta manera tendremos al display en modo escritura. El pin de alimentación de la pantalla (Vcc) lo conectaremos directamente a la alimentación de 5V. Por otro lado, el pin LED+ lo conectaremos a la alimentación a través de una resistencia de 220Ω.

5 – Seguidamente realizamos las siguientes conexiones, las cuales, nos permiten decirle al display que carácter queremos mostrar:

– Pin digital 2 del Arduino al D7 del LCD.

– Pin digital 3 del Arduino al D6 del LCD.

– Pin digital 4 del Arduino al D5 del LCD.

– Pin digital 5 del Arduino al D4 del LCD.

6 – Para que podamos escribir en la pantalla, debemos habilitar dicha función. Esto lo conseguiremos conectando el pin EN del display al pin 11 de Arduino y, el pin RS al pin 12.

7 – A continuación, colocamos el potenciómetro en la protoboard. Conectamos la patilla de un lado a la alimentación y la del otro lado a tierra. La patilla central sin embargo, la conectaremos al pin V0 del LCD. Esta conexión del potenciómetro a la pantalla nos permitirá regular el contraste de la misma.

Terminado de montar el circuito, deberíamos de tener algo parecido al mostrado en la siguiente figura.

Diseño de protoboard

El esquema eléctrico correspondiente sería:

Esquema de conexiones

 

El código

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

Lo primero de todo es importar la librería LiquidCrystal. Con esto podremos acceder a toda una colección de código que nos facilitará el uso del display LCD. A continuación, inicializamos dicha librería, de forma similar a la utilizada con la librería del servo motor del proyecto “Indicador de estado de ánimo“, diciéndole que pines vamos a usar para comunicarnos.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Ahora que ya tenemos importada y configurada la librería, es el momento de crear algunas variables y constantes. Creamos una constante para almacenar el número de pin del sensor de inclinación y dos variables, una para guardar su estado actual y otra para almacenar el estado anterior. Finalmente, crearemos una variable más para escoger el mensaje que se mostrará por pantalla.

const int switchPin = 6;
int switchState = 0;
int prevSwitchState = 0;
int reply;

Ya dentro de la función setup(), configuramos el pin del sensor como entrada mediante la función pinMode(). Inicializamos la librería del LCD y le decimos como de grande es la pantalla.

void setup() {

    lcd.begin(16, 2);
    pinMode(switchPin, INPUT);

A continuación, vamos a escribir una pantalla de bienvenida a la Bola mágica. Para ello, usaremos la función print(). Vamos a escribir las palabras “¡Pregunta a la” en la línea superior de la pantalla. Cuando vayamos a hacerlo, el cursor se encontrará automáticamente en el principio de la línea superior.

    lcd.print("¡Pregunta a la");

Seguidamente, para poder escribir en la siguiente línea, debemos decirle a la pantalla a donde debe mover el cursor. Las coordenadas de la primera columna de la segunda fila son 0,1 (recordemos que los ordenadores empiezan a contar a partir del número 0, por lo que la primera columna de la primera fila tendrá las coordenadas 0,0). Usaremos la función lcd.setCursor() para mover el cursor al lugar deseado y escribir “Bola Mágica!”

    lcd.setCursor(0, 1);
    lcd.print("Bola Magica!");

}//Fin de la función setup.

Ahora, nada más empezar el programa, nos aparecerá “¡Pregunta a la Bola Mágica!” en la pantalla. En la función loop(), vamos a comprobar primeramente el estado del sensor y almacenar su estado en la variable switchState.

void loop() {

    switchState = digitalRead(switchPin);

Usaremos una sentencia if() para comprobar si el sensor está en una posición diferente de la que se encontraba anteriormente. Si es diferente a la anterior y ahora tiene un nivel LOW, es el momento de escoger una respuesta aleatoria. La función random() devuelve un número basado en el argumento que le proporcionamos. Para empezar, tenemos un total de 8 respuestas diferentes para nuestra bola. Siempre que invoquemos a la función random(8), nos devolverá un número comprendido entre el 0 y el 7. Almacenaremos dicho número en la variable reply.

    if (switchState != prevSwitchState) {
        if (switchState == LOW) {
            reply = random(8);

A continuación, limpiaremos la pantalla con la función lcd.clear(). Esto también moverá el cursor a la posición 0,0 (la primera columna de la primera fila). Escribiremos la frase “La Bola dice:” y moveremos el cursor para escribir la respuesta.

            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("La bola dice:");
            lcd.setCursor(0, 1);

La sentencia switch() ejecuta diferentes líneas de código en función del valor que le pasemos. A cada una de estas partes de código se le llama case. La sentencia switch() comprueba el valor de la variable reply; cualquiera que sea el valor almacenado en dicha variable, determinará que bloque de código case será ejecutado.

Dentro de los bloques case, el código será el mismo, tan solo cambia el mensaje de respuesta a mostrar. Por ejemplo, en el bloque case 0 el código es lcd.print(“Yes”). Después de la función lcd.print() sigue otro comando, llamado break. Dicho comando le dice a Arduino donde termina el bloque de código case. Cuando encuentra el comando break, salta automáticamente al final de la sentencia switch. Nosotros crearemos 8 bloques case. Cuatro de las respuestas serán positivas, dos serán negativas y las otras dos invitarán a que volvamos a preguntar de nuevo.

            switch(reply){
                case 0:
                lcd.print("Si");
                break;

                case 1:
                lcd.print("Lo mas probable");
                break;

                case 2:
                lcd.print("Ciertamente");
                break;

                case 3:
                lcd.print("Buena decision");
                break;

                case 4:
                lcd.print("No es seguro");
                break;

                case 5:
                lcd.print("Pregunta de nuevo");
                break;

                case 6:
                lcd.print("Lo dudo");
                break;

                case 7:
                lcd.print("No");
                break;

            }//Fin del switch.

        }//Fin del segundo if.

    }//Fin del primer if.

Lo último que nos queda por hacer dentro de la función loop(), es copiar el valor almacenado en la variable switchState dentro de la variable prevSwitchState. Con esto podremos comprobar si de una iteración a otra de la función loop() se ha producido un cambio en el estado del sensor.

    prevSwitchState = switchState;

}//Fin de la función loop.

 

Puesta en marcha

Para usar la bola mágica, lo primero que debemos hacer es darle corriente a nuestro Arduino. Comprobemos que en la pantalla aparece le mensaje “¡Pregunta a la bola magica!”. Si no podemos ver los caracteres, probaremos de regular el potenciómetro con el objetivo de ajustar el contraste del display LCD.

Hagamos una pregunta a la bola “que-todo-lo-sabe” e inclinemos el circuito para que el sensor cambie de estado. Deberíamos obtener una repuesta a nuestra pregunta. Si dicha respuesta no nos convence, preguntemos de nuevo.

 

Conclusión

En este proyecto hemos aprendido a utilizar un display LCD y ha importar la librería LiquidCrystal, la cual nos proporciona toda una colección de código que nos facilita el trabajo con la pantalla. Por otro lado, también hemos aprendido que es y como se utiliza la sentencia Switch. Pero… ¿que otras cosas podríamos mostrar por pantalla además de respuestas? ¿Tal vez un refrán cada vez que agitemos el circuito? ¿Por qué no simular el funcionamiento de un dado de ilimitadas caras? Seguro que se os ocurren mil y una ideas para cambiar la funcionalidad de este circuito.

 

Espero que os haya gustado.

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

 

Referencias

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

– Más información acerca de la sentencia Switch: http://arduino.cc/en/Reference/SwitchCase

– Más información acerca de la librería LiquidCrystal: http://arduino.cc/en/Reference/LiquidCrystal

Anuncios

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