Inicio Artículos Arduino en la práctica – Parte 1: manejo del módulo de visualización

Arduino en la práctica – Parte 1: manejo del módulo de visualización

modulo de pantalla

Funcionamiento básico del módulo de pantalla LCD de Arduino

El dispositivo terminado consta de bloques funcionales que con frecuencia se pueden emplear múltiples veces. Por poner un ejemplo, si estamos edificando un medidor de frecuencia con un microcontrolador – entonces, aparte del bloque amplificador – necesitaremos prácticamente exactamente los mismos componentes que para la construcción de un temporizador. Nos referimos a un microcontrolador con un «ambiente» (resistencias, condensadores, cuarzo y otros), pantalla, botones y conectores. Evidentemente, el contador de frecuencia no precisará un relé para mudar el dispositivo externo y el temporizador del amplificador de entrada de banda ancha, mas el núcleo proseguirá siendo exactamente el mismo. En consecuencia, la clave para el autodesarrollo de aplicaciones es entender los principios de funcionamiento de los bloques funcionales individuales y después conjuntar sus funcionalidades.

Plataformas como Arduino no requieren que el usuario conozca el principio de funcionamiento de los componentes individuales. Sencillamente puede conectar la placa principal al módulo / tapa de expansión y ejecutar una aplicación en funcionamiento. Por otra parte, si no tenemos por lo menos un conocimiento básico sobre los componentes, entonces en el caso de inconvenientes con el funcionamiento de nuestro dispositivo, estamos condenados a deambular en la obscuridad. Mientras, cuando procuramos componentes Arduino, la mayor parte de las veces aguardamos un efecto veloz. Es bastante difícil conciliar semejantes esperanzas con la necesidad de adquirir los conocimientos convenientes, pues es suficiente con ingresar ciertos comandos para poder ver los primeros efectos en la pantalla, mas entender por qué ocurrió esto en ocasiones lleva bastante tiempo.

Teniendo presente las discrepancias descritas previamente, cada uno de ellos de los artículos de esta serie se va a dividir en 2 partes. En el primero, vamos a mostrar de qué manera conseguir el efecto. La segunda parte presentará de qué manera marcha un determinado componente o bien solución.

Comenzaremos con el módulo de pantalla LCD, pues gracias a él se puede ver el efecto del trabajo efectuado más veloz. Ahora, analizaremos otros elementos de la interfaz de usuario y después los sistemas externos seleccionados: sensores y actuadores. Mientras, asimismo nos familiarizaremos con ciertos trucos y métodos de programación. Y todo ello basado en la plataforma Arduino, que es económica, de simple acceso y, además de esto, te dejará usar los conocimientos adquiridos para edificar dispositivos prefabricados o bien sus prototipos.

Módulo de visualización Arduino de carácteres LCD

La interfaz básica entre el microcontrolador y el usuario por norma general consta de una pantalla y un botón o bien botones. Como puede adivinar de manera fácil, el primero se emplea para informar al usuario sobre las actividades del microcontrolador, al paso que los botones, en ocasiones sustituidos por el pulsador, se pueden emplear para ingresar comandos o bien datos. Puedes hallar en oferta muchas pantallas (incluyendo las que tienen un panel táctil), no obstante, las pantallas de caracteres con el supervisor HD44780 se han transformado en un cierto estándar informal.

En el primer ejemplo de programación, usaremos una placa Arduino UNO R3, una placa de pruebas, un módulo LCD de caracteres con dos líneas de dieciseis caracteres cada una y ciertos cables de conexión. Como es lógico, esto es solo una sugerencia: la pantalla se puede conectar de cualquier forma, por poner un ejemplo, soldándola a la PCB. Acá, se empleó el procedimiento que brinda la mayor posibilidad de alterar y mudar el diseño de la conexión.

Si el módulo de visualización tiene pines dorados soldados, sencillamente conéctelo a la placa de contacto. Entonces conectamos la pantalla con la placa Arduino UNO, como se describe en la tabla 1.

