Está en la página 1de 17

Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas

Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales


Docente: Ing. José Mauricio Rivera

Uso de pantalla de cristal líquido (LCD) con Arduino


COMPETENCIAS:

1. Conocer la configuración de pantallas de cristal líquido (LCD) con Arduino


2. Conocer la generación de caracteres personalizados en la LCD
3. Mostrar como enviar mensajes a una LCD a través del puerto serial

INTRODUCCIÓN.

Las pantallas de cristal líquido (“Liquid Crystal Displays” –LCDs– ) ofrecen una manera muy
rápida y vistosa de mostrar mensajes. Las podemos clasificar en LCDs de caracteres y LCDs
gráficas (estas últimas también llamadas GLCDs). Las primeras sirven para mostrar texto ASCII
y se comercializan en diferentes tamaños (16x2, 20x4...) donde el primer número indica la
cantidad de caracteres que caben en una fila, y el segundo número es el número de filas que
caben en la pantalla. Las segundas sirven para mostrar, además de texto, dibujos e imágenes, y
también se comercializan en diferentes tamaños, los cuales están definidos por la cantidad de
píxeles que pueden mostrar (128x64, 128x128...). Las LCDs de caracteres, por su parte, pueden
mostrar pequeños iconos de 5x7 píxeles o similar. Las LCDs de caracteres más habituales son
de 4-bit o 8-bit, dependiendo del número de cables (bits) que necesitan tener conectados al
circuito para poder recibir o enviar datos. Ojo, solo se cuentan los cables que son
estrictamente de transferencia de datos ya que en realidad una LCD necesita no solo 4 o 8
cables para funcionar, sino varios más (como los de alimentación, tierra, reseteado...).

1
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

Otras características pueden tener (o no) las LCDs de caracteres son la posibilidad de iluminar
el fondo de la pantalla (opción ideal para entornos con poca luz ambiental) o la posibilidad de
utilizar varios colores de fondo (y no solamente el blanco/negro sobre azul/verde, que suele
ser lo habitual), etc. Cada modelo de LCD es diferente, por lo que es imprescindible consultar
su datasheet concreto para poder distinguir los diferentes pines de conexión que ofrece y sus
características generales. De todas formas, lo más habitual es que una LCD estándar ofrezca:

Un pin para recibir la alimentación (normalmente con los 5 V que proporciona la placa Arduino
ya está bien, pero hay modelos que requieren 3,3 V, así que hay que verificar esto) y otro pin
para conectar la pantalla a tierra. Es conveniente conectar un divisor de tensión entre la fuente
de alimentación y el pin de alimentación de la pantalla para evitar posibles daños. Para calcular
el valor óptimo de esta resistencia, se deben consultar dos valores en el datasheet del LCD: la
corriente máxima soportada para la luz de fondo y la caída de tensión causada por esta.
Haciendo uso de la Ley de Ohm, si se resta dicha caída de tensión de los 5 V y se divide el
resultado entre esa corriente máxima, obtendremos el valor de la resistencia (redondeando al
alza) que necesitamos. Por ejemplo, si la corriente máxima es de 16 mA y la caída de tensión es
de 3,5 V, la resistencia debería ser (5 – 3,5)/0,016 = 93,75 ohmios (o 100 ohmios redondeando
a un valor estándar). Si no se puede consultar el datasheet, un valor seguro para usar son 220
ohmios, aunque un valor tan alto hará que la luz de fondo sea más tenue.

Un pin para regular el contraste de la pantalla. Este pin se debe conectar a la patilla central de
un potenciómetro de nuestro circuito (el cual a su vez ha de tener sus patillas exteriores

2
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

conectadas a la alimentación y tierra, respectivamente), de manera que regulando el


