Logo Studenta

Laboratorio 3-ARQUITECTURA DE COMPUTADORAS-2020-II

¡Este material tiene más páginas!

Vista previa del material en texto

Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
1 
 
 
 
 
 
 
 
 
UNIVERSIDAD 
 
 NACIONAL DE LA 
 
 AMAZONIA PERUANA 
 
 
 
 
FACULTAD DE INGENIERIA 
 
DE SISTEMAS E INFORMATICA 
 
LABORATORIO DE ELECTRONICA DIGITAL 
 
 
GUIA - INFORME Nº 3 
CURSO : ARQUITECTURA DE COMPUTADORAS 
 TEMA : Visualizando Datos con el LCD Paralelo 
 PROFESOR : 
 GRUPO : 
 ALUMNO : 
 CODIGO : 
 
 NOTA: 
 
 FECHA EXPE.: SEMEST. ACADÉ. 2020 - I 
 
 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
2 
 
 
 
3er LABORATORIO 
Tema: Visualizando Datos con el LCD Paralelo 
Objetivo: Hacer que el alumno aprenda a interactuar con una pantalla de cristal líquido (LCD) 
para poder ver la información generada por un Arduino de tal modo podrá mostrar 
texto, caracteres personalizados, datos numéricos y gráficos 
 
Material y Equipo: 
 LCD Paralelo, serie, gráfico y un GLCD 
Diodos LED 
 Resistencias 
 Un Protoboard 
 Cablecitos de Conexión 
 Una Tarjeta Arduino Uno 
 Cable USB 
I. INTRODUCCIÓN 
Desde el momento en que nos despertamos hasta el momento de irnos a la cama, estamos 
continuamente interaccionando con pantallas LCD. Te despiertas por la mañana y, al ver la 
pantalla LCD de tu reloj de alarma, te das cuenta de que vas a llegar tarde a clase y el profesor 
te va a da una regañada, o de repente no te dejara entrar a clase por el retraso. En el descanso 
entre clases, necesitas la pantalla del LCD de tu reproductor MP3 para navegar hasta tu 
canción favorita de Eminem. Un poco más tarde, te llaman por teléfono y le echas un vistazo 
a la pantalla LCD de tu móvil y decides si contestar o no. Y finalmente, después de un día 
horrible, ajustas el despertador mediante la pantalla LCD para que no te vuelvas a retrasar al 
día siguiente y te expulsen definitivamente de la asignatura de electrónica digital. 
La visualización de las pantallas LCD es una de las principales formas en que 
experimentamos con los datos electrónicos. En este laboratorio, vamos a ver los tipos 
comunes de las pantallas LCD que se pueden utilizar con Arduino. Los primeros dos tipos 
de pantallas de LCD son: paralelo y serie. Son normalmente pantallas de caracteres. El 
carácter es idóneo para la visualización de algún tipo de texto e incluso formas pequeñas o 
iconos (generalmente 5 x 7 píxeles). El otro tipo de LCD que vamos a cubrir en este capítulo 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
3 
 
 
es el LCD gráfico que, como habrás adivinado, es ideal para la elaboración de gráficos e 
imágenes. 
Pero antes de empezar a explorar las pantallas de caracteres, vamos a echar un vistazo a los 
tipos de variables de cadena, que son la forma en que tratamos un texto en Arduino. 
Tipo de variable array: Llegó la hora de abordar un nuevo tipo de variable denominada 
array. A diferencia del tipo de variables vistas anteriormente que solo podían almacenar un 
valor único a la vez, los arrays son un caso especial de variables que pueden almacenar un 
conjunto de valores, y modificar solo uno, o algunos, o incluso todos los valores contenidos 
en el mismo en cualquier momento y según nuestra conveniencia. También sería posible 
evitar el uso de arrays y en vez de ello crear «muchas» variables con distintos nombres. Sin 
embargo, esto no resultará cómodo de utilizar. La traducción de array es literalmente 
«colección», ya que se utiliza para «juntar» varios objetos de un mismo tipo. En otras 
materias, como matemáticas, se conoce con el nombre de matriz y generalmente se usan las 
de 2 dimensiones, por su facilidad para representarlas en un plano, ya que tienen ancho y 
alto. Cada elemento de la matriz se identifica por un par de números que indican la fila y la 
columna en que se ubica el elemento. También podríamos tener una matriz de 3 dimensiones 
(cubo). En ese caso cada elemento de la matriz se identificará con 3 valores ordenados (que 
indicarán la posición relativa del elemento dentro de la matriz), por ejemplo, el elemento 
A(l,8,76) habría que encontrarlo dentro de la matriz A, en la fila 1, columna 8, «nivel» o 
«capa» 76. 
Enel caso de Arduino es todavía más simple. Utilizaremos un tipo de matriz de una sola 
dimensión. Por ejemplo, se podría declarar un array de las siguientes formas: 
int minume [6]; 
//se define un array que tendrá 6 elementos de tipo entero (int). 
int minume [ ] = (2, 4, 8, 3, 6); 
// se define el array y se le rellena con valores numéricos 
 char mensaje [6] "hola"; 