Nº contactos de la pantalla Nombre de la señal de visualización Nombre del conector Arduino Nombre de la señal Arduino
1 VSS Power GND
2 VDD Power +5V
3 V0 Power GND
4 RS Analog In A4 (PC4)
5 R/W Power GND
6 E Analog In A5 (PC5)
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4 Analog In A0 (PC0)
12 DB5 Analog In A1 (PC1)
13 DB6 Analog In A2 (PC2)
14 DB7 Analog In A3
15 (opcional) LED+ Power 3.3V
16 (opcional) LED- Power GND

 

Tabla 1. Conexiones de la pantalla de caracteres con la placa Arduino UNO

Recuerde que, por servirnos de un ejemplo, teniendo la tierra GND conectada desde el conector de nutrición a la placa de contactos, puedes hacer conexiones en la placa de contactos y no debemos conectarnos al conector de nutrición cada vez.

El empleo del conector descrito como Power es preciso pues proveerá energía a la pantalla. El conector Analogi In está montado justo al lado, con lo que, por conveniencia, se decidió emplear los pines del microcontrolador libres. No obstante, no permitas que el nombre nos engañe: se requieren salidas digitales para supervisar el módulo de visualización, no las E/S analógicas. El conector tiene por nombre Analog In pues tiene entradas analógicas opcionales, que, no obstante, asimismo se pueden configurar para marchar en otros modos, incluyendo las salidas digitales. Y de esta forma, la entrada analógica A0 es el puerto PC0, A1 – PC1, etcétera (ver: Cables del microcontrolador ATmega328PU).

Entre las muchas posibilidades de controladores de software libres para Arduino, se escogió una biblioteca para supervisar el funcionamiento de la pantalla LiquidCrystal. Tras crear el boceto, lo incluiremos en la primera línea del programa con una directiva #include. Con la pantalla conectada al microcontrolador de la forma descrita previamente, puede empezar a hacer el primer boceto de control del módulo de pantalla LCD.

Conectamos la placa Arduino al puerto USB de nuestra computador. En el menú Arduino, escoja Fichero y después Nuevo (Ctrl+N). Aparecerá una ventana afín a la de la Figura 1. La palabra clave void nos afirma que acá es donde se va a crear una función que no va a devolver ningún valor. La palabra void va seguida del nombre de la función, y la llave de apertura «undefined» de cierre señala su final.

Al crear un nuevo boceto, el ambiente Arduino notifica sobre la necesidad de acotar 2 funciones especiales: una void setup (), que describe la configuración del microcontrolador y que contiene instrucciones efectuadas una vez al principio del programa, y ​​void loop (), que contiene actividades efectuadas en un bucle sin fin.

arduino
Figura 1. Nueva ventana de boceto para Arduino

¿Por qué razón un programa de aplicación debe ejecutarse en un bucle infinito? Las aplicaciones de Windows o bien Linux se ejecutan bajo el control del sistema operativo. Si ejecutamos la aplicación en Windows, una vez finalizado el trabajo, vuelve al sitio donde se llamó y, por consiguiente, con una mayor frecuencia para enseñar el llamado el escritorio, la línea de comandos, etcétera Desde ese instante, el sistema operativo toma el control del procesador. El microcontrolador de la placa Arduino UNO no tiene ningún sistema operativo cargado, con lo que el programador debe cerciorarse de que la aplicación concluya seguramente. Esto se puede hacer apagando el microcontrolador (por servirnos de un ejemplo, poniéndolo en modo de suspensión) o bien ejecutando en bucle la ejecución de instrucciones para eludir la ejecución de instrucciones fuera del rango de memoria requerido. Esto se puede hacer en la función void loop () o bien en algún otro procedimiento, un caso del que se da ahora.

Ya antes de enseñar información en la pantalla, se debe configurar el microcontrolador. En este caso de ejemplo, solo precisa configurar adecuadamente las salidas de control de pantalla.

Al principio de nuestro boceto, incluimos una biblioteca de funciones de visualización:

#include <LiquidCrystal.h>

Entonces, para nuestra conveniencia y legibilidad del programa, utilizando la directiva #define definimos los nombres de los pines – salidas del puerto C del microcontrolador:

//purto PC
#define pc0  A0
#define pc1  A1
#define pc2  A2
#define pc3  A3
#define pc4  A4
#define pc5  A5