potenciómetro podremos regular el contraste de la pantalla. Tres pines de control
generalmente marcados como “RS”, “EN” y “RW”, que se deberán conectar cada uno a un pin
digital de la placa Arduino. El pin “RS” sirve para que el microcontrolador le diga a la LCD si
quiere mostrar caracteres o si lo que quiere es enviar comandos de control (como cambiar la
posición del cursor o borrar la pantalla, por ejemplo). Concretamente, si por ese pin el LCD
detecta una señal LOW, los datos recibidos serán tratados como comandos a ejecutar, y si
detecta una señal HIGH, los datos recibidos serán el texto a mostrar en la pantalla. El pin “EN”
establece la línea “enable”, la cual sirve para advertir a la LCD que el microcontrolador le va a
enviar datos (ya sean de control o para imprimir). Esta advertencia se produce cada vez que la
señal recibida por ese pin cambia de HIGH a LOW. Finalmente, el pin “RW” sirve para definir si
se desea enviar datos a la LCD (lo más común) o recibirlos de ella (muy poco común); si
estamos en el primer caso, este pin deberá recibir una señal LOW y en el segundo caso deberá
recibir una señal HIGH, por lo que, como normalmente no lo necesitaremos para nada, lo
conectaremos casi siempre a tierra.

Varios pines (4 u 8, según si la LCD es de “4-bit” o “8-bit”) que se deberán conectar también
cada uno a un pin digital de la placa Arduino. Se usan para establecer las líneas de
comunicación en paralelo por donde se transfieren los datos y los comandos de control de la
placa Arduino hacia el LCD. Hay que saber que una LCD de 8 bits puede funcionar
perfectamente con solo cuatro cables de datos conectados (es decir, funcionando como una
LCD de 4 bits), pero lo hará a una velocidad menor.

Dos pines exclusivos para el circuito de la luz de fondo (uno para recibir la alimentación y el
otro pin para conectar a tierra). Si la pantalla no dispone de luz de fondo (también llamada de
“retroalimentación”), estos pines o no existirán o no serán usados para nada.

El diseño de un Sketch para manipular el despliegue de mensajes en una LCD conectada a


Arduino requiere de una librería estándar: LiquidCrystal.h que incorpora algunas funciones
muy útiles para manipular la LCD.

LCD 16x2 por I2C

Las pantallas LCD comunes tienen el inconveniente de requerir muchos cables para conectarse
al circuito. Como consecuencia, en nuestra placa Arduino nos pueden quedar pocos pines

3
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

disponibles para usarlos en otras cosas. Una solución a este inconveniente es el empleo de
pantallas LCD que utilizan un sistema de comunicación con la placa Arduino diferente del ya
comentado, como pueden ser los protocolos I2 C (el cual solo utiliza las líneas SDA y SCL), o el
serie (usando solo las líneas RX y TX), principalmente.

El I2C es un bus de comunicaciones que usa 2 líneas para enviar y recibir información y 2 más
para alimentación. La gran cantidad de pines que tiene el display LCD 16x2 (16 pines)
hace necesario en algunas ocasiones que tenga incorporado (o incorporarle) un módulo para
permitir la comunicación por I2C ya que con este necesita sólo 4 pines para funcionar.

Módulos OLED de Adafruit

Podemos utilizar módulos OLED (que no son shields propiamente dichos) con Arduino. En
concreto, Adafruit distribuye dos módulos monocromos, ambos de 128x32 y 128X64 píxeles.
Los dos módulos incluyen el mismo chip (el SSD1306 de Solomon Systech), el cual puede
comunicarse con la placa Arduino de dos maneras. vía SPI y I2 C. Ambos módulos incorporan
internamente un elevador de tensión para convertir los 5 V de los pines de Arduino en hasta
12 V y poder alimentar así los píxeles de la pantalla, pero, no obstante, su circuitería
electrónica solo puede ser alimentada con 3,3 V para funcionar correctamente.
Afortunadamente, ambos módulos (SPI y I2 C) incorporan internamente un regulador de
tensión general que rebaja los 5 V a 3,3 V, por lo que podremos conectarlos a nuestra placa
Arduino sin problemas.

4
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

Funciones de Configuración

LiquidCrystal lcd (rs, enable, d4, d5, d6, d7): esta función se debe incluir al inicio del Sketch
antes de la función setup(), permite la creación de un objeto llamado lcd (este nombre puede
ser cualquiera), para que pueda ser manipulado más adelante dentro del Sketch. Como
paramentos recibe los números de pines Arduino donde se conecta la LCD a manejar, los
nombres rs, enable, d4, d5, d6 y d7 hacen referencia a los pines de la pantalla. Por ejemplo si
se usa el LCD KEYPAD SHIELD la instrucción seria: LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

