En cumplimiento del Real Decreto-ley 13/2012 le informamos que este blog utiliza cookies propias y de terceros con el objetivo de personalizar el contenido, ofrecer funciones de redes sociales y analizar el tráfico. Si continúa navegando consideramos que acepta el uso de cookies. A partir del resultado de la votación en el parlamento europeo de la reforma de la protección de datos este mensaje puede desaparecer en abril y pasar a mostrarse una vez al mes como recordatorio.
Acepto | Quiero saber más
TuxyLinux

Programar un display en arduino con LyquidCrystal y el IC 74HC595

Con arduino casi siempre llega un momento en el que queremos usar una pantalla para mostrar información o interactuar con nuestro proyecto y la forma más sencilla es empezar con un display LCD de 16x2 basado en el chip de Hitachi HD44780 junto con la librería LiquidCrystal.

Para poder manejar estos display existe una librería llamada LiquidCrystal que tiene un conjunto de funciones que nos ayudan a programarlo. El problema es que nos ocupa 6 pines de la placa, por ese motivo existe ésta misma librería modificada para ser utilizada por el bus SPI con un desplazamiento de registros 74HC595.

En esta primera parte explicaré por encima el display y el integrado 74HC595.

El Display LCD

El display que utilizo es muy sencillo y barato. Como mencioné antes esta controlado por el chip HD44780 (integrado en la pantalla) y puede trabajar con una entrada de datos en paralelo de 4 u 8 bits.

¿Que significa el 16x2? El primer número (16) indica el número de caracteres que tiene una fila y el segundo (2) el número de filas que tiene la pantalla. Por tanto un display 16x2 nos indica que tiene dieciséis caracteres por fila y que la pantalla tiene dos filas (32 caracteres en total distribuidos en dos filas).

En la siguiente imagen se pude ver a qué pertenece cada pin de la pantalla.

pines-lcd

Vss -> Polo negativo (0V)
Vdd -> Alimentación general (5V)
Vo -> Mediante un potenciometro y a través de este pin controlamos el contraste de la pantalla
RS -> Selecciona el registro de comandos o el de datos
R/W -> Escribe o lee el LCD
E -> Habilita/deshabilita el funcionamiento de la pantalla
D0 a D7 -> Entrada de datos. LSB es el bit menos significativo y MSB el bit más significativo.

Hay que tener en cuenta que los pines 15 y 16 no siempre vienen en todos los modelos. Estos pines corresponden a la retroiluminación de la pantalla, el pin 15 es el ánodo (5V) y el 16 el cátodo (GND). Trabajando con 5V no es necesario conectar ninguna resistencia en estos pines.

La entrada de datos D7 es ligeramente diferente a las demás, esta entrada pude funcionar como un "busy flag" que no es más que un indicador de que el display esta ocupando realizando alguna operación y no permite la entrada de datos hasta que termine. 5V en este pin indica que esta ocupado.

El display puede trabajar en 4 u 8 bits y la librería LiquidCrystal utiliza 4 bits que son las entradas de datos de D4 a D7 del display.

Para más información sobre el funcionamiento del display lo mejor es echar un vistazo al datasheet del HD44780.

INTEGRADO 74HC595

El integrado 74HC595 es un registro de desplazamiento que nos va a permitir manejar el display LCD utilizando sólo tres pines de la placa arduino (el bus SPI).

Como ya sabemos, la transferencia de datos del display LCD se hace en paralelo, el arduino lo que envía por el bus SPI son los bits desde el MSB al LSB en serie, el desplazamiento de registro los almacena y cuando tiene todos los bits los envía al display en paralelo.

A continuación pongo el diagrama lógico con los pines y explico qué es cada pin.

diagrama-ic-75hc595

A -> Esta es la entrada de datos, por aquí mandamos desde el arduino la información que queremos pasar al display. Esta comunicación es en serie.
Shift clock -> Este es el reloj para que la comunicación esté sincronizada.
Reset -> Reinicia el registro (pone a 0 todos los bits del registro).
Latch clock -> Este es el reloj que marca cuándo debemos enviar los datos en paralelo.
Output enable -> Habilita la salida en paralelo
Qa a Qh -> Salida de datos en paralelo
SQh -> Salida de datos en serie
VCC -> Alimentación (5V)
GND -> Polo negativo (0V)

Los 3 pines que conectamos al arduino son la entrada de datos serie, el shift clock y el latch clock. El pin de reset lo conectaremos a positivo para que el registro no se reinicie y el Output enable a negativo para habilitar la salida en paralelo.

Para ver más información sobre el registro de desplazamiento podéis consultar el datasheet del 74HC959.

ESQUEMA

esquema-frintzing

