Inicio Artículos Arduino en la práctica parte 2 – soporte para superposición SHIELD-LCD16x2 de...

Arduino en la práctica parte 2 – soporte para superposición SHIELD-LCD16x2 de Olimex con pantalla LCD y 4 botones.

arduino

El artículo anterior que encontrará aquí, incluía una descripción del módulo de pantalla LCD. En él mostramos cómo conectar la pantalla a la placa Arduino UNO y los conceptos básicos de su funcionamiento con el programa. Admitamos, sin embargo, que la pantalla en sí no encontrará muchas aplicaciones en muchos dispositivos, porque un módulo LCD tan simple no permite establecer configuraciones. Un teclado es necesario para este propósito, y aunque lo discutiremos con más detalle en uno de los siguientes artículos, ahora usaremos una solución lista para usar del ecosistema Arduino – placa de la marca Olimex con el nombre de SHIELDLCD16x2.

222223 adicionales. La placa tiene un procesador PIC que se comunica con Arduino UNO a través de la interfaz TWI. Gracias al acceso a la biblioteca de funciones, el manejo de este módulo con un microcontrolador incorporado no debería causar mayores problemas. Comencemos con la preparación del módulo para el trabajo.

Preparación para trabajar con la placa Olimex

La preparación del módulo para su funcionamiento consta de dos pasos: hardware y software. El primero es trivial: simplemente conecte la tapa a la placa Arduino UNO y estará listo. El segundo, sin embargo, requiere la instalación de la biblioteca que contiene las funciones de manejo del módulo.

Para instalar la biblioteca, vaya al sitio web del fabricante del módulo, es decir, la empresa Olimex. Luego, en el campo de búsqueda (junto al botón Buscar), ingrese la parte del nombre del módulo «LCD16x2» (Figura 1). Haga clic en el botón Buscar. En el momento de escribir este texto, el motor de búsqueda mostrará dos resultados: elegimos «SHIELD-LCD16x2».

placa arduino
Figura 1. Fragmento del sitio web de Olimex con el cuadro de búsqueda

Debajo de la descripción del módulo, encontramos el bloque «SOFTWARE» (Figura 2). Cada línea de texto en este campo también es un enlace a un archivo que se puede descargar del sitio web de Olimex. Por el momento estamos interesados ​​en el enlace llamado «OLIMEXINO-328+SHIELD-LCD16x2 – a library and set of demo example».

Descargue el archivo ZIP disponible en este enlace al disco duro de su computadora. Por supuesto, también vale la pena echar un vistazo a los ejemplos disponibles, pero para nuestras necesidades es suficiente con instalar la biblioteca guardada en el directorio LCD16x2.

Arduino IDE permite diferentes formas de instalar bibliotecas. En este caso, la forma más sencilla es subir las fuentes al directorio del proyecto, que también incluye el subdirectorio de bibliotecas. El directorio para guardar proyectos se crea al instalar el IDE de Arduino y generalmente Windows lo coloca (en la versión polaca del sistema) en el subdirectorio Esta computadora → Documentos → Arduino. Para agregar las fuentes de la biblioteca al ejemplo de hoy, simplemente mueva el directorio LCD16x2 a la carpeta de ibraries. Una vez hecho esto, ejecutamos el IDE de Arduino.

arduino shield
Figura 2. Bloque de programa de muestra disponible para el módulo.

SHIELD-LCD16x2 – Lectura de estado del botón

Antes de comenzar a trabajar en su propio programa, vale la pena familiarizarse con ejemplos de uso de las funciones de la biblioteca LCD16x2.h disponible en el catálogo Examples. Este es un método de aprendizaje mucho más efectivo que la lectura de documentación, aunque también vale la pena recordarlo.