lcd.begin (Ncaracteres, Nfilas): esta función inicializa el objeto llamado lcd con las dimensiones
de la pantalla LCD conectada a Arduino, recibe dos parámetros: el número de caracteres y filas
de la pantalla, así: lcd.begin(16,2); indica que se usara una LCD de 16 caracteres por 2 filas.
Esta función se declara dentro del setup() del Sketch.

Funciones de Manipulación

lcd.clear():Borra la pantalla LCD conectada la tarjeta Arduino y posiciona el cursor en la esquina


superiorizquierda.

lcd.setCursor(col, row): Establece la posición del cursor; Esto es, la posición donde aparecerán
los siguientes caracteres escritos en el LCD, recibe como parámetros las coordenadas de la
posición donde se desea ubicar el cursor, por ejemplo

lcd.setCursor(0,1); ubica el cursor en la esquina inferior izquierda, fila de abajo en la posición


izquierda.

lcd.print(var o “texto”): esta función imprime en la pantalla LCD en la posición actual del cursor

5
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

ya sea un texto o el contenido de una variable, la información a desplegar se pasa como


parámetro de la función, por ejemplo la instrucción lcd.print("hola mundo"); imprime el
mensaje “hola mundo” en la LCD.

lcd.autoscroll(): Activa el desplazamiento automático del texto en la pantalla LCD. Esto hace
que cada salida de caracteres en la pantalla, "empuja" los caracteres anteriores en una
posición. Si la dirección del texto actual es de izquierda a derecha (por defecto), el texto se
desplaza hacia la izquierda, si la dirección actual es de derecha a izquierda, el texto se desplaza
hacia la derecha. Esto tiene como efecto que la entrada de cada nuevo carácter se produce en
la misma posición en la pantalla LCD. NO recibe ningún parámetro.

lcd.createChar(num, data): Crea un carácter personalizado para su uso en la pantalla LCD.


Hasta ocho caracteres de 5x8 píxeles son permitidos (numerados del 0 al 7). La apariencia de
cada carácter personalizado se especifica mediante una serie de ocho bytes, uno para cada fila.
Los cinco bits menos significativos de cada byte determinan los píxeles en esa fila. Los
parámetros num es el número de orden que le asignamos al carácter creado y data es la
referencia a el arreglo donde están los datos del carácter especial. Para mostrar un carácter
personalizado en la pantalla, usar write() especificando su número de orden.

MATERIALES Y EQUIPOS:

• 1 placa arduino uno

• 1 cable de conexión

• 1 módulo LCD 16x2

• 1 breadboard

• 1 lapto

• Software Arduino IDE

• Simulador Tinkerkad

• Simulador Proteus

6
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

PROCEDIMIENTO:

Competencia 1. Conocer la configuración de pantallas de cristal líquido (LCD) con Arduino

Abre tu IDE de Arduino y escribe el siguiente programa, compila. Guárdalo con el nombre de
Pantalla LCD

#include <LiquidCrystal.h> // importa libreria

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // pines RS, E, D4, D5, D6, D7 de


modulo 1602A