// ahora almacena caracteres individuales. 
Los arrays son zero indexed, esto significa que, al referirse a una matriz, el primer elemento 
de la matriz está en el índice 0. Por lo tanto: 
 minume[O] = = 2, minume[l] == 4, y sucesivamente. 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
4 
 
 
Esto también significa que en una matriz con 10 elementos el índice 9 es el último elemento. 
Por lo tanto: 
int myArray[10]={9, 3, 2, 4, 3, 2, 7, 8,9 , ll); 
// myArray[9] 11. 
// myArray[10] es invalido y contiene información aleatoria. 
Tipo de variable string ('s' minúscula): las variables de tipo string se representan con un 
tipo particular de arrays de caracteres (tipo char) que terminan con el carácter NULL. Por 
ejemplo: 
char Strl [15]: 
// Declara un array de caracteres sin inicializarlo. 
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; 
// Declara un array de caracteres (con un carácter extra) y el compilador añadirá el carácter 
NULL requerido. 
char Str3[8] = {'a', 'r', 'd', 'u', 'i', ‘n ‘, 'o', '\0'): 
// Explicita el carácter NULL. 
char Str4[ ] = "Arduino"; 
// Inicializa con un string constante entre comillas dobles; el compilador medirá el tamaño 
del array para ajustar el string constante y carácter NULL para finalizar. 
char Str5[8] = "Arduino"; 
// Inicializa el array con un tamaño explícito y un string constante. 
char Str6[15] = "Arduino"; 
// Inicializar el array, dejando un espacio extra para un string más largo. 
Generalmente, los strings se finalizan con un carácter NULL (código ASCII:0). Esto permite 
a funciones como Serial.print(), establecer dónde está el final del string. De otra forma, 
seguiría leyendo los siguientes bytes de la memoria que no forman parte del string. Los 
strings siempre se definen entre comillas dobles ("Abc") y los caracteres siempre se definen 
dentro de comillas simples ('A'). A menudo es conveniente, al trabajar con grandes 
cantidades de texto, como proyectos con displays o LCD, configurar un array de strings, es 
decir, una matriz de cadenas de textos. 
Tipo de variable String ('S' mayúscula): El tipo String merece toda una explicación ya 
que es un poco más que un tipo de variable. De hecho, es un objeto (en el sentido de la 
programación orientada a objetos). Los objetos cuentan con propiedades y funciones 
especiales. Propiedades y funciones son disponibles de forma nativa en el núcleo de Arduino 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
5 
 
 
y se pueden ver como una entidad preexistente, incluso si nuestro IDE no contiene ninguna 
línea. Una vez más, el núcleo de Arduino se ocupa de las cosas para nosotros y nos 
proporciona funciones de gran alcance ya preparadas para utilizar directamente. 
El tipo de datos String es diferente que el tipo de datos de cadena (nótese la mayúscula S 
para este tipo de datos en comparación con el anterior). Este tipode datos es en realidad una 
construcción a partir del tipo de datos de cadena, pero es tratado como un objeto o instancia 
en lugar de una sencilla matriz de caracteres. Lo que esto significa es que tiene una gran 
cantidad de funcionalidad integrada con el tipo de datos String. Hemos hablado de la 
definición de las variables, pero los objetos tienen un concepto similar llamado 
«construcción». Para objetos String, hablamos de construcción en términos similares a 
declaración de una variable. Declarar un tipo String en el núcleo de Arduino incluye un 
constructor de objeto, que es un concepto de programación orientada a objetos que podemos 
obviar, ya que el núcleo de Arduino lo hace por nosotros de tal manera que es mucho más 
fácil. 
Por ejemplo, supongamos que tenemos una secuencia de caracteres que se leen de un sensor 
en una variable de cadena denominada miDato. Además, supongamos que necesitamos 
convertir todos los caracteres en letras mayúsculas. Con el tipo de datos de cadena string, 
tendríamos que escribir el código para hacer la conversión. 
Si definimos miDato como un objeto String, entonces podríamos escribir la conversión 
simplemente como: 
 miDato = miDato.ToUpperCase ( ); 