Ahora notificamos al microcontrolador a qué pines está conectada la pantalla. Para ello se emplea la función lcd (), en la que la lista de razonamientos señala al procesador dónde va cada señal. Al sustituir los pines, sostenga el orden correcto:LiquidCrystal lcd(RS, Enable, D4, D5, D6, D7). Al crear una lista de razonamientos, usaremos la tabla 1, que contiene una lista de conexiones entre el Arduino y el módulo de pantalla LCD.: LiquidCrystal lcd(pc4, pc5, pc0, pc1, pc2, pc3).

Ahora debe encargarse de la configuración del modo de funcionamiento de los pines; debe configurarlos a fin de que funcionen como salidas digitales. Esta configuración se guarda en la función void setup ():

pinMode(pc0, OUTPUT);
pinMode(pc1, OUTPUT);
pinMode(pc2, OUTPUT);
pinMode(pc3, OUTPUT);
pinMode(pc4, OUTPUT);
pinMode(pc5, OUTPUT);

Entonces efectuamos la inicialización de la pantalla, configurando el número de columnas, filas y en el paso inicial, limpiando la pantalla. Tras la inicialización, la pantalla LCD ha de estar en blanco, mas por seguridad y un principios conveniente del trabajo, merece la pena proseguir esta instrucción más:

lcd.begin(16, 2);
lcd.clear();

Después de todo, un comando es suficiente para mostrar el mensaje:

lcd.print("Hello!");

No ponemos ningún comando en la función loop (). Tras enseñar el mensaje, el programa sencillamente «virará» en un bucle sin fin, desaprovechando tiempo de CPU. De entrada, sería posible en este punto, por servirnos de un ejemplo, ingresar al modo de ahorro de energía, pues el mensaje en la pantalla no cambiaría de todas maneras, mas requeriría más investigación de hardware, lo que no es conveniente en esta etapa.

Todo el programa que muestra el mensaje «¡Hola!» se puede hallar en los materiales complementarios de este texto. Si la descripción precedente y el efecto conseguido son satisfactorios, puede suprimir la lectura del resto del texto. En el siguiente artículo, nos ocuparemos de operaciones un tanto más avanzadas en el contenido mostrado que solo enseñar el mensaje.

Operación del módulo de pantalla LCD

Un análisis más detallado del tema debería iniciar discutiendo la estructura del microcontrolador que está montado en la placa Arduino, mas es un tema muy extenso. Por consiguiente, primero consideraremos de qué forma marcha el módulo LCD.

Se requieren conocimientos básicos de chips de memoria y chips digitales por lo general para entender de qué manera supervisar el módulo LCD. El conocimiento de términos como lógica alta, baja, forma de onda, datos, ocho-bit, byte, bit, flanco descendente y ascendiente es esencial. Esto es preciso pues, desde la perspectiva del manipulador, el módulo de visualización se ve como una suerte de memoria digital con la que el microcontrolador puede comunicarse bidireccionalmente. Mientras, en verdad, el módulo de pantalla LCD tiene su microcontrolador (este es el citado al comienzo HD44780 o bien afín), que no solo recibe los datos a enseñar, sino asimismo ejecuta los comandos relacionados con el funcionamiento del módulo LCD. y es compatible con la pantalla. Debido al hecho de que en el sistema el microcontrolador integrado en el módulo de visualización tiene una función autónoma rigurosamente especializada, semejantes sistemas de manera frecuente se llaman esclavos o bien subordinados. El microcontrolador integrado en la placa Arduino efectúa una función de control superior. En general, estos sistemas se llaman profesor o bien profesor. Nos encontraremos con estos conceptos en muchas ocasiones en las descripciones de múltiples dispositivos conectados al microcontrolador.

Lógicos “0” Y “1”

Volvamos a lo básico durante un momento. En los circuitos CMOS, y la mayor parte de los circuitos integrados modernos se usan en tal tecnología, el «1» lógico es cuando menos el noventa y cinco por ciento del voltaje de suministro y el «0» lógico es un voltaje menor o bien igual a 0.3 V. Si el circuito del procesador tiene una fuente de nutrición incorporada, que acostumbra a ser el caso de procesadores más complejos, el «1» lógico se define con referencia a la fuente de nutrición interna. Asimismo puede ser diferente – si el sistema CMOS tiene entradas compatibles con los niveles TTL, entonces el «1» lógico es un voltaje superior a dos,4 V. Por consiguiente, en el caso de duda, merece la pena preguntar la hoja de datos de un sistema dado. Lo podemos hallar de manera fácil en Internet.