En el esquema hecho en fritzing de la imagen anterior podemos ver como se conecta todo el conjunto pero antes conviene que sepamos par de cosas antes de ponernos a montarlo.

El latch pin (pin 12 del 74HC595) puede ir conectado en cualquier pin del arduino siempre que tenga PWM (es decir pines 3, 5, 6, 9 y 10 del arduino UNO). El pin 13 y 11 quedan reservados, si queremos cambiar esos pines tendremos que modificar la librería y creo que es más sencillo conectar en otro pin que tengamos libre 😉

El potenciómetro también debe instalarse siempre, este potenciómetro controla el contraste del display. Como alternativa se puede poner un divisor de tensión con dos resistencias, lo que dejaría un contraste fijo en la pantalla.

Si queremos controlar la retroiluminación (luz de fondo de la pantalla) mediante el arduino tenemos que conectar el cátado (pin 16 marcado como K) a negativo y el ánodo (pin 15 marcado como A) a un pin digital del arduino. Personalmente yo conectaría el ánodo al emisor de transistor NPN, la base al pin digital del arduino y el colector a positivo.

En el esquema falta una conexión y es la del pin 5 de la pantalla que corresponde a la entrada R/W la cual debe conectarse a negativo.

Una vez considerados los puntos anteriores podemos proceder a conectar todo. En la siguiente tabla indico de forma resumido como va conectados los cables.

referencia'conexion

Librería LiquidCrystal

Las funciones de esta librería nos va a permitir controlar el display LCD. Cabe destacar que para este montaje se utiliza la librería LyquidCrystal.h modificada para trabajar con SPI, esta librería se puede descargar desde aquí. Después de descargar la librería debemos descomprimir el archivo y mover la carpeta LiquidCrystal dentro de la carpeta libraries del directorio principal del IDE de arduino.

Estas son las funciones que incluye LiquidCrystal.h

LiquidCrystal lcd(x) -> Crea una variable llamada lcd indicando el sspin o el latch pin del 74HC595
autoscroll() -> Desplaza el texto al escribir
noAutoscroll() -> Sobreescribe el texo al escribir
begin(x,y) -> Establece el número de columnas y filas
blink() -> Muestra el cursor parpadeante
noBlink() -> Oculta el cursor parpadeante
clear() -> Borra lo escrito en el display
createChar() -> Crea un caracter personalizado
cursor() -> Muestra el cursor
noCursor() -> Oculta el cursor
display() -> Enciende el display
noDisplay() -> Apaga el display
home() -> Situa el cursor en 0,0
leftToRight() -> Establece la dirección del texto de izquierda a derecha
print() -> Muestra texto, variables, etc en el display
rightToLeft() -> Establece la dirección del texto de derecha a izquierda
scrollDisplayLeft() -> Desplaza el display un punto a la derecha
scrollDisplayRight() -> Desplaza el display un punto a la derecha
setCursor(x,y) -> Situa el cursor en la posición x,y
write() -> Muestra un caracter en el display

Para ver con más detalle cada función consulta en la página de referencia de la librería LiquidCristal en la web de arduino.

CÓDIGO DE EJEMPLO

El siguiente código es el típico Hola mundo explicado con comentarios.

//Incluye las librerías mínimas necesarias
#include <SPI.h>
#include <LiquidCrystal.h>
 
//Inicia la librería LiquidCrystal, hay que indicar el pin del arduino que esta
//conectado al latch pin del 74HC595
LiquidCrystal lcd(10);
 
void setup() {
  //Cargamos las dimensiones de la pantallas (columnas y filas, en ese orden)
  lcd.begin(16, 2);
  lcd.print("Hola mundo!");      //Muestra un mensaje inicial
}
 
void loop() {
  //Mueve el cursor de escritura a la columna 3 de la segunda fila,
  //(se empieza a contar desde 0)
  lcd.setCursor(2, 1);
  //Muestra el mensaje "Hey Hola" y una cuenta ascendente en segundos.
  lcd.print("Hey! Hola! ");
  lcd.print(millis()/1000);
}

Es aconsejable (obligatorio más bien) leer la documentación de la librería para poder manejarla correctamente.

Como pista inicial para trabajar cómodamente con la pantalla pensad que cada caracter que se escribe en la pantalla permanece escrito hasta que se escribe por encima o se borra la pantalla con clear().

Esto puede provocar que si escribes primero una palabra de 10 caracteres en la primera fila y luego escribes por encima sin haber borrado la pantalla otra de 6 tendrás tu palabra de 6 letras seguido de los 4 últimos caracteres de la primera palabra.

Con esto tienes la información más básica para empezar a manejar un display de este tipo.

Deja un comentario

Tu dirección de correo electrónico no será publicada.