void setup() {

lcd.begin(16, 2); // inicializa a display de 16 columnas y 2 lineas

void loop() {

lcd.setCursor(3, 0); // ubica cursor en columna 4, linea 0

lcd.print("Hola Mundo"); // escribe el texto en pantalla

Construye el circuito en tirkercad, carga el programa y simula

7
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

Describe lo que observas:

Varía el potenciómetro en ambas direcciones, que observas:

Cambia los valores de la instrucción, lcd.setCursor(3, 0); por lcd.setCursor(0, 0); y simula, que
observas:

Cambia el contenido de la instrucción, lcd.print("Hola Mundo"); por lcd.print("Uso de la LCD");

Simula, que observas:

Modifica el programa para hacer aparecer en la fila 0 las siglas LCD centrada y en la fila 1 la
frase “Configurada”, también centrada: muestra una captura de pantalla.

Agrega las líneas de código lo siguiente y simula:

lcd.display();
delay(500);
lcd.noDisplay();
delay(500);

Que observas:

Borra el contenido de void loop, agrega las líneas de código y simula

lcd.setCursor(2, 0);
lcd.print("Prueba scroll");
lcd.scrollDisplayRight();
delay(500);

Que observas:

Ahora combina las instrucciones vistas para hacer un programa en el cual aparezca una frase
“Sistemas Digitales” en la columna 2 de la fila cero, que se encienda y apague y se desplace a la
derecha con un retardo de 100ms

Coloca una captura

8
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

LCD 16x2 por I2C

Las pantallas LCD comunes tienen el inconveniente de requerir muchos cables para conectarse
al circuito. Como consecuencia, en nuestra placa Arduino nos pueden quedar pocos pines
disponibles para usarlos en otras cosas. Una solución a este inconveniente es el empleo de
pantallas LCD que utilizan un sistema de comunicación con la placa Arduino diferente del ya
comentado, como pueden ser los protocolos I2 C (el cual solo utiliza las líneas SDA y SCL), o el
serie. (usando solo las líneas RX y TX), principalmente. El I2C es un bus de comunicaciones que
usa 2 líneas para enviar y recibir información y 2 más para alimentación. La dirección I2C por
defecto del módulo puede ser 0x3F o en otros casos 0x27. Es muy importante identificar
correctamente la dirección I2C de nuestro modulo, pues de otra forma nuestro programa no
funcionará correctamente. Para identificar la dirección especifica de nuestro módulo podemos
utilizar un pequeño sketch de prueba llamado: I2C Scanner, el cual nos permite identificar la
dirección I2C del dispositivo conectado al Arduino.

Para conectar con el modulo con el Arduino solo utilizamos los pines I2C del Arduino (SDA y
SCL) y alimentación (GND y 5V), los pines I2C varían de acuerdo al modelo de Arduino con el
que trabajemos, en la siguiente tabla podemos ver cuales son los pines I2C para cada modelo
de Arduino.

Las configuraciones para el uso de una pantalla LCD I2C, varían en relación a una LCD normal.
De igual forma las librerías son diferentes. https://github.com/fdebrabander/Arduino-
LiquidCrystal-I2C-library.

Descarga la librería y la instalas en el IDE de arduino. Ahora ve a Ejemplos→Wire→i2c-scanner,


y copia el código mostrado

9
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

Alambra el circuito mostrado

Escribe el código mostrado, compila y guárdalo con el nombre de LCD-I2C

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

//Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas

LiquidCrystal_I2C lcd(0x27,16,2); //

void setup() {

lcd.init(); // Inicializar el LCD

lcd.backlight(); //Encender la luz de fondo.

10
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

void loop() {

// Ubicamos el cursor en la cuarta posición de la primera línea(fila:0)

lcd.setCursor(3, 0);

lcd.print("Hola Mundo"); // Escribimos el Mensaje en el LCD.

Agrega al programa una línea de código para ubicar el mensaje “Uso del LCD I2C” en la
posición inicial de la segunda fila

Captura de pantalla:

Competencia 2. Conocer la generación de caracteres personalizados en la LCD

La pantalla alfanumérica de cristal líquido (LCD) de 16x2, basada en el controlador Hitachi


HD44780, se usa ampliamente en proyectos que involucran la plataforma Arduino, lo que le da
al proyecto una interfaz textual para comunicarse con el usuario. Sin embargo, este tipo de
pantalla tiene la limitación de mostrar solo caracteres alfanuméricos predefinidos que están
almacenados en una tabla en la memoria CGROM del controlador de pantalla. Por lo tanto, no
es posible enviar una imagen directamente a la pantalla, ya que solo es posible enviar
caracteres a la pantalla. Pero hay una memoria RAM llamada CGRAM en el controlador de
pantalla y esta memoria está destinada a recibir hasta ocho caracteres personalizados por el
diseñador.

En la pantalla de 16x2, tenemos dos filas y dieciséis columnas que albergan a los
personajes. Cada carácter se forma en una pequeña matriz de 8x5 píxeles. Aprendamos hoy
cómo manipular estas pequeñas matrices de 8x5 píxeles para construir un logotipo o
diseño. Esta construcción se puede hacer con solo el espacio de un carácter o con un conjunto
de caracteres que componen una imagen más grande. Recuerde que podemos utilizar un
máximo de 8 caracteres personalizados debido a la limitación de memoria CGRAM de la
pantalla.

Para ello utilizaremos el generador de caracteres personalizado LCD, ve a la siguiente


dirección: https://maxpromer.github.io/LCD-Character-Creator/

11
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

Por defecto ya viene configurada una pantalla de color verde, placa arduino, comunicación
paralela, y código binario. En caso utilices una pantalla con interface I2C, seleccionas I2C

Con el mouse da un clic derecho el cuadro que quieres seleccionar, si quieres borrar el cuadro,
nuevamente debes dar un clic derecho. Selecciona la interfase I2C y forma la figura mostrada
en la aplicación

Ahora copia el código generado en el IDE de Arduino y guárdalo con el nombre de fantasma,
compila y súbelo a la placa.

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

// Set the LCD address to 0x27 in PCF8574 by NXP and Set to 0x3F in PCF8574A
by Ti

12
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

LiquidCrystal_I2C lcd(0x3F, 16, 2);

byte customChar[] = {
B00000,
B01110,
B11111,
B10101,
B11111,
B11111,
B11111,
B10101
};

void setup() {
lcd.begin();
lcd.createChar(0, customChar);
lcd.home();
lcd.write(0);
}

void loop() { }

Que observas:

Pega una captura.

Deshabilita la línea de código: lcd.write(0) en el void setup y escribe las líneas de código en el
void loop:

lcd.setCursor(3, 0);
lcd.write(byte(0));

Ahora carga el programa, ¿Qué observas?:

Comprueba la aplicación formando otras figuras que se ocurran, por ejemplo, un pacman, un
corazón, una carita feliz, etc.

Pega las capturas de las figuras:

Ahora vamos a desplegar en el display LCD las figuras realizadas, para ello tomaremos el

13
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

código de fantasma del primer ejemplo y lo pegaremos dos veces y el código del pacman una
vez

byte a[8] = {
B00000,
B01110,
B11111,
B10101,
B11111,
B11111,
B11111,
B10101
};

byte b[8] = {
B00000,
B01110,
B11111,
B10101,
B11111,
B11111,
B11111,
B10101
};
byte c[8] = {
B01110,
B11101,
B11110,
B11100,
B11110,
B11111,
B01110,
B00000
};

En el void setup, crearemos los array copiados

lcd.init();
lcd.backlight();
lcd.clear();
lcd.createChar(0, a);
lcd.createChar(1, b);
lcd.createChar(2, c);

En el void loop, enviamos al LCD las figuras en la columna 0, 1, y 2 de la fila 0

14
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.setCursor(1, 0);
lcd.write(byte(1));
lcd.setCursor(2, 0);
lcd.write(byte(2));

Carga nuevamente el programa a la placa

Qué observas

Pega una imagen

Ahora vamos a darle movimiento a las figuras. Para ello debes agregar las instrucciones para
moverlas a la derecha, incluir al inicio del void loop

for(int a=0;a>10;a++){
lcd.scrollDisplayLeft();
delay(250);
}
for(int a=0;a<10;a++){
lcd.scrollDisplayRight();
delay(250);
}

Carga nuevamente el programa a la placa

Qué observas

Pega una imagen

Finalmente vamos a darle el efecto de comer al pacman. Para ello escribe la línea de código al
final del código que tienes

lcd.print("***************");

Vuelve a cargar el código en la placa y simula

¿Qué observas?

Pega una imagen.

15
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

Competencia 3. Mostrar como enviar mensajes a una LCD a través del puerto serial

Para ello abre el IDE de Arduino y sigue la secuencia mostrada

Carga el programa a la placa

Abre el monitor serial y escribe: Hola Mundo, y envía. Prueba con otras oraciones

¿Qué observas?

Pega una captura.

¿Qué aplicaciones crees que puede tener en la vida real?

16
Universidad Tecnológica de El Salvador Facultad de Informática y Ciencias Aplicadas
Práctica de Laboratorio No 7 Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera

INVESTIGACIÓN.

• Investiga sobre otras aplicaciones para generar el código de una figura

• Investiga sobre cómo generar figuras que abarquen más de un carácter (8 caracteres),
muestra un ejemplo

• Muestra en una LCD I2C, un ejemplo con su código

• Investiga sobre las LCD de más de dos filas

• Investiga sobre las pantallas oled, muestra un ejemplo

• Investiga sobre la Pantalla TFT ILI9341 bus SPI (320 x 240) color

17

También podría gustarte