¡Y ya está! La razón por la que esto funciona es porque dentro del objeto String existe una 
función (también denominada método) que contiene el código para hacer la conversión por 
nosotros. Solo tenemos que definir la variable como: 
miDato = String (100); 
Así definimos una cadena denominado miDato con espacio suficiente para 99 caracteres. 
Para utilizar una función integrada de este tipo, escribe el nombre de la variable seguida de 
un punto (llamado el operador de punto) seguida por la función que deseas llamar 
Por ejemplo: 
miDato = miDato.ToLowerCase ( ); 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
6 
 
 
Dicha funcionalidad es común con los lenguajes de programación como C++, C # y Java 
(Programación Orientada a Objetos). Aunque Arduino C no es exactamente un lenguaje de 
programación orientada a objetos, contiene algunas de las características. 
Tabla 1.- Algunas de las funciones incorporadas que están disponibles cuando utilizamos 
objetos String. 
Función Descripción 
compareTo(String two) Comprueba si dos cadenas son iguales. 
concat(String two) Combina dos cadenas en una nueva cadena. 
equals(String two) Realiza la comparación entre mayúsculas y minúsculas 
entre dos cadenas. 
replace(String one, String 
two) 
Reemplaza todas las apariciones de un carácter o de una 
subcadena por otra. 
toLowerCase ( ) Devuelve una copia de la cadena original con todos los 
caracteres en minúsculas 
Length ( ) Devuelve la longitud en caracteres de la cadena 
Trim ( ) Devuelve una copia de la cadena original con todos los 
espacios en blanco, antes y después de la cadena, 
eliminados. 
 
En este punto, creo que he desmitificado las diferencias entre el tipo String y la matriz de 
cadenas tipo char que te vas a encontrar cuando se trabaja con Arduino y los LCD. Ahora, 
y sin más preámbulos, le damos dar la bienvenida al HD44780 de Hitachi. 
II.- FUNCIONAMIENTO DEL LCD PARALELO: EL HD44780 HITACHI 
El Hitachi HD44780 es uno d ellos circuitos integrados más comunes del controlador LCD 
diseñados para sistemas y microcontroladores integrados. El chip soporta muchas formas y 
tamaños de las pantallas. En este ejemplo, vamos a utilizar uno para controlar un 16 x 2 LCD 
(2 líneas, 16 caracteres de largo). La omnipresencia del controlador Hitachi HD44780 es una 
gran ventaja para nosotros, porque es un estándar, porque es barato y porque puede ser 
incluso reciclado de viejos dispositivos que tengamos olvidados en el trastero de nuestra 
casa. Algunos de estos LCD pueden ser retroiluminados (diodos leds debajo de la pantalla). 
Esto es ideal para situaciones de poca luz. Los LCD basados en HD44780 de Hitachi vienen 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
7 
 
 
con muchas configuraciones diferentes, pero hay dos formas en las que podemos interactuar 
con la pantalla LCD Hitachi H044780: 4 bits y 8 bits. 
La desventaja principal entre las configuraciones de 4 bits y de 8 bits es el número de pines 
necesarios en el Arduino frente a la velocidad de ejecución. En un LCD paralelo el medio 
más simple de comunicación sería enviar el byte completo (8 bits) de datos de una sola vez 
(en un mensaje 1 byte). Para ello se requieren por lo menos 10 pines del Arduino. Por el 
contrario, el modo de 4 bits requiere solo 6 pines dividiendo el byte en dos nibbles de 4 bits. 
Esto ahorra pines, pero necesita un poco de más tiempo (dos mensajes frente a un solo 
mensaje). El modo de 4 bits sigue siendo una comunicación «paralela» en el sentido de que 
recibimos 4 bits a la vez, pero está dividido en dos mensajes que se envían uno después de 
otro. 
Por suerte para nosotros, trabajar con los LCD basados en el chipset Hitachi H044780 (u 
otros similares) es una gozada (Figura 1 y Figura 2). Como se mencionó anteriormente, una 
de las librerías estándar preinstalada en el IDE de Arduino es la denominada LiquidCrystal(). 
Es compatible con configuraciones tanto de 4 bits y 8 bits, ofreciéndonos muchas funciones 
útiles para controlar nuestro LCD. 
 Tabla 2.- Detalle de las funciones disponibles y más utilizadas de LiquidCrystal (). 
