Práctica No 7-CIDI-I
May 12, 2024 | Author: Anonymous | Category: N/A
Short Description
Download Práctica No 7-CIDI-I...
Description
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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 #include // importa librería //configura los pines RS, E, D4, D5, D6, D7 de modulo LCD al Arduino LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); // inicializa la LCD de 16 columnas y 2 líneas } void loop() { lcd.setCursor(3, 0); // ubica cursor en columna 3, línea 0 lcd.print("Hola Mundo"); // escribe el texto en pantalla } Construye el circuito en tirkercad, carga el programa y simula
Describe lo que observas:
7
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera
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 en la posición 4 de la fila cero, que se encienda y apague y se desplace a la izquierda 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
8
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera
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/ArduinoLiquidCrystal-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 Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera
Abre el simulador Tinkercad y alambra el circuito mostrado
Abre la sección de código y paga el programa de i2c scanner, simular ¿Qué observas en el puerto serial? Es importante considerar la dirección en la configuración de una LCD I2C, para que pueda funcionar, de lo contrario no podrás ver nada en la pantalla. Copia el código mostrado y simula //#include #include LiquidCrystal_I2C lcd(0x20,16,2); //Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas void setup() { lcd.init(); // Inicializar el LCD lcd.backlight(); //Encender la luz de fondo } void loop() { lcd.setCursor(3, 0); // Ubicamos el cursor en la cuarta posición(columna:3) de la primera línea(fila: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
10
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera
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: Generador de caracteres personalizado LCD (maxpromer.github.io)
11
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas 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. Forma la figura mostrada en la aplicación
Ahora copia el código generado por la aplicación en el simulador tinkercad. Cambia los campos mostrados por el valor mostrado. Ahora simula
Que observas: Pega una captura. Des habilita la línea de código: lcd.write(8) en el void setup y escribe las líneas de código en el void loop: lcd.setCursor(3, 0); lcd.write(byte(0)); 12
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera
Ahora simula, ¿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 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.createChar(0, a); lcd.createChar(1, b); 13
Universidad Tecnológica de El Salvador Práctica de Laboratorio No 7
Facultad de Informática y Ciencias Aplicadas Asignatura: Sistemas Digitales
Docente: Ing. José Mauricio Rivera
lcd.createChar(2, c);
En el void loop, enviamos al LCD las figuras en la columna 0, 1, y 2 de la fila 0 lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(1, 0); lcd.write(byte(1)); lcd.setCursor(2, 0); lcd.write(byte(2));
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
View more...
Comments