Como se mencionó, el escudo se comunica con la placa UNO a través de una interfaz en serie. Por lo tanto, es fácil adivinar que las funciones descritas en el artículo anterior deben modificarse porque usaban una interfaz paralela de 4 bits. Podemos suponer que el microcontrolador en la placa protectora se comunica de la misma manera con el módulo de visualización de caracteres LCD, pero nuestro Arduino UNO no «ve» la pantalla y el control es indirecto. Por lo tanto, el programa debe iniciarse adjuntando las bibliotecas de servicio de la interfaz en serie adecuada y el módulo de visualización montado en la placa de protección.

#include <LCD16x2.h>#include <Wire.h>

Para simplificar y no tener que usar el nombre largo de la biblioteca, vale la pena asignarle un alias lcd. Lo usaremos, escribiendo el nombre de la función de la biblioteca después del punto.

LCD16x2  lcd;

Como recordamos del artículo anterior, los programas creados para Arduino se dividen en dos partes: la función de inicialización y el bucle infinito. Los comandos del primero se ingresan dentro de la función void setup(), y el segundo void loop(). Los comandos contenidos dentro de la función de configuración se ejecutan solo una vez, mientras que dentro del bucle infinito – durante toda la duración del programa.

La función de inicialización inicia la interfaz TWI, limpia la pantalla LCD y enciende la luz de fondo de la pantalla a la máxima intensidad de luz LED (parámetro 0 – apaga la luz de fondo).

void setup(){Wire.begin();     //TWI interface initlcd.lcdClear();   //LCD screen clearlcd.lcdSetBlacklight(255);  //maximum backlight on}

En el caso de la placa Olimex, si no se presiona ningún botón, la función de lectura del botón devuelve solo unos, mientras que al presionar el botón se restablece el bit asociado.

La función readButtons() devuelve una variable de tipo int, y su llamada se ve así:

variable = lcd.readButtons();

Es posible operar con bits que son ceros lógicos, pero es mucho más conveniente y fácil de analizar más adelante cuando se establece el bit apropiado. La llamada el complemento de uno:

variable =~ variable;

Si el bit está establecido, es conveniente probar su nivel utilizando el producto lógico. Solo es cierto si ambos lo son. Las posiciones de bit sucesivas se pueden verificar con el uso de constantes: 0x01 para un bit en la posición 0, 0x02 – en la posición 1, 0x04 – en la posición 2, 0x08 – en la posición 3, etc. Por supuesto, no importa si use números hexadecimales, binarios o decimales, pero con la práctica, los números hexadecimales son fáciles de escribir. Se puede ver que los siguientes números hexadecimales usados ​​para probar la posición del bit son potencias de 2.

buttons = lcd.readButtons();if (buttons & 0x01) pressed = 1;else if (buttons & 0x02) pressed = 2;else if (buttons & 0x04) pressed = 3;else if (buttons & 0x08) pressed = 4;else pressed = 0;

La variable buttons contiene información sobre los botones presionados. El uso de if… else hace que el botón finalice cuando se cumple la condición. Esto acorta el tiempo de trabajo del programa, pero también tiene la desventaja de que los botones de alguna manera tienen su jerarquía y no es posible leer el estado de dos o más botones presionados, similar a la combinación de los botones Shift y Ctrl en un PC.

La máscara 0x01 corresponde al primer botón de la izquierda y 0x08 al botón derecho. El programa numeró los botones, dando a la variable presionada un valor correspondiente al número de botón convencional. Luego, este número se muestra en la pantalla LCD en la posición que comienza con la primera fila y la primera columna. El mensaje se muestra solo si el valor de presionado no es 0. De lo contrario, se muestra el mensaje «No button”, informándole que no se presionó ningún botón. El mensaje termina con tres espacios para que los últimos caracteres de la cadena se borren cuando se superpone «1 is pressed», que es más largo.

lcd.lcdGoToXY(1, 1);if (pressed != 0){lcd.lcdWrite(pressed);lcd.lcdGoToXY(2, 1);lcd.lcdWrite(» is pressed»);}else lcd.lcdWrite(«No button   «);

El croquis completo está disponible en los materiales adjuntos al artículo. Lo compilamos y lo enviamos a la memoria del microcontrolador Arduino UNO usando el atajo de teclado Ctrl+U (Sketch → Upload).