jueves, 17 de diciembre de 2015

Display LCD 16x2 con comunicación I2C

 
Aquí les dejo como simplificar la conexión de un LCD 16x2 (consta de 2 líneas y 16 caracteres por línea), mediante comunicación I2C (SCL y SDA únicamente), puesto que por el método tradicional, necesitaríamos un potenciómetro lineal de 10KΩ además de ocupar un gran número de pines digitales, con lo que el montaje del circuito se complicaría en exceso, aunque no va a ser nuestro caso.
Para realizar las conexiones de nuestro montaje, necesitamos un módulo LCM 1602 I2C V1, que es el encargado de realizar la comunicación I2C entre el Arduino y el LCD 1602. Este módulo consta de un expansor de E/S de 8 bits destinado a la comunicación I2C, el cual le podemos encontrar en las versiones PCF8574 y PCF8574A, un potenciómetro para controlar el contraste del LCD, una serie de resistencias para regular corrientes y un pequeño LED integrado en la placa para saber si el módulo está alimentado correctamente (POWER).
Módulo LCM 1602 I2C V1

Este módulo va soldado directamente sobre los terminales del LCD 1602 que se describen a continuación:
·         VSS: Es el terminal de alimentación negativa, es decir, 0 V (masa o GND).
·         VDD: Es la alimentación positiva de la pantalla y el chip (5 V). Es recomendable ponerle en serie una resistencia para evitar daños (con una de 220 Ω es suficiente.
·         RW: Es el terminal de activación de lectura/escritura. Se suele conectar a masa para que se escriba en todo momento.
·         VO: Es el contraste de la pantalla, debe conectarse con un potenciómetro de unos 10 kΩ.
·         RS: Es el terminal selector de registro, mediante el cual, el microcontrolador le comunica al 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.
·         E: Es el terminal de habilitación de la pantalla, tiene que estar activado para poder recibir información.
·         D0~D7: El LCD tiene un bus de datos de 8 bits. En este Proyecto solamente utilizaremos 4 bits, de D4 a D7, que nos servirán para establecer las líneas de comunicación por donde se transfieren los datos.
·         A y K: Son los terminales del LED que ilumina el fondo de la pantalla (BackLight). A à 5 V y K à GND.
 
Otra cosa muy importante a recordar es que dentro de la programación, exactamente en la línea “LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);”, donde pone 0x27, es justo la dirección que va a tener nuestro LCD 1602. Dicha dirección se  obtiene midiendo el valor de los pines de dirección A0, A1 y A2, que están justo detrás del módulo LCM 1602 I2C V1, con un voltímetro. Si por ejemplo A0 = 0 o nivel BAJO (LOW) significa que ese pin está conectado a GND y de lo contrario si A0 = 1 o nivel ALTO (HIGH) significa que ese pin está conectado a +5V, en la mayoría de los módulos la dirección puede ser modificada simplemente soldando o no los pines de dirección a unos pines adyacentes que van conectados a GND, permitiéndonos conectar varios LCD al mismo tiempo y seleccionarlos según la dirección que tengan. Las posibles direcciones y configuraciones de los pines de dirección A2, A1 y A0 se pueden obtener de la siguiente tabla.
 
Tabla de configuración de los pines A2, A1 y A0 (direcciones I2C)
 
Para encontrar la dirección I2C de los LCD, también tenemos un método alternativo realizado mediante software, es decir, disponemos del programa denominado “Escaner_direcciones_I2C” que nos facilitará enormemente la búsqueda de las direcciones I2C de cualquier dispositivo que conectemos mediante este protocolo a nuestro Arduino.  


Simplemente tendremos descargar el programa desde el link anterior, conectar el dispositivo deseado mediante I2C, cargar el programa en nuestro Arduino y por último abrir el monitor serie del IDE de Arduino para obtener su dirección I2C.
 
Monitor serie del IDE de Arduino

También comentaros que este módulo lo podemos adquirir ya soldado en la parte posterior del LCD 16x2 o por separado, aunque si lo compramos por separado nos hará falta un soldador, estaño y una cierta práctica soldando. Por último no debemos de olvidar ajustar el contraste del LCD 1602 a través del potenciómetro que el módulo LCM 1602 I2C V1 trae incorporado. Ahora ya solo tenemos que conectar los 4 terminales del módulo a sus correspondientes de la placa Arduino (VCC, GND, SDL y SDA), cargar el programa y por último enviar caracteres a través del Monitor serie para que se vayan mostrando en el LCD.

Display 16x2 LCD 1602

Antes de proceder a enviar caracteres, el LED Backlight,  que sirve para iluminar el fondo del LCD , realiza mediante programación una serie de parpadeos, quedándose encendido finalmente. También le enviamos unas pequeñas líneas de texto al LCD para que la ejecución del programa sea mucho más interactiva (consultar comentarios en el código para comprender mejor el funcionamiento completo del programa).
Para ejecutar correctamente este Proyecto necesitamos emplear una parte del software Arduino llamado Serial Monitor. Esta ventana le permite escribir mensajes que se envían a la placa Arduino, así como ver los mensajes que el Arduino nos envía (Herramientas à Monitor serie o también Ctrl+Mayús+M).

 
Lista de Materiales:

 
·         Arduino UNO Rev.3.
 
·         Cable USB tipo A-B.
 
·         Módulo LCM 1602 I2C V1.
 
·         Display 16x2 LCD 1602.
 
·         Protoboard.
 
·         Cables de conexión.
 

Código del programa: 


 
 
Video:
 

23 comentarios:

  1. Buen artículo. Sólo una sugerencia, cuando hablas de obtener la dirección del LCD midiendo los pines de dirección, quizá sería más apropiado usar la palabra "voltímetro" en lugar de "potenciómetro". Saludos.

    ResponderEliminar
  2. Me pudes pasar la libreria I2 C q utlizas gracias :)

    ResponderEliminar
  3. Tengo arduino uno R3, LCD 16X2 I2C con chip PCF8574AT, en mi caso la direccion es 0x3F, y no logro visualizar nada, controlo el backlight, los tiempos, pero no muestra absolutamente nada, ajusto el contraste, he cambiado de librerias, ¿ Tienes alguna sugerencia ?,
    Gracias.

    ResponderEliminar
    Respuestas
    1. Revisa las conexiones y carga mis librerias que estan en uno de los primeros POST del BLOG.

      Eliminar
    2. Hola Mariano, gracias por la respuesta, pero, usando tus librerias, y ejecutando el sketch de este blog, solo pestañea 3 veces, luego queda el backlight encendido, pero no aparece absolutamente nada, ni cuando envio desde el monitor serial.

      Eliminar
    3. El scaner lo detecta perfectamente pero en la direccion 0x3F.

      Eliminar
    4. cambia esta la E por la F

      LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

      Eliminar
    5. cdamer me esta pasando exactamente los mismo puedo controlar la luz de contraste y los tiempos, pero no logro mostrar nada en la pantalla, lograste solucionarlo de alguna forma?

      Eliminar
    6. No lo he podido solucionar y asumi que el lcd esta fallado, porque he probado todo lo posible...

      Eliminar
    7. yo descarto el LCD por que ya utilice 4 diferentes y sigo con el problema , seguire buscando, si encuentro algo lo pondre por aqui xD

      Eliminar
    8. encontré la solución a mi problema, hay que desconectar las entradas b0,b1,b2 y b3 del display.

      Eliminar
    9. tengo el mismo problema. Como desconectar b0,b1, b2 y b3? no te sigo.

      Eliminar
  4. Me marca error dice que los documentos no son encontrados en el directorio.
    Wire.h

    ResponderEliminar
  5. Instala las librerías.
    http://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1

    ResponderEliminar
  6. Hola, me tomè el atrevimiento de cambiar lo siguiente, espero no se moleste:
    lcd.print("Recibiendo>>> ");
    lcd.setCursor(14,0);

    por

    lcd.print("Recibiendo>>> ");
    lcd.setCursor(0,1);

    ya que cuando compilè y grabè el original, los caracteres enviados se posicionaban en el primer renglòn despues de la palabra "recibiendo>>" y sòlo se imprimian dos caracteres (16 - 14 = 2)
    Con la modificaciòn se logra que la palabra recibida se escriba en el segundo renglòn dejando los 16 caracteres libres para ser usados.

    Desde ya muy agradecido por su post ya que me ayudò a entender y a hacer funcionar mi kit lcd i2c arduino
    LU5YLR Satiago desde Neuquèn Argentina

    ResponderEliminar
    Respuestas
    1. Me parece muy bien que realices modificaciones a tu gusto, pero al programa no le hace falta ninguna modificacion para su correcto funcionamiento. Saludos

      Eliminar
  7. ¿Porque puede ser que al compilar me dice que la variable POSITIVE no esta declarada?, Gracias.

    ResponderEliminar
    Respuestas
    1. Tienes que instalar mis librerías...https://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1

      Eliminar
  8. Saludos, Gracias por dedicar tu tiempo a subir contenido.

    Tengo una duda que aun no solvento, ¿se puede variar el contraste y el brillo a través del software? ya lo se hacer con un potenciometro en el pin de led (I2C) y variarlo entre [0-5 Kohm]/ también use el potenciometro a un analogo y una salida pwm al pin led del i2c, sin embargo pestañea por el pwm, por eso me pregunto si hay otra manera de hacerlo a traves de la libreria LiquidCrystal.h, si saben de algo adicional me serviria mucho!

    ResponderEliminar
  9. consulta , me esta pasando que si desconecto el USB de la computadora el LCD de 20X4 deja de mostrar los datos , he visto en otros proyectos , que estando desconectado del puerto serie , muestra los datos igual , eso es posible , alguien sabe que configuración es la correcta para poder mostrar datos sin tener el cable USB Conectado.saludos

    ResponderEliminar
    Respuestas
    1. Pues muy simple, si desconectas el cable USB del Arduino se queda sin alimentación...debes de alimentar el Arduino con una pila de 9V a través del Jack de 3,5" o bien meter 5VDC a través del pin Vín de Arduino uniendo la masa de la fuente a GND de Arduino.

      Eliminar
    2. Si el problema persiste, elimina del código todas las líneas de comunicación serie con el USB, es decir, los "Serial.print" para que el programa no espere la comunicación USB.

      Eliminar
  10. buen dia busco un codigo de mi preferencia me ayudarias porfa y cuento cobrarias https://www.tinkercad.com/things/6nbC4kGEzJv es aumentar 4 pulsadores mas en este codigo con valores 1,2,3,4 y que me lo envies tambien es esquema

    ResponderEliminar