Módulo serie para LCD paralelo

Prologo.

Este documento es como una introducción a los LCD’s en este sitio, voy a intentar detallar en lo posible algunos ejemplos que sirvan de punto de partida y aprendizaje, que no innovador. Como se sabe, se puede encontrar gran variedad de temas en la red que, tratan de los LCD’s.

En el apartado de pantallas de cristal líquido LCD, debemos distinguir dos grandes grupos, por un lado las pantallas alfanuméricas y por otro, las pantallas gráficas. Dejare para otro momentos las gráficas, en este caso vamos a abordar las pantallas LCD alfanuméricas. En este apartado existen las LCD dedicadas (en inglés llamadas ‘custom’) y las que se denominan alfanuméricas, éstos son los más comunes que, se encuentran en los puntos de venta. Su tamaño se mide normalmente por el número de columnas y filas de caracteres en la pantalla. Por ejemplo, los tres tipos de LCD en tamaño de 8 x 2, 16 × 2 o 20 × 4 caracteres.

El lector debe saber que la mayoría de los LCD actuales, llevan el controlador HD44780 de Hitachi. Dicho controlador puede ser configurado para manejar un display de cristal líquido de matriz de puntos la ayuda de un microprocesador de 4 u 8 bits, en este caso me referiré al Arduino. Añadir que, dispone de un generador de caracteres en RAM de 8 fuentes de caracteres (5×8 puntos) y 4 fuentes de caracteres (5×10 puntos).

Para manejar bien el display, en lugar de la librería estándar del SDK de Arduino, utilizaremos la «Nueva librería LiquidCrystal» que, tan amablemente ha actualizado Francisco Malpartida, al que agradecemos el tiempo dedicado. Tenemos que tener en cuenta que el controlador HD44780, nos muestra los caracteres, en una matriz de puntos. Así que, nada impedirá que el usuario, pueda dibujar casi, cualquier cosa sobre ella, aunque no está pensado para eso, ya que no dispone de comandos para manejar pixeles simples, sino, caracteres alfanuméricos.

Displays alfanuméricos.

Son muchas las páginas que circulan por la red que hablan de los LCD y no es ya posible descubrir nada nuevo en este lugar, sin embargo diré que con la bajada de precios de estos dispositivos, tanto el profesional como el aficionado, ahora, pueden utilizar los LCD en sus proyectos y sus aficiones. Se abre un amplio campo de aplicación, que ha puesto en sus manos un artículo que es vistoso, sencillo y a la vez llamativo. Este es mi recién adquirido LCD.

Actualmente, la mayoría de las pantallas LCD tienen algún tipo de luz de fondo, sin embargo, puede encontrarse con algunos modelos, en gran medida, por el bajo precio que, no la tienen. Los colores del carácter, fondo y luz de fondo puede variar.

La interconexión de estas pantallas, con la placa Arduino, resulta muy fácil y hay varias maneras de hacerlo. Este tipo de interfaz puede incluir un paralelo de cuatro u ocho bits, serie, tres hilos, I2C y las interfaces SPI.

La pantalla LCD, se puede controlar con un de bus de datos de 4 u 8 bits (pin D4 – D7) y 3 líneas de estado (RS, E, R/W). Según consta en la hoja de datos del fabricante, el ancho del bus de datos se puede seleccionar durante la inicialización de la pantalla por el microcontrolador. Es posible, para ahorrar unos cuantos pines de E/S, en el control de pantalla con sólo 7 pines E/S. En el modo de 4 bits, cada carácter necesita dos ciclos de reloj, por lo que la pantalla, es un poco más lenta que en el modo de 8 bits. Pero en la mayoría de circunstancias esto, no es relevante.

De modo que, con Arduino y la nueva librería (LiquidCrystal) podremos controlar de forma muy fácil, ese tipo de pantallas. Como siempre, se necesitan al menos 6 pines de Arduino, para controlar una sola pantalla y una vez más, rápidamente nos quedamos sin pines.

Interface I2C para LCD.

En el artículo (Teclado con LCD), ya hice referencia a la opción de utilizar el I2C bus. Este es el momento, de hacer una lectura a la descripción de cómo funciona el I2C Bus. Para aplicar y controlar en una pantalla LCD paralelo, con el bus I2C. Si usted no está familiarizado con el concepto del I2C Bus, le recomiendo la lectura del artículo Introducción al I²C bus.

Para ahorrar pines digitales, la idea es, conectar el mayor número de pines como sea necesario del PCF8574 en un bus I2C y su control, con la señal analógica de los pines 4 y 5 de Arduino, mediante la biblioteca original Wire. Esta librería, le permite comunicarse con dispositivos I2C / TWI. En la mayoría de las placas Arduino, la SDA (línea de datos) está en el pin analógico 4 y la SCL (línea de reloj) está en el pin analógico 5. En Arduino Mega, la SDA esta en el pin digital 20 y la SCL en el 21.

Nota. Para recordar con facilidad, asocie SDA con el 4, es decir SDA = pin4, el otro pin (pin5) se corresponde con SCL.

El chip (PCF8574), como ya se ha dicho, implementa un I2C en modo esclavo y ofrece, ocho entradas/salidas independientes. Por lo tanto, se puede fácilmente utilizar para «agregar» 8 pines digitales a la placa Arduino. Recordar que, el circuito integrado, dispone de 3 pines para elegir su dirección de esclavo. Por lo que, se pueden conectar 8 unidades PCF8574 en el mismo bus, logrando así, obtener 64 pines extra. Y lo que es más, considerando la versión PCF8574A, con exactamente las mismas especificaciones, salvo que las direcciones se generan en un rango diferente. Lo que permite añadir 64 pines digitales más. ¿Se imagina, un Arduino con 128 pines digitales?

El PCF8574A.

Es muy importante obtener cierto conocimiento de cómo se direcciona el llamado expansor de puertos, por lo que, vamos a repasar el contenido de las hojas de datos del PCF8574 en español. En la página 5 dice, «Cada una de las ocho E/S del PCF8574A, pueden ser utilizadas independientemente por separado, como entrada o salida», este es un dato a tener muy en cuenta, ya que esto significa que con él, disponemos de 8 nuevos pines en nuestro Arduino. A continuación, vemos un cuadro resumido, de la funcionalidad de los pines del PCF8574.

En la tabla de abajo, se hace referencia a las direcciones que permiten los pines A0 a A2, para el PCF8574, podemos ver que, al poner los tres pines a BAJO, se direcciona a partir de b0100 0000 (0x20h). Una vez más, hay que tener en cuenta que, para el PCF8574A, esta primera dirección corresponde a partir de b0111 0000 (0x38h).

En resumen, dependiendo de los valores asignados a los tres pines A0, A1 y A2, permite que utilicemos hasta 8 dispositivos PCF8574, para controlar un LCD, un teclado u otro dispositivo con E/S. Con los tres a nivel 0, estaremos dialogando con el primero de los ocho. Ah!, que sólo utilizamos uno, entonces, ese es, con el que nos comunicamos. Aclaradas las dudas?, sigamos con el esquemático.

NOTA: Tener presente que, los fabricantes producen dos variantes de este IC: PCF8574 y PCF8574A. La única diferencia es la dirección de llamada a I2C!. Debido a que dispongo de un PCF8574A (0x38h), a éste es al que me referiré en estas páginas, si no se dice lo contrario.

En la tabla anterior, el 0 (cero) de color rojo, lo pone la propia orden (lectura/escritura), por ese motivo, se dice que, la dirección real es 0x70h en el caso de PCF8574A. Es lógico, al desplazar un puesto a la izquierda un número binario, multiplicas por 2.

Hay gente que, está teniendo conclusiones erróneas en su PCB (de compra), con las hoja de datos PCF8574 y la lista de direcciones. Confieso que, si no estás familiarizado con los hexadecimales, no es nada sencillo entender el modo de direccionamiento de estos dispositivos que tanto nos pueden ayudar.

Voy a tratar de aclarar un poco este punto. Quizás la disposición de las patillas, al  hacer los cálculos, provoque los habituales errores (téngase en cuenta este detalle). Así que, he creado una tabla de valores reales, con los que se puede realizar los direccionamientos adecuados. Para utilizar el PCF8574 en sus dos versiones, en la tabla siguiente:

Espero que el tema del direccionamiento, ahora, está más claro. Sin embargo, en las prácticas que se muestran aquí, como ya se ha dicho, se han utilizado las direcciones correspondientes al PCF8574A.

Módulo para LCD paralelo.

En definitiva, ampliar la capacidad de puertos de Arduino con la ayuda de un circuito integrado PCF8574, puede reducir de 10 a 2 la cantidad de pines necesarios para manejar un dispositivo como el LCD, un teclado u otro dispositivo similar. Existe una versión de pantallas LCD que ya viene con las entradas serie, en ese caso, no hay más que conectarlas y aplicar un código que suele traer como ejemplo en las especificaciones y sin más problemas se pone en servicio.

Si se da el caso que, la pantalla que disponemos es paralelo, qué podemos hacer. Esto, no debe ser un problema para utilizar el bus I2C, claro, nos vemos en la necesidad de trazar un circuito para incorporar este dispositivo en nuestro proyecto. Por lo que, el esquema electrónico que utilizaremos es muy sencillo y se muestra a continuación.

esquema_lcdpcf8574

Se ha dotado de dos diodos, uno es un LED con su resistencia de carga, para que indique cualquier evento que nos interese (lo que demostrará que es totalmente independiente) y el otro diodo un 1N4007, con el cual reduciremos la tensión de alimentación en 7mV, para la iluminación de fondo del LCD, un potenciómetro para el contraste y eso es todo.

Utilidad con el 74CHT174.

Por cierto, si no dispone del PCF8574P/AP, puede utilizar de modo similar, aunque no se trate de un Bus I2C, el circuito de 16 patillas, 74HCT174 CMOS, es un circuito integrado con seis Flip-Flop tipo D, con entradas de reloj (CP) y reset (MR) común, este es su símbolo.

Empleando el esquema que se muestra a continuación. En el esquema, se observa que las patillas Q1-D2, Q2-D3, etc., esto tiene es necesario debido a que una es la salida Q1 (del flip-flop) y la D2 es la entrada del flip-flop siguiente, para una mejor comprensión de los descrito, se recomienda ver las hojas de datos del 74HCT174.
El esquema es muy sencillo y utiliza muy pocos componentes, usted puede utilizar cualquiera de ellos, aunque, se recomienda el uso del circuito especializado PCF8574/A.

El PCB.

Cuando uno se queda sin puertos de E/S, tiene que recurrir a estrategias de «compensación de faltas» y como ya hemos dicho, se hace necesario el uso de circuitos integrados que cumplan con esos requisitos. Hemos visto que el PCF8574, cumple perfectamente, sin embargo, esta circunstancia puede hacerse necesaria en otras ocasiones y estaría bien disponer de un PCB, que de forma unitaria, nos pueda servir en distintos proyectos. Este es el caso del PCB de una sola cara, mostrado a continuación.

Empleando el esquema que se muestra a continuación. En el esquema, se observa que las patillas Q1-D2, Q2-D3, etc., esto tiene es necesario debido a que una es la salida Q1 (del flip-flop) y la D2 es la entrada del flip-flop siguiente, para una mejor comprensión de los descrito, se recomienda ver las hojas de datos del 74HCT174.

El esquema es muy sencillo y utiliza muy pocos componentes, usted puede utilizar cualquiera de ellos, aunque, se recomienda el uso del circuito especializado PCF8574/A.

El PCB.

Cuando uno se queda sin puertos de E/S, tiene que recurrir a estrategias de «compensación de faltas» y como ya hemos dicho, se hace necesario el uso de circuitos integrados que cumplan con esos requisitos. Hemos visto que el PCF8574, cumple perfectamente, sin embargo, esta circunstancia puede hacerse necesaria en otras ocasiones y estaría bien disponer de un PCB, que de forma unitaria, nos pueda servir en distintos proyectos. Este es el caso del PCB de una sola cara, mostrado a continuación.

En esta ocasión, no pasaré a describir lo que hace cada rutina, ya que se supone que estamos en una prueba y usamos un código que ya se ha descrito en muchos sitios.

Después de probado el código, se puede decir que funciona bien el primer ensayo del PCB, en principio, esta era la meta del proyecto, sondear la posibilidad de conseguir de forma sencilla un módulo que, nos permita utilizar una pantalla LCD paralelo, de las más típicas y convertirla a serie, así como un teclado matricial de hasta 4×4 u ocho pulsadores independientes, dotando al módulo de un sistema que nos permitiera manejarlos mediante el bus I2C, reduciendo considerablemente los pines de Arduino a utilizar.

Segunda prueba.

Esta será la segunda prueba y esperemos que la definitiva. Es el momento de presentar el código del programa. Para ello, propongo utilizar un código que ya sabemos que funciona. Se trata del mismo código que ya utilicé en otra práctica, en el mencionado artículo (teclado con LCD). En esta ocasión, he utilizado la comentada librería ‘LiquidCrystal_I2C.h‘ que permite el uso del PCF8574A.

Naturalmente, si el lector lo prefiere, puede realizar dos módulos, uno para el LCD y el otro para el teclado, esto le dejará libre muchos pines del Arduino, ya que tan sólo empleará 2 pines, correspondientes a SDA y SCL. Sin embargo, en caso de decidirse por utilizar dos módulos, tenga en cuanta modificar en uno de ellos al menos la dirección de esclavo, para ello, ponga a positivo con una resistencia de 10k, una de las patillas, A0, A1 o A2. Ponga atención a la tabla de direccionamiento de más arriba.

Hemos logrado hacer un módulo PCB que nos facilita el uso de un expansor de puertos sencillo de usar como es el PCF8574/A. Esto además de una valisa práctica, nos ha proporcionado un PCB al que podemos dar mucha utilidad en nuestros futuros proyectos con microcontrolador, si bien está pensado para el Arduino, aunque, no lo he probado con otros, cabe esperar que funcione, ya que se trata de usar el bus-I2C y esto no es privativo de un micro concreto.

Las librerías utilizadas en este artículo o tutorial, se pueden descargar desde estos enlaces:

 

24 comentarios sobre «Módulo serie para LCD paralelo»

  1. Saludos…

    Una preguntilla, empleando otros i2c i/o expanders como el pca9555 de texas instruments, seria posible hacer un backpack para lcd?? Se da la circunstancia que tengo unas muestras que me mandaron los chicos de texas instruments soic24 y me preguntaba si seria posible hacer la ñapa, rehacer el circuito y conseguir un backpack para las pantallas lcd que tengo. En principio la idea seria hacer un pcb con el footprint del soic24 y el resto de componentes trhought hole… gracias por la respuesta

    1. Saludos Ignacio.
      Basándome en lo que he leído sobre el PCA9555, evidentemente, puedes hacer un escudo (prefiero llamarlo así), para controlar el LCD y al mismo tiempo otro dispositivo como un teclado numérico o diversas sondas, puesto que dispone de dos puertos de 8 bits independientes, lo que lo hace muy interesante.
      Confirma si llegas a realizar el escudo y comenta cómo te va.

      Saludos

  2. Saludos en realidad el 9555 es dos de 8 bits tiene 16 posibles entradas y salidas y el patillaje es similar al que empleas, no se si ando muy desencaminado.

    Iñigo

  3. Gracias por la respuesta…
    De otra parte no entiendo la ñapa que hay que hacer, en el caso del integrado de 8 bits si quisiera tener un segundo elemento, conectado como esclavo, he entendido que bien al A0, A1 o A2 hay que conectar una resistencia y a 5 voltios. Pero eso supondria tener que rehacer el diseño del pcb, que pones en el blog… o me equivoco.
    Un afectuoso saludo.

  4. En primer lugar, te diré que nunca utilicé este dispositivo PCA9555, sin embargo, deduzco lo siguiente, según indica el fabricante.

    A ver, los pines A0, A1 y A2 se conectan a masa o a +5V con una R (10k) según el caso para direccionar hasta 8 PCA9555, tal cual indica el fabricante:
    _ fijo __ programable
    /——-\ /———–\
    0 1 0 0 A2 A1 A0 RW
    \–dir. esclavo—/ (supongo que se verá bien)

    Debes leer desde el apartado 6.2 (Registros) de las hojas de de datos del fabricante y comprenderás cómo direccionar este PCA9555, para entender y aprovechar sus posibilidades.

    En 6.2.1 dice:
    El byte de comando es el primer byte, durante una transmisión de escritura, le sigue el byte de dirección. Se utiliza como un puntero para determinar cuál de los siguientes registros se escriben o leen.

    Fíjate en las figuras 10, 11, …
    Entiendo que, no es sencillo manejar estos dispositivos. Deberás hacer algunas pruebas antes de que puedas dominar su manejo.

    Por supuesto que tendrás que diseñar un nuevo PCB, puesto que existen bastantes diferencias entre los pines del PCF8574 y los del PCA9555.

    Respecto de las dimensiones del PCB, puesto que, tienes un IC y puedes medir las dimensiones del mismo, te resultará sencillo imprimir a la escala necesaria con un par de intentos.

    Espero que tengas algo más claro el tema, ya que las diferencias son muy claras. Te aconsejo que, utilices una tarjeta para pruebas antes de trazar el PCB.

    Espero tus comentarios. Saludos.

  5. Buenas…

    En el esquema que has colgado se ven dos resistencias y un condesador ceramico. No entiendo la funcion de estos porque en principio solamente comentabas que hay que colocar las resistencias de 10 k bien a A0, A1 o A2, para expandir con otros elementos…
    Disculpa porque me estoy liando un poco,…
    Gracias.

    1. Cierto, te estas liando.
      El condensador cerámico, es para desparasitar la tensión de entrada.
      En cuanto a las resistencias de 270Ohm, realmente no son imprescindibles, siempre que ya estén en algún módulo I2C, pues, estas resistencias, sirven para que las líneas SLC y SDA, dispongan de tensión. En todo caso, el PCB está mal, ya que deberían ir conectadas al positivo y no a GND.
      Gracias por el inciso.

  6. Buenas, gracias por la respuesta, entiendo pues que es necesario colocar cada resistencia de 5 v a los tres A0, A1 y A2,(si mi intencion es conectar un keypad p.e.) pero y el puente que hay entre ellos y que va a tierra???, debo eliminarlo?
    Gracias y disculpa por acosarte de este modo, soy autodidacta y hay conceptos que se me escapan.

    1. Hola, Ignacio.
      Los pines A0, A1 y A2 se usan para determinar la dirección del PCA9555 y también los del PCF8574. Como yo describo en el tutorial «PCF8574 Expansor Remoto», con estos pines puedes direccionar 8 dispositivos distintos (0x38 a 0x3F), te recomiendo que lo leas para salir de dudas (espero).

      Saludos.

  7. Hola Vicente,
    veo con alegría que estás usando mi librería. Espero que te haya gustado y que a tus lectores les sea de utilidad.

    Por cierto, hay una versión nueva – 1.2.1, que tiene unos cuantos añadidos muy interesantes, dejando de lado las mejoras en velocidad (ya es 5.5 veces más rápida que la estándar LiquidCrystal de entorno Arduino).

    El blog está muy bien y es muy didáctico.

    1. Gracias por tus palabras amigo Francisco (fm).
      Si, cierto, estoy utilizando con verdaderos buenos resultados tus librerías, pido disculpas por no haberte comentado tal hecho, espero disponer de ocasión para utilizar las nueva versión que me comentas. Doy por supuesto que has añadido nuevas opciones que acaban por subsanar si había alguna falta, y hablando de ‘faltas’, quiero entender que puede manejar un ancho abanico de dispositivos de direccionamiento como los que tratamos en este hilo (PCF8574, PCA9535, PCA9555 y otros) puesto que sería cuestión de indicar el tipo de dispositivo a direccionar o estoy muy desencaminado.
      Repito, gracias por el logro que has tenido con las librerías, yo me he estado informando de los cambios que hacías y además sigo tus comentarios en el foro, como siempre acertados, ¡un maestro!

      Saludos de Vicente.

    1. Hola Iñigo.
      Los condensadores de desacoplo, siempre, deben situarse lo más cerca posible de la alimentación de cada C.I. (dispositivo activo), para obtener el rendimientos esperado.

      Hay un detalle en el esquemático, me refiero a los jumpers jp1, jp2 y jp3. Entiendo que de este modo intentas prevenir cualquier posibilidad de direccionado, piensa que cuando tengas claro dicha dirección, se puede soldar directamente la combinación adecuada y a otra cosa. También, podrías usar un pack de mini-interruptores, para poder elegir la dirección necesaria, lo que te sería más profesional que los referidos jumpers.

      Disculpa esta respuesta, pero en la imagen no consigo ver los bien los indices de las conexiones, debe ser cuestión de mi edad.

      Saludos de Vicente.

  8. Hola Vicente… siguiendo tus consejos he rehecho el esquematico, incluyendo el dip switch de tres pistas con resistencias pull-down y he eliminado el led de funcionamiento, te adjunto el link del pdf para que le des un vistazo y opines… me da que las resistencias no estan bien colocadas,… esto del pull-up pull-down no lo entiendo del todo 😉
    http://free.yudu.com/item/details/506320/Esquematico-Controladora-I2C

    1. Hola Ignacio. He revisado tu esquema y tienes que modificar el posicionamiento de las resistencias y el minidip, es decir, quitas el minidip y pones las R todas a +5V, el otro extremo de cada una a A1, A2 y A3 y de estas a cada switch, los terminales libres de los switch a GND y listo.
      Espero haberme explicado.
      De todas formas como norma yo no conecto directamente a positivo un terminal de un microcontrolador, procuro intercalar una R por poco de 1k.
      Mira este enlace:
      http://www.flickr.com/photos/38349572@N02/7068267197/in/photostream

  9. Buenas Vicente…

    Gracias a tus consejos he incluido la modificación que me has recomendado, ademas he añadido dos resistencias pull-up en SDA y SCL para conectar el primer I2C a Arduino y de este modo, a posteriori conectar otros dispositivos ( en este caso, bastaria con hacer dos puentes eliminando las resistencias), la duda que tengo es que seria necesario integrar en cada placa dos conectores de dos pines para unir en cascada los nuevos dispositivos.
    Te pongo el link del ultimo esquema…
    http://free.yudu.com/item/details/507408/I2c-Backpack-r.1.0
    Gracias, Ignacio

    1. Hola Ignacio.
      He visto el esquema que comentas y me parece bien tu idea.
      Tengo una pregunta después de ver el esquema. Veo una resistencia de 100 Ohms que conectas al punto A del LCD, esto no es correcto, fíjate en mi esquema (más abajo te paso el enlace) y verás que el diodo D2 es el que debes poner en ese punto que tu llamas A, realmente es la alimentación del diodo de iluminación del fondo del LCD y se pone para no aplicar los 5V directos a dicho LED, de esta forma le llegan sobre los 4’30V por la caída de 0’7V de D2.
      En cuanto al diodo LED y la R de 100 Ohms, sirven en este caso como indicador, pero no son imprescindibles.
      Este es el enlace:
      http://www.flickr.com/photos/38349572@N02/6928191504/in/set-72157629152103686

      Saludos.

  10. Hola Vicente… En principio mi intencion es alimentar el lcd de manera externa, empleando una fuente adaptada… la caida de tension con el diodo no es desdeñable si se emplean los 5 v del Arduino.

    Pensando esta tarde, en el trabajo no se si meti la pata con lo de hacer puentes de VDD a SCA y SCL, porque irian directamente a esas patillas los 5 v, cosa que se me antoja como ¡peligrosa! o me equivoco.

    Un saludo, Iñigo

  11. Saludo !!!

    Victor Muchísimas gracias por transmitir todos sus conocimientos.

    Estoy un poco confuso pues la verdad no tengo estudios en electrónica y llevo un año largo metido en el cuento del ARDUINO.

    Mi duda es con respecto al esquemático. ¿ Puedo usar el esquema que utilizo para el 74HCT174 con el integrado PFC8574 ? o es indiferente, ya que veo que el del 74HCT174 tiene mas componentes que de pronto no son necesarios si uso el PFC8574.

    Nuevamente Mil Gracias !!!

    Desde Ibagué – Colombia

Responder a Ignacio Herrero Iriarte Cancelar la respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.