Pendiente Ascendente y Descendente

Un cambio en el nivel lógico provoca un cambio en el voltaje. Este cambio se genera a pasos desmedidos, mas sin embargo, con el tiempo. Cuando el nivel cambia de «0» a «1» es un flanco ascendiente, y cuando cambia de «1» a «0» es un flanco descendente. La duración de la transición se llama tiempo de subida o bien tiempo de bajada, respectivamente. Generalmente, son unos pocos nanosegundos, mas este no necesariamente es el caso.

En un microcontrolador, una sola línea que lleva el nivel «0» o bien «1» se llama bit de datos. ocho de semejantes líneas forman un byte. Un microcontrolador AVR, como el Arduino UNO incorporado, tiene una palabra de datos de ocho \ -bit, con lo que puede procesar palabras de 1-byte, decimal de 0… doscientos cincuenta y cinco. Si el número es mayor que doscientos cincuenta y cinco, es preciso dividirlo en «pedazos», efectuar una operación en ellos y después acoplar el resultado. No obstante, no debemos preocuparnos de ahí que, pues el compilador Arduino lo hace en segundo plano. No obstante, debe tener en consideración que cuantos más bits requiera una determinada variable, más tiempo va a ser procesada por el microcontrolador.

Control del módulo de pantalla LCD

En este caso, el microcontrolador profesor controla el módulo de pantalla LCD con señales de salida. Al mudar sus señales de salida, controla los niveles lógicos en las entradas del módulo de visualización. Merced a esto, puede escoger el instante de guardar los datos y el área de memoria en la que se van a guardar los datos:

El lógico «1» en la entrada RS (Selección de registro) guarda los datos en la memoria de imagen, al paso que el «0» lógico – guarda los datos en el registro de control del módulo de visualización. El microcontrolador profesor debe poder supervisar esta entrada para poder mandar apropiadamente los comandos al supervisor de pantalla (RS=0) y los datos que se van a mostrar (RS=1). Poner en cortocircuito esta entrada a un nivel lógico alto y incesante evitará que el módulo de visualización ejecute los comandos del tipo «borrar pantalla» y no dejará la inicialización adecuada (el registro de control no va a estar libre).
El lógico «1» en la entrada R/W (lectura/escritura) lee los datos y el «0» lógico escribe.

En nuestro ejemplo, forzamos de manera permanente esta entrada del módulo LCD a baja conectándola a tierra. Esto es adecuado asumiendo que solo vamos a escribir datos en la pantalla y no los vamos a leer. Al añadir esta entrada al nivel lógico incesante, perdemos la capacidad de leer la memoria de la pantalla y su registro de control y, por tanto, la señal de «ocupado». La prueba «Ocupado» acelera el trabajo del módulo de visualización y asimismo le deja probar la precisión de la contestación de su supervisor a los datos recibidos, mas asimismo ocupa una línea de puerto auxiliar del microcontrolador profesor y requiere una conexión más y complica la programa de servicio un tanto.

El flanco descendente en la entrada «Y también» (Habilitar) reescribe los niveles lógicos (que constan de palabras de datos de cuatro- o bien ocho-bits) desde las entradas DB0… DB7 a la memoria interna del módulo LCD.

Al supervisar el funcionamiento del módulo de visualización de caracteres LCD, tenemos 2 modos de funcionamiento a nuestra predisposición, en general ocho-bit y cuatro-bit. En el primero, conectar la pantalla requiere por lo menos diez líneas de datos (RS, Y también, D0… D7). Desde la perspectiva del supervisor, este modo es muy eficiente si puede conectar una pantalla al sistema host como memoria en un autobus de datos de ocho bits. El direccionamiento del módulo de visualización establece la entrada de habilitación alta, baja o bien alta (en dependencia de si se trata de un comando o bien de un dato para enseñar) en RS, pone los datos en el autobus y cambia el nivel a Habilitar a bajo. En ciertos sistemas, el supervisor facilita enormemente esto.

En el modo perfecto de cuatro-bit aún utilizamos la palabra de ocho-bit, mas solo las entradas D4… D7 del módulo de visualización están conectadas al sistema host, y las palabras de datos de ocho \ -bit se dividen en 2 porciones de cuatro bits cada uno de ellos. Esto complica el programa de mantenimiento y no deja una simple conexión del módulo de visualización al sistema de supervisión, mas ahorra cuatro líneas GPIO del microcontrolador.

En los manipuladores de módulos LCD simplificados que no usan las líneas R/W a priori, se supone que el módulo de visualización marcha adecuadamente. Se establece un cierto tiempo predeterminado, como la ejecución del comando de ejecución más larga (en general en torno a dos milisegundos), y se supone que tras este tiempo la pantalla ha ejecutado el comando o bien mostrado un carácter y se pueden mandar datos siguientes. En general, el microcontrolador integrado en el módulo de visualización es más rápido: solo la ejecución del comando clear (limpieza de pantalla) tarda hasta dos milisegundos. Por otra parte, si, como en este caso, tenemos dos líneas de ocho caracteres en la pantalla, entonces no importa mucho si mandamos dieciseis bytes en treinta y dos milisegundos o bien cien microsegundos. Ningún usuario va a poder apreciarlo de todas maneras. Esto solo cambia tratándose de pantallas gráficas a las que se transmite una cantidad considerablemente mayor de datos.

Arduino no nos da demasiado margen para maniobrar en el momento de supervisar la pantalla. El microcontrolador ATmega328 integrado en Arduino UNO no tiene líneas de dirección externas, con lo que supervisar la pantalla en modo de ocho-bit con direccionamiento como una memoria externa está fuera de discusión. No obstante, si utilizamos un puerto GPIO, más para supervisar la señal R/W, podemos probar la bandera de ocupado y leer el contenido de los registros y la memoria del módulo LCD.

La función del mismo nombre, o sea, LiquidCrystal (), se emplea para configurar el procedimiento de anexar la pantalla en la biblioteca LiquidCrystal.h. La manera de anexar la pantalla está determinada por la función que llama a la lista de argumentos:

LiquidCrystal(rs, enable, d4, d5, d6, d7) – Interfaz de cuatro bits, sin módulo de visualización, control de entrada R/W y, en consecuencia, sin legibilidad de datos.
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) – Interfaz de cuatro bits, con control de la entrada R/W del módulo LCD y la capacidad de leer datos de la pantalla.
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) – Interfaz de ocho bits, mas no puede leer datos.
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) – Interfaz de ocho bits, datos inteligibles.

El supervisor HD44780 es un sistema universal, amoldado para aceptar pantallas LCD con un número diferente de caracteres (columnas y líneas). Como resultado, tras encender la nutrición, el supervisor «no sabe» qué pantalla está conectada y debe configurarse para su adecuado funcionamiento. En Arduino, la función begin () se emplea para ello, cuyos razonamientos son el número de columnas y el número de filas. Por poner un ejemplo, si tiene una pantalla con dos líneas de dieciseis caracteres, llamaríamos begin (dieciseis, dos).

El programa de ejemplo asimismo utiliza la función clear () para borrar la pantalla. Es buena práctica emplearlo primero, tras iniciar el módulo LCD, pues podemos hallar pantallas que muestren caracteres azarosos tras la inicialización. Asimismo utilizamos la función print (). Sus razonamientos son los datos a enseñar, como un número o bien texto, y – en el caso de números – una base, que para números decimales es «DEC», binario «BIN», hexadecimal «HEX», octal «OCT» . La función print () se hace cargo de transformar números por nosotros, si es preciso mostrarlos en diferentes sistemas numéricos:

print(diez) o bien print(diez, DEC) –> causa la visualización 10,
print(diez, BIN) –> causa la visualización 1010,
print(diez, HEX) –> causa la visualización A,
print(diez, OCT) –> causa la visualización 12.
print(«Hello!») –> causa la visualización del comunicado Hello!

Imprimir pone los caracteres mostrados desde la situación actual del cursor. Generalmente, tras el comando clear (), el cursor se halla en el rincón superior izquierda de la pantalla LCD.La biblioteca de funciones LiquidCrystal.h contiene otras muchas funciones útiles, mas cubriremos de qué forma utilizarlas en el siguiente artículo. En lo que se refiere al principio, hemos aportado gran parte de conocimiento, es hora de reposar un tanto.