Función Descripción 
begin (int column, int row) Establece las dimensiones del LCD. 
clear () Limpia la pantalla. 
home () Establece el cursor a la parte superior izquierda de la 
pantalla. 
setCursor (int columna, int row) Coloca el Cursor en la posición determinada 
print (data) Imprime el texto que puede ser un tipo: char, byte, int, 
long, o una cadena. 
cursor () Muestra un subrayado en la posición actual 
noCursor () Oculta el carácter del cursor. 
blink () Parpadea el carácter del cursor. 
noBlink () Desactiva el parpadeo del carácter del cursor. 
scrollDisplayLeft () Desplaza en el texto un espacio hacia la izquierda. 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
8 
 
 
scrollDisplayRight () Desplaza en el texto un espacio hacia la derecha. 
autocroll () Desplaza automáticamente el texto. 
noAutoscroll () Desactiva el desplazamiento automático del texto. 
leftToRight () Establece la dirección del texto que se muestra (izq-
dch). 
rightToLeft () Establece la dirección del texto que se muestra (dch-
izq). 
 
 
 
 
 
 
 
 
 
 Figura 1.- a) LCD 16x2 HITACHI HD44780 
 
 
 
 
 
 
 
 
 
 Figura 1.- b) Conexión de un Arduino a un LCD HITACHI HD44780 
 
 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
9 
 
 
En la Figura 2. Se puede observar un tipo de conexión que utiliza un potenciómetro o trimpot 
para ajustar externamente el contraste del LCD. Además, si tiene retroiluminación, como es 
este caso, utilizamos los pines LED+ y LED- para llevarlos a alimentación y masa (A y K) 
a través de una resistencia limitadora de un valor especificado por el fabricante (entre 70 y 
200 Ω). 
 
 
 
 
 
 
 
 
 
 
 
 Figura 2.- Conexión de un potenciómetro al LCD 
EXPERIENCIA 1.1.- EL HD44780 DE HITACHI 
Ahora que tenemos una buena comprensión de cómo se comunica el HD44780 de Hitachi, tanto a 
nivel de hardware como de software, estamos listos para empezar a conectar todo. Y lo vamos a 
realizar con una sencilla práctica que muestre un simple mensaje en el LCD (16x2). En la Figura 
3 observamos las conexiones con Proteus. 
Se ha optado por la comunicación en modo 4 bits para ahorrar pines del Arduino. La asignación 
de estos se muestra a continuación: LCD 1 (0V) a masa (GND) del Arduino. 
 LCD2 (5V) a +5V del Arduino. 
 LCD 3 (V0) a un potenciómetro de 10 kΩ conectado entre +5 V y masa. 
 LCD 4 (RS) al pin 12 del Arduino. 
 LCD 5 (R/W) a masa (GND)del Arduino. 
 LCD 6 (E) al pin 11 del Arduino. 
 LCD 11 (DB4), 12 (DB5), 13 (DB6), 14 (DB7) a los pines 2, 3, 4, 5 del Arduino. 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
10 
 
 
los pines LED+ y LED- se pueden llevar a una resistencia limitadora si el LCD posee estos pines 
para la retroiluminación. En la Figura 3 se observa la práctica simulada con Proteus. 
Para realizar esta práctica necesitamos el siguiente hardware: 
Un Arduino UNO Una pantalla LED basada en HD44780 de Hitachi. 
Un potenciómetro de 10 kΩ Una resistencia adicional. 
La resistencia adicional solo es necesario si El LCD tiene luz de fondo. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 Figura 3.- Diagrama del circuito en Proteus LCD 16x2 
 
 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
11 
 
 
 
Programa: Sensor HD44780 
/* Utilizando por primera vez un LCD (16 x 2) con Arduino. */ 
/* Si no ves nada, mueve el potenciómetro del contraste del lcd*/ 
#include <liquidCrystal .h> 
liquidCrystal lcd (12, 11, 5, 4, 3, 2); 
void setup ( ) 
{ 
 Lcd.begin (16, 2); 
lcd.print ("Arduino"); 
lcd.setCursor (0, 1): 
lcd.print("LCD funciona"); 
 } 
Void loop ( ) 
{ 
} 
En primer lugar, se debe incluir el archivo de cabecera de la librería LiquidCrystal () para decirle 
al Arduino que la utilice. A continuación, se crea una instancia de clase de la librería con los pines 
de nuestro Arduino conectados a la pantalla LED. El número de pines que se le pasa configura 
automáticamente el LED con objeto para funcionar en modo 4 bits o en el modo de 8 bits. Con la 
función lcd. begin(16,2) configuramos el número de filas y columnas de nuestro LED. A 
continuación, imprimimos el texto en la pantalla LCD. Debido a que el texto que se desea imprimir 
es más largo que una fila, imprimimos primero la mitad y luego nos posicionamos en la segunda 
línea con la función lcd.setCursor(0,1) para enviar al LED la segunda mitad del texto. 
La librería LiquidCrystal ( ) que hemos incluido con la línea #include ya viene incluida con el IDE 
de Arduino. Se trata de un tipo de librería estándar 
Además de usar los caracteres estándar, números y símbolos disponibles en el teclado, puedes 
definir tus propios caracteres. Fíjense que en cada LCD, un carácter está compuesto por ocho filas 
de cinco puntos o píxeles cada una. La Figura 5 muestra el detalle en primer plano. Para visualizar 
tus propios caracteres se debe definir cada uno, usando un array. Por ejemplo, para crear una cara 
sonriente, se podría utilizar el array siguiente en que cada número en la matriz se dirige a un píxel 
individual en la pantalla. Un 0 apaga un píxel y un 1 lo activa. Los elementos de la matriz 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
12 
 
 
representan las filas de píxeles en la pantalla. El elemento superior es la fila superior y el siguiente 
elemento es la segunda fila hacia abajo. 
byte a[8] = [B00000, 
B01010, 
B01010, 
B00000, 
B00100, 
B10001, 
B01110, 
B00000]; 
 
 
 
 
 
 
 
 
 Figura 5.- Representación de caracteres en un LCD de 16x2 
EXPERIENCIA N° 1.2.- DISEÑANDO CARACTERES A MEDIDA 
En este ejemplo, ya que el primer elemento es B00000, todos los píxeles en la parte superior de 
la fila se apagan porque solo vemos ceros. En el siguiente elemento, B01010, se encienden con 
un 1 los píxeles que forman la parte superior de los ojos. Cada fila y pixel se siguen rellenando 
para formar la cara sonriente. A continuación, se asigna una matriz con la siguiente función: 
lcd.createChar(0, a); asigna una matriz "a" de 8 elementos. 
Finalmente se escribe el nuevo carácter personalizado utilizando la función: 
Lcd.write (0); 
Universidad Nacional de la Facultad de Ingeniería de 
 Amazonia Peruana Sistemas e Informática 
13 
 
 
El listado completo se muestra a continuación: 
Programa: Mostrando un emoticón en el LCD 
/* Generando caracteres a medida en un LCD */ 
#include <liquidCrystal.h> 
LiquidCrystal lcd(12, ll, 5,4,3, 2); 
byte a[8] = [B00000, 
B01010, 
B01010, 
B00000, 
B00100, 
B10001, 
B01110 
B00000 ]; 
void setup ( ) 
{ 
 lcd.begin (16, 2); 
lcd.createChar (0, a); 
} 
void loop ( ) 
{ 
 Lcd.write (0): 
}

Continuar navegando