Realizado por V. García en 2015.
Introducción.
Este documento es como una introducción a los LCD’s numéricas y sus drivers, voy a intentar detallar en lo posible algunos ejemplos que sirvan de punto de partida y aprendizaje, que no innovador. Como se sabe, se puede encontrar gran variedad de temas en la red que, tratan de los LCD’s.
En el apartado de pantallas de cristal líquido LCD, debemos distinguir dos grandes grupos, por un lado las pantallas alfanuméricas y por otro, las pantallas gráficas. Dejare para otro momentos las gráficas, en este caso vamos a abordar las pantallas LCD alfanuméricas. En este apartado existen las LCD dedicadas (en inglés llamadas ‘custom’) y las que se denominan alfanuméricas, éstos son los más comunes que, se encuentran en los puntos de venta. Su tamaño se mide normalmente por el número de columnas y filas de caracteres en la pantalla. Por ejemplo, los tres tipos de LCD en tamaño de 8 x 2, 16 × 2 o 20 × 4 caracteres.
El lector debe saber que la mayoría de los LCD actuales, llevan el controlador HD44780 de Hitachi. Dicho controlador puede ser configurado para manejar un display de cristal líquido de matriz de puntos la ayuda de un microprocesador de 4 u 8 bits, en este caso me referiré al Arduino. Añadir que, dispone de un generador de caracteres en RAM de 8 fuentes de caracteres (5×8 puntos) y 4 fuentes de caracteres (5×10 puntos).
Para manejar bien el display, en lugar de la librería estándar del SDK de Arduino, utilizaremos la «Nueva librería LiquidCrystal» que, tan amablemente ha actualizado Francisco Malpartida, al que agradecemos el tiempo dedicado. Tenemos que tener en cuenta que el controlador HD44780, nos muestra los caracteres, en una matriz de puntos. Así que, nada impedirá que el usuario, pueda dibujar casi, cualquier cosa sobre ella, aunque no está pensado para eso, ya que no dispone de comandos para manejar pixeles simples, sino, caracteres alfanuméricos.
DISPLAYS ALFANUMÉRICOS.
Son muchas las páginas que circulan por la red que hablan de los LCD y no es ya posible descubrir nada nuevo en este lugar, sin embargo diré que con la bajada de precios de estos dispositivos, tanto el profesional como el aficionado, ahora, pueden utilizar los LCD en sus proyectos y sus aficiones. Se abre un amplio campo de aplicación, que ha puesto en sus manos un artículo que es vistoso, sencillo y a la vez llamativo. Este es mi recién adquirido LCD.
Actualmente, la mayoría de las pantallas LCD tienen algún tipo de luz de fondo, sin embargo, puede encontrarse con algunos modelos, en gran medida, por el bajo precio que, no la tienen. Los colores del carácter, fondo y luz de fondo puede variar.
La interconexión de estas pantallas, con la placa Arduino, resulta muy fácil y hay varias maneras de hacerlo. Este tipo de interfaz puede incluir un paralelo de cuatro u ocho bits, serie, tres hilos, I2C y las interfaces SPI.
Tabla componentes.
La pantalla LCD, se puede controlar con un de bus de datos de 4 u 8 bits (pin D4 – D7) y 3 líneas de estado (RS, E, R/W). Según consta en la hoja de datos del fabricante, el ancho del bus de datos se puede seleccionar durante la inicialización de la pantalla por el microcontrolador. Es posible, para ahorrar unos cuantos pines de E/S, en el control de pantalla con sólo 7 pines E/S. En el modo de 4 bits, cada carácter necesita dos ciclos de reloj, por lo que la pantalla, es un poco más lenta que en el modo de 8 bits. Pero en la mayoría de circunstancias esto, no es relevante.
De modo que, con Arduino y la nueva librería (LiquidCrystal) podremos controlar de forma muy fácil, ese tipo de pantallas. Como siempre, se necesitan al menos 6 pines de Arduino, para controlar una sola pantalla y una vez más, rápidamente nos quedamos sin pines.
INTERFACE I2C PARA LCD.
En el artículo (Teclado con LCD), ya hice referencia a la opción de utilizar el I2C bus. Este es el momento, de hacer una lectura a la descripción de cómo funciona el I2C Bus. Para aplicar y controlar en una pantalla LCD paralelo, con el bus I2C. Si usted no está familiarizado con el concepto del I2C Bus, le recomiendo la lectura del artículo Introducción al I²C bus.
Para ahorrar pines digitales, la idea es, conectar el mayor número de pines como sea necesario del PCF8574 en un bus I2C y su control, con la señal analógica de los pines 4 y 5 de Arduino, mediante la biblioteca original Wire. Esta librería, le permite comunicarse con dispositivos I2C / TWI. En la mayoría de las placas Arduino, la SDA (línea de datos) está en el pin analógico 4 y la SCL (línea de reloj) está en el pin analógico 5. En Arduino Mega, la SDA esta en el pin digital 20 y la SCL en el 21.
Nota. Para recordar con facilidad, asocie SDA con el 4, es decir SDA = pin4, el otro pin (pin5) se corresponde con SCL.
El chip (PCF8574), como ya se ha dicho, implementa un I2C en modo esclavo y ofrece, ocho entradas/salidas independientes. Por lo tanto, se puede fácilmente utilizar para «agregar» 8 pines digitales a la placa Arduino. Recordar que, el circuito integrado, dispone de 3 pines para elegir su dirección de esclavo. Por lo que, se pueden conectar 8 unidades PCF8574 en el mismo bus, logrando así, obtener 64 pines extra. Y lo que es más, considerando la versión PCF8574A, con exactamente las mismas especificaciones, salvo que las direcciones se generan en un rango diferente. Lo que permite añadir 64 pines digitales más. ¿Se imagina, un Arduino con 128 pines digitales?
EL PCF8574A.
Es muy importante obtener cierto conocimiento de cómo se direcciona el llamado expansor de puertos, por lo que, vamos a repasar el contenido de las hojas de datos del PCF8574 en español. En la página 5 dice, «Cada una de las ocho E/S del PCF8574A, pueden ser utilizadas independientemente, por separado, como entrada o salida», este es un dato a tener muy en cuenta, ya que esto significa que con el PCF8574, disponemos de 8 nuevos pines en nuestro Arduino. A continuación, vemos una tabla resumida, de la funcionalidad de los pines del PCF8574.
Fig. 2
En la Tabla 2, se hace referencia a las direcciones que permiten los pines A0, A1, A2, del PCF8574, podemos ver que, al poner los tres pines a BAJO, las direcciones a partir de b0100 0000 (0x20h). Una vez más, hay que tener en cuenta que, para el PCF8574A, esta primera dirección corresponde a partir de b0111 0000 (0x38h).
Fig. 3
En resumen, dependiendo de los valores asignados a los tres pines A0, A1 y A2, permite que utilicemos hasta 8 dispositivos PCF8574, para controlar un LCD, un teclado u otro dispositivo con E/S. Con los tres a nivel 0, estaremos dialogando con el primero de los ocho. Ah!, que sólo utilizamos uno, entonces, ese es, con el que nos comunicamos. Aclaradas las dudas?, sigamos con el esquemático.
NOTA: Tener presente que, los fabricantes producen dos variantes de este IC: PCF8574 y PCF8574A. La única diferencia es la dirección de llamada a I2C!. Debido a que dispongo de un PCF8574A (0x38h), a éste es al que me referiré en estas páginas, si no se dice lo contrario.
Hay gente que, está teniendo conclusiones erróneas en su PCB (de compra), con las hoja de datos PCF8574 y la lista de direcciones. Para utilizar el PCF8574 en sus dos versiones, es la siguiente:
Espero que el tema del direccionamiento, ahora, está más claro. Sin embargo, en las prácticas que se muestran aquí, como ya se ha dicho, se han utilizado las direcciones correspondientes al PCF8574A.
MÓDULOS PARALELO PARA LCD.
En definitiva, ampliar la capacidad de puertos de un micro con la ayuda de un circuito integrado PCF8574 o similar, se puede reducir de 8 a 2 la cantidad de pines necesarios para manejar un dispositivo como el LCD, un teclado u otro dispositivo similar. El siguiente es un circuito típico de aplicación
Fig. 5
- Actualizado el 11.10.2014 para mayor claridad.
- Se ha añadido el transistor NPN, para mejor control del brillo de los caracteres.
En el caso que, la pantalla que disponemos es paralelo, qué podemos hacer. Esto, no debe ser un problema para utilizar el bus I2C, claro, nos vemos en la necesidad de trazar un circuito para incorporar este dispositivo en nuestro proyecto. Por lo que, el esquema electrónico que utilizaremos es muy sencillo y se muestra a continuación.
Fig. 6
Se ha dotado de dos diodos, uno es un LED con su resistencia de carga, para que indique cualquier evento que nos interese (lo que demostrará que es totalmente independiente) y el otro diodo un 1N4007, con el cual reduciremos la tensión de alimentación en 7mV, para la iluminación de fondo del LCD, un potenciómetro para el contraste y eso es todo.
UTILIDAD CON EL 74CHT174.
Por cierto, si no dispone del PCF8574P/AP, puede utilizar de modo similar, el circuito de 16 patillas, 74HCT174 CMOS, aunque no se trate de un I2C Bus. Es un circuito integrado con seis Flip-Flop tipo D, con entradas de reloj (CP) y reset (MR) común, este es su símbolo.
Fig. 7
Empleando el esquema que se muestra a continuación. En el cual, se observa que las patillas de salida Q1-D2, Q2-D3 a Q5-D6. esto es necesario debido a que una es salida Q1 (del flip-flop) y la D2 es la entrada del flip-flop siguiente, para una mejor comprensión de lo descrito, se recomienda ver las hojas de datos del 74HCT174.
Fig. 8
El esquema es muy sencillo y utiliza muy pocos componentes, usted puede utilizar cualquiera de ellos, aunque, se recomienda el uso del circuito especializado PCF8574P/AP.
Existe una versión de pantallas LCD en el que ya viene el PCF8574P/AP con el pcb del conversor paralelo a las entradas serie como el que se muestra, en ese caso, no hay más que conectarlas y aplicar un código que suele traer como ejemplo en las especificaciones y sin más problemas se pone en servicio.
Fig. 9
Se trata de un módulo que aprovecha la utilidad del bus-I2C que ya se comentó; con el uso de este módulo y la librería llamada LiquidCrystal_I2C, que podemos descargar más arriba, la cual mejora las opciones de la librería que viene por defecto en el IDE de Arduino, ya que además según F. Malpartida es mucho más rápida que la referida del IDE.
De modo que con cuatro hilos, VCC, GND, SDA y SCL, podemos controlar la pantalla LCD numérica de 16×2 o la de 20×4 columnas/filas. Cuando la tengamos descargada, si la versión de Arduino es anterior a la 1.6.4, la descomprimimos y copiamos en la carpeta libraries todos los archivos. Si la versión de Arduino es la 1.6.4 o mayor, la instalamos mediante el Manager Library como de costumbre y como se ve en la siguiente figura.
Fig. 10
Una vez instalada la librería, procederemos a conectar el módulo a nuestro Arduino, existen que yo sepa dos versiones de estos módulos con el PCF8574, así que, usted debe asegurarse de conocer la versión que tiene, de todos modos no hay problemas, se trata de la posición en que se han dispuesto los mencionados hilos de conexión.
1.- GND el pin del módulo es el pin GND de Arduino.
2.- VCC el pin del módulo es el pin VCC de Arduino.
3.- SDA el pin del módulo es el pin #4 analógico de Arduino.
4.- SCL el pin del módulo es el pin #5 analógico de Arduino.
Atendiendo a lo que se comenta en el artículo modulo serie para LCD los referidos módulos necesitan una dirección para ser llamados, estas direcciones que se muestran en la siguiente figura, se puede apreciar que disponemos de dos versiones el PCF8574 y PCF8574A como vemos.
Tabla de direcciones I2C
Fig. 11
Los PCF8574 y PCF8574A son funcionalmente iguales, pero tienen una porción fija diferente (A6 a A3) de la dirección esclava. Esto permite que ocho de los PCF8574 y ocho de los PCF8574A estén en el mismo bus I2C sin conflicto de direcciones. Actualmente hay muchos chips que cumplen con los parámetros del bus-I2C. Si tiene un dispositivo que no está seguro de la dirección del esclavo, puede ejecutar el boceto a continuación. Intenta todas las direcciones posibles (de 1 a 127) y si un dispositivo responde, imprime esa dirección el sencillo programa conocido como escaner_i2c.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// // // scanner_i2c.ino // // Version 1 // Este programa (código que aparece) se pueden encontrar en muchos sitios. // Por ejemplo, en el foro Arduino.cc. // El autor original no se conoce. // Este boceto prueba las direcciones estándar de 7 bits. // Los dispositivos con dirección de bits más alta // no pueden ser vistas correctamente. #include void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // El i2c_scanner utiliza el valor devuelto o el // Write.endTransmisstion para ver si un // dispositivo reconoció la dirección. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("Dispositivo I2C en dirección 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Error desconocido en dirección 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("Dispositivo I2C No hallado.\n"); else Serial.println("hecho\n"); delay(5000); // espera 5 segundos para otro scan } |
Sin embargo, se preguntará como aplicamos esta dirección que, como hemos visto puede estar en principio entre las 127 disponibles. La respuesta está en que usted debe utilizar un puente entre los puntos o isletas dispuestos para este fin, como se muestra en la imagen para este modelo.
Fig. 12
Esta pequeña tarjeta viene provista de un conector de 4 pines (ver foto), de arriba a abajo:
Fig. 13
- GND = GND o masa <Negro>.
- VCC = +Vcc de 5 Voltios <Rojo>.
- SDA = Pin analógico 4 de Arduino o TX, línea de datos <Blanco> .
- SCL = Pin analógico 5 de Arduino o RX, línea de reloj <Amarillo>.
El potenciómetro (azul, en la foto), permite el ajuste del contraste. Para ajustarlo, arranque un boceto, gire la pantalla y ajusta hasta que vea los caracteres brillantes y no los bloques de fondo que los contienen.
Fig. 14
En la foto de arriba, se aprecian los contactos A0, A1 y A2 habilitados para direccionar el PCF8574, vea la tabla de direccionamiento de más arriba, para seleccionar la dirección necesaria para su caso. En principio, estos pines están al aire, es decir, los tres son un 1 lógico, por tanto, la dirección es 0x27 en hexadecimal (39 decimal), según la tabla, si ponemos todos a 0 lógico, tendremos 0x20 en hexadecimal. Usted puede elegir la dirección que tenga libre, si es que usa más de un PCF8574. Mi dispositivo está puesto en: A0=1, A1=0 y A2=0, le corresponde (21h).
Fig. 15
Abra la carpeta librería que nos ofrece fmalpartida, y elija uno de los ejemplos de la biblioteca tiene muchas funciones avanzadas, presentan bocetos de software para diferentes pantallas. El código del ejemplo 2, puede utilizarse del mismo modo con este interface comercial. Por cierto, cuando el mensaje de la primera línea sea demasiado largo, llenaran la primera línea y continuarán en la tercera, debido a la forma interna en que operan los LCD.
De modo que esto es normal, modifique su mensaje y procure que no desborde el ancho de línea del LCD.
MANEJO DEL I2C CON PANTALLA LCD
En los días que estamos viviendo (tema de la pandemia), he revisado algunos artículos y he pensado en mejorar ciertas partes que por algún motivo pasé por alto sin entrar en detalle, por ese motivo he ampliado con un ejemplo de utilidad con un módulo MPU6050 que aplicamos con un LCD y la librería LiquidCrystal_I2C.h De modo que utilizaremos dos dispositivos con I2C como se aprecia en la imagen que sigue.
Fig. 16 Módulo serie LCD
El esquemático completo es el que sigue:
Las librerías utilizadas en este artículo o tutorial, se pueden descargar desde estos enlaces:
LiquidCrystal de fmalpartida.
Keypad.zip.
Password.
Una vez que ya conocemos la dirección del módulo, nos queda la parte más importante como es cargar el programa de nuestro proyecto y ponerlo en acción, veamos unos ejemplos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
// Basic demo for accelerometer readings from Adafruit MPU6050 // mpu6050_acelerometro_gyroscopo_LCD.ino #include "Adafruit_MPU6050.h" #include "Adafruit_Sensor.h" #include "Wire.h" #include "LiquidCrystal_I2C.h" // para I2C bus LCD modulo http://bit.ly/eNf7jM LiquidCrystal_I2C lcd(0x27,20,4); // establece dirección LCD según expansor Adafruit_MPU6050 mpu; void setup(void) { Serial.begin(115200); lcd.init(); lcd.backlight(); lcd.clear(); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("Adafruit MPU6050 test!"); Serial.println("MPU6050 ACEL"); Serial.println("24-03-2021 - Hispavila"); Serial.println("acelerometer_reading_MPU6050.ino"); lcd.setCursor(2, 0); // lcd.print("MPU6050 ACEL"); lcd.setCursor(4,1); lcd.print("09-2015 "); lcd.setCursor(0,2); lcd.print(" Hispavila.com "); lcd.setCursor(0,3); lcd.print("acelread_MPU6050.ino"); delay(4500); lcd.clear(); // Try to initialize! if (!mpu.begin()) { Serial.println("Failed to find MPU6050 chip"); while (1) { delay(10); } delay(500); } Serial.println("MPU6050 Found!"); } void loop() { /* Obtenga nuevos eventos de sensor con las lecturas */ sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); // Imprime los valores de salida lcd.setCursor(0,0); //Col 0, fila 0 lcd.print("Aceleracion ");lcd.print(" m/s^2"); lcd.setCursor(0,1); //Col 0, fila 1 lcd.print("X: "); lcd.print(a.acceleration.x); lcd.print(" Y: "); lcd.print(a.acceleration.y); lcd.setCursor(6,2); //Col 0, fila 3 lcd.print(" Z: "); lcd.print(a.acceleration.z); lcd.setCursor(0,3); lcd.print("Temperatura:"); lcd.print(temp.temperature); lcd.print(" gC"); } |
En esta ocasión, no pasaré a describir lo que hace cada rutina, ya que se supone que estamos en una prueba y este código nos muestra los detalles de cada rutina. Espero haber completado el artículo con este tercer ejemplo. El resultado de este código se puede apreciar en la siguiente imagen.
Fig. 18
De esta forma liberamos los puertos de Arduino y hemos aprovechado un sistema que proporciona puertos adicionales a nuestros proyectos.
Esto es todo, por este simple tutorial.
Las librerías utilizadas en este artículo o tutorial, se pueden descargar desde estos enlaces:
1 2 3 4 |
<a href="https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads" target=" " rel="noopener">LiquidCrystal de fmalpartida.</a> <a href="https://github.com/ELECTROALL/Codigos-arduino/blob/master/LiquidCrystal_I2C.zip" target=" " rel="noopener">LiquidCrystal_I2C</a> <a class="urllink" href="http://arduino.cc/playground/uploads/Code/Keypad.zip" target=" " rel="nofollow noopener">Keypad.zip.</a> <a href="http://www.arduino.cc/playground/Code/Password&anno=2" target=" " rel="noopener">Password.</a> |