PROLOGO.

Este documento es como una introducción a los LCD’s en este sitio, 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.

Fig. 1

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 él, disponemos de 8 nuevos pines en nuestro Arduino. A continuación, vemos un cuadro resumido, de la funcionalidad de los pines del PCF8574.

pines_lcd2004Fig. 2

   D0-D7 Datos bidireccionales.
   RS   Seleccionar datos o registro de instrucciones.
   LO   Instrucción registro, si escribe, bandera de ocupado y cuando lee contador de direcciones.
   HI   Registrar datos para leer y escribir contenido de la pantalla.
   R/W  Seleccionar la dirección de datos, es decir, leer o escribir.
   HI   Lee en el registro seleccionado.
   LO   Escribe en el registro seleccionado.
   E    Este pin se utiliza por el reloj de transferencia de datos.
   LO→HI Si la lectura del estado de RS y la línea R/W son altas, se asume la escritura del estado de las líneas de datos. 
   LO→HI Si la lectura de los datos de las líneas de datos es correcta hasta que se produce esta transición
   VCC  Suministro, a menudo 5V
   GND  Tierra
   VEE  Contraste. A menudo es controlada por un potenciómetro entre VCC y GND con su pin central conectado a VEE. 
Atención: También hay pantallas que necesitan una tensión de contraste negativo en el pin3.

En la tabla de abajo, se hace referencia a las direcciones que permiten los pines A0 a A2, para el PCF8574, podemos ver que, al poner los tres pines a BAJO, la dirección 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).

pcf8574t_adress_tipcf8574pines
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.

      ID             Addr.         PIN's
    PCF8574   b01000000  0x20h    A2A1A0
    PCF8574A  b01110000  0x38h    A2A1A0

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:

<a=»» href=»http://www.hispavila.com/wp-content/uploads/2007/02/tabla_pines8574-300×98.gif» target=»_blank» rel=»noopener noreferrer»>tabla_pines8574</a=»»>
Fig. 3b

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ÓDULO PARA LCD PARALELO.

En definitiva, ampliar la capacidad de puertos de Arduino con la ayuda de un circuito integrado PCF8574, puede reducir de 10 a 2 la cantidad de pines necesarios para manejar un dispositivo como el LCD, un teclado u otro dispositivo similar. Existe una versión de pantallas LCD que ya viene con las entradas serie, 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.

conversorlcdFig. 4

Actualizado el 11.10.2014 para mayor claridad.
Se ha añadido el transistor NPN, para mejor control del brillo de los caracteres.

Si se da 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.

esquema_lcdpcf8574pFig. 5

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, aunque no se trate de un Bus I2C, el circuito de 16 patillas, 74HCT174 CMOS, 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.

74hct174Fig. 6

Empleando el esquema que se muestra a continuación. En el esquema, se observa que las patillas Q1-D2, Q2-D3, etc., esto tiene es necesario debido a que una es la salida Q1 (del flip-flop) y la D2 es la entrada del flip-flop siguiente, para una mejor comprensión de los descrito, se recomienda ver las hojas de datos del 74HCT174.

74hct_lcdFig. 7

El esquema es muy sencillo y utiliza muy pocos componentes, usted puede utilizar cualquiera de ellos, aunque, se recomienda el uso del circuito especializado PCF8574/A.

EL PCB.

Cuando uno se queda sin puertos de E/S, tiene que recurrir a estrategias de «compensación de faltas» y como ya hemos dicho, se hace necesario el uso de circuitos integrados que cumplan con esos requisitos. Hemos visto que el PCF8574, cumple perfectamente, sin embargo, esta circunstancia puede hacerse necesaria en otras ocasiones y estaría bien disponer de un PCB, que de forma unitaria, nos pueda servir en distintos proyectos. Este es el caso del PCB de una sola cara, mostrado a continuación.

2014-04-27_201707 modulo_i2c6
Fig. 8

Una versión realizada con el programa Ares y una versión con trazado de pistas con Inkscape, ambas versiones aquí, las puede descargar. Si usted se decide a poner en práctica este PCB, seguramente tendrá más de una oportunidad, para hacerlo servir.

EL CÓDIGO.

Ya sólo nos falta abordar el código del programa. Espero que usted tenga a mano el expansor PCF8574/A y pueda hacer las prácticas que, a modo ejemplo siguen.

En primer lugar, vamos a realizar una prueba del circuito impreso de una sola cara que, hemos desarrollado en párrafo anterior. Trataremos de solucionar los posibles errores o problemas que surjan tanto del trazado como del código que hayamos de utilizar.

He probado un par de librerías que, tratan del control de pantallas LCD, algunas de las cuales no me han dado el resultado que yo esperaba y puesto que dispongo de otras librerías, lo más sencillo que me resultó era, probar con otra y de esta forma encontré la de «LiquidCrystal_I2C.h» que, no requiere modificar nada ya que está completa y se adapta a mis proyectos. Veamos el ejemplo:

Número PIN largo.

// 
// display01.pde - keypad con LCD y expansor PCF8574A
// basado en un programa de: 

/* Usando el actual ejemplo de hardware, se puede controlar un LCD mediante el
circuito PCF8574A.De este modo se utilizan sólo dos pines de Arduino para
manejar el LCD. Nuestro objetivo con este ejemplo es muy simple. 

El sistema espera para obtener un PIN que se guarda previamente. 
Si el PIN es correcto, hacer algo. Si el PIN es incorrecto, hacer otra cosa. 
Este ejemplo es para darle un concepto y un marco para construir ideas propias. 

19.10.2011 funciona bien.
*/

#include <Wire.h>  
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x38); // Set the LCD I2C address

#define BACKLIGHT_PIN 13

void setup()
{
  // Switch on the backlight
  pinMode (BACKLIGHT_PIN, OUTPUT);
  digitalWrite (BACKLIGHT_PIN, HIGH);

  lcd.begin(20,4); // inicializa el LCD 
  lcd.clear ();    // lo mismo que: home(); 
  lcd.print(" Mensaje"); 
  lcd.setCursor ( 1, 1 ); // va a la siguiente línea
  lcd.print (" Hola, ARDUINO ");
  lcd.setCursor ( 2, 2 ); 
  lcd.print ("Programa con I2C"); 
  lcd.setCursor ( 3, 3 ); 
  lcd.print (" Que pasada... ");
  delay ( 1000 ); }

void loop()
{
}

En esta ocasión, no pasaré a describir lo que hace cada rutina, ya que se supone que estamos en una prueba y usamos un código que ya se ha descrito en muchos sitios.

Después de probado el código, se puede decir que funciona bien el primer ensayo del PCB, en principio, esta era la meta del proyecto, sondear la posibilidad de conseguir de forma sencilla un módulo que, nos permita utilizar una pantalla LCD paralelo, de las más típicas y convertirla a serie, así como un teclado matricial de hasta 4×4 u ocho pulsadores independientes, dotando al módulo de un sistema que nos permitiera manejarlos mediante el bus I2C, reduciendo considerablemente los pines de Arduino a utilizar.

SEGUNDA PRUEBA.

Esta será la segunda prueba y esperemos que la definitiva. Es el momento de presentar el código del programa. Para ello, propongo utilizar un código que ya sabemos que funciona. Se trata del mismo código que ya utilicé en otra práctica, en el mencionado artículo (teclado con LCD). En esta ocasión, he utilizado la comentada librería ‘LiquidCrystal_I2C.h‘ que permite el uso del PCF8574A.

Naturalmente, si el lector lo prefiere, puede realizar dos módulos, uno para el LCD y el otro para el teclado, esto le dejará libre muchos pines del Arduino, ya que tan sólo empleará 2 pines, correspondientes a SDA y SCL. Sin embargo, en caso de decidirse por utilizar dos módulos, tenga en cuanta modificar en uno de ellos al menos la dirección de esclavo, para ello, ponga a positivo con una resistencia de 10k, una de las patillas, A0, A1 o A2. Ponga atención a la tabla de direccionamiento de más arriba.

Ejercicio 2 – LCD serie.

// 
/* keypad Numerico y LCD I2C

Utilizamos las librerias: [Password.h ÷ LiquidCrystal_I2C.h ÷ Keypad.h]
que puede encontrar en: https://hispavila.com/3ds/atmega/clavenum.html 

Usando el actual ejemplo de hardware se pueden activa algo o desactivar
mediante el teclado - emulando lo que se puede encontrar en algunos 
sistemas de alarma y as sucesivamente. Nuestro objetivo con este ejemplo 
es muy simple. Un sistema de espera para obtener un PIN que se especifique 
previamente. Si el PIN es correcto, hacer algo. Si el PIN es incorrecto, 
hacer otra cosa. Lo que las acciones pueden llegar a hacer. Con el proyecto 
vamos a activar o desactivar una salida digital. Este ejemplo es para 
darle un concepto y un marco para adaptar o construir ideas propias.

Usa 6728 bytes con el IDE v. 00013

*/

#include <Password.h>
#include "Keypad.h" 
#include "Wire.h" // para I2C LCD 
#include "LiquidCrystal_I2C.h" // para I2C bus LCD modulo 16x2 o 20x4 
LiquidCrystal_I2C lcd(0x38); // establece dirección LCD según expansor 
Password password = Password( "1234056" ); // puede poner su pasword 

const byte ROWS = 4; // cuatro rows
const byte COLS = 3; // tres columns
char keys[ROWS][COLS] = 
{{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0',' '}
};
// Conectar keypad ROW0, ROW1, ROW2 y ROW3 a los pines de Arduino.
byte rowPins[ROWS] = { 5, 4, 3, 2}; //conecta a los pines row del keypad
byte colPins[COLS] = { 16, 15, 14}; //conecta a los pines col del keypad
int count=0;
const int buttonPin = 0; 
int buttonState = 0;
int i;
#define ledPin 13

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
 {
  pinMode(buttonPin, INPUT); 
  pinMode(ledPin, OUTPUT); 
  lcd.begin(20, 4);
  digitalWrite(ledPin, LOW); // pone el LED off
  Serial.begin(9600); 
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  keypad.setDebounceTime(250);
  lcd.clear();     //Borra el LCD
  lcd.setCursor(0,0);
  lcd.print("Entre secuencia PIN:"); 
  lcd.setCursor(2,2); 
  lcd.print("Para terminar #"); 
  lcd.setCursor(0,3); 
  lcd.print(" Intentelo: "); 
 }

void loop(){
  keypad.getKey();
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {   }
 }

// atender algunos eventos especiales
void keypadEvent(KeypadEvent eKey){
 switch (keypad.getState()){
  case PRESSED:
// 	lcd.print(eKey); // descomentar para ver numeros pulsados o
  lcd.print("*"); // descomentar para ver * x pulso
  switch (eKey){
   case ' ': guessPassword(); break;
   default:
   password.append(eKey);
   }
  }
 }

void guessPassword(){ 
 if (password.evaluate()){ 
  digitalWrite(ledPin,HIGH); //activa rel de la puerta
  delay(500); 
  digitalWrite(ledPin,LOW); //desactiva rel de la puerta .5 sec
  // secuencia de sonido alto
  lcd.clear(); 
  lcd.setCursor(0,0); 
  lcd.print("PASSWORD VALIDO "); //
  password.reset(); //resetea password despues de entrada correcta
  delay(1000); 
  lcd.setCursor(0,0); 
  lcd.print("Bienvenido, Sr.");
  delay(500);
    for (int positionCounter = 0; positionCounter < 22; positionCounter++) 
     {
     // scroll one position right:
     lcd.scrollDisplayRight(); 
     delay(150); // wait a bit: //espera un poco
    } 
  delay(500); // espera 35 segundos antes de volver a inicio 
  setup(); 
 }

  else{ 
    i = i++;
    digitalWrite(ledPin,LOW);
    lcd.clear();
    lcd.print("PASSWORD INVALIDO ");
    password.reset(); //resets password after INCORRECT entry
    delay(2000); // tiempo de retardo
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Entre secuencia PIN:"); 
    lcd.setCursor(0,3); 
    lcd.print(" Intentelo: "); 
  }

  if (i==3)
  {
    // secuencia de sonido bajo 
    lcd.setCursor(0,1);
    lcd.print("Lo siento... ");
    lcd.setCursor(0,2);
    lcd.print("Intentelo mas tarde"); 
    lcd.setCursor(0,3); 
    lcd.print(" "); 
    delay(35000); // espera un tiempo antes de seguir
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Entre secuencia PIN:"); 
    lcd.setCursor(0,2); 
    lcd.print(" Intentelo: "); 
    i=0;
   }
  }

Hemos logrado hacer un módulo PCB que nos facilita el uso de un expansor de puertos sencillo de usar como es el PCF8574/A. Esto además de una baliza práctica, nos ha proporcionado un PCB al que podemos dar mucha utilidad en nuestros futuros proyectos con microcontrolador, si bien está pensado para el Arduino, aunque, no lo he probado con otros, cabe esperar que funcione, ya que se trata de usar el bus-I2C y esto no es privativo de un micro concreto.

pcb_pcf8574a14Fig. 9

 He actualizado un PCB de mayores dimensiones, al cual mediante las correspondientes tiras de pines largos, podemos acoplarlo al Arduino y aplicar directamente la pantalla LCD. Si lo desea, puede descargarlo de aquí.

[Editado 17/04/2014]

NUEVO INTERFACE I2C PARA DISPLAY LCD.

He recibido recientemente, una muestra gratuita de una tarjeta que utiliza esta técnica y que amablemente me ha proporcionado la empresa Electronicca.com. En el mercado, podemos encontrar este dispositivo que cubre el sector del I2C para manejar un LCD de 16×2 como 20×4, controlado por el HD77840 que es el más común.

mochila_i2c_3pFig. 10

Esta pequeña tarjeta viene provista de un conector de 4 pines (ver foto), de arriba a abajo:

conectorLCD5Fig. 11

   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.

mochilai2c_3pFig. 12

En la foto de arriba, se aprecian los contactos (en el circulo rojo) habilitados para direccionar el PCF8574, A0, A1 y A2, 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 uno 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).

interface_i2cFig. 13

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. 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.

Las librerías utilizadas en este artículo o tutorial, se pueden descargar desde estos enlaces:

LiquidCrystal de fmalpartida.
Keypad.zip.
Password.

Si lo prefiere, también puede descargar keypad de aquí..

Esto es todo, por este simple tutorial.

Módulo serie para LCD paralelo.
Etiquetado en:        

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.