Archivo de la etiqueta: LCD

Convertir una pantalla LCD a I2C con el chip PCF8574


En esta entrada os voy a enseñar como poder adaptar vuestras pantallas LCD a una pantalla que se comunique a través del protocolo I2C (empleando sólo dos pines SDA y SCL). En una anterior entrada hemos hablado de un módulo que permite realizar esta operación de manera sencilla y económica, pero y si queremos montarnos nuestro propio módulo, o asignar diferentes direcciones a dispositivos para nuestros proyectos porque hay varios dispositivos con la misma dirección y no podemos trabajar con ambos. Todo esto es muy sencillo gracias al integrado PCF8574, que es un expansor de entradas/salidas compatible con la mayoría de los microcontroladores existentes, que nos permite convertir una comunicación en paralelo con un dispositivo a una comunicación I2C, además de poder indicar la dirección que queremos asignar a este dispositivo I2C.

Aquí podéis ver el pinout del integrado PCF8574N:

Pinout PCF8574

Hay que tener en cuenta que se pueden encontrar dos tipos de integrados PCF8574, uno el PCF8574N y otro el PCF8574A, que se diferencian en el valor de la dirección del dispositivo que podemos asignar, aumentando así las posibilidades a la hora de crear más dispositivos I2C para trabajar con nuestras placas Arduino, os dejo unas imagenes de como poder seleccionar la dirección I2C para el dispositivo en cada uno de los integrados arriba mencionados y una tabla de referencia de direcciones para el PCF8574N según se conecten los pines A0, A1 y A2.

Direcciones diferentes PCF8574

Tabla referencia Direcciones I2C

Ahora vamos a ver como cablear nuestras pantalla LCD al integrado PCF8574 para conseguir una comunicación I2C entre nuestro Arduino y la pantalla LCD:

LCD I2C PCF8574

NOTA: Faltan por conectar las resistencias de pullup de 4.7K en las líneas SDA y SCL que van a nuestro Arduino.

Yo he optado por conectar los pines A0, A1 y A2 del PCF8574 a tierra, para así obtener como dirección del dispositivo I2C (en este caso la pantalla LCD) 0x20 (en valor hexadecimal).

Os pongo también el esquemático en Eagle por si alguien lo entiende mejor que con el Fritzing:

Esquemático eagle PCF8574 LCD

Os pongo el ejemplo que he usado para realizar las pruebas básicas de funcionamiento y con el que no he tenido ningún problema:

#include <Wire.h> 
#include <LCD_I2C.h>

LCD_I2C lcd(0x20,16,2);  //Indicamos la dirección de la pantalla LCD 0x20 y el numero de columnas y filas 16*2

void setup()
{
  lcd.init(); //Inicializamos la pantalla LCD
  lcd.backlight();  //Activamos la iluminación de la pantalla
  //lcd.noBacklight(); //Desactivamos la iluminación de la pantalla
  lcd.setCursor(1,0);
  lcd.print("Visitanos en:");  //Imprimimos un mensaje
  lcd.setCursor(1,1);
  lcd.print("Taller Arduino");
}

void loop()
{
}

Aquí podéis ver el resultado:

IMAG0021

Para conseguir que funcionara todo correctamente he tenido que modificar la librería LyquidCrystal_I2C, así que en este archivo comprimido va una librería con la que funciona perfectamente la pantalla LCD, así como el datasheet del PCF8574 y el archivo Fritzing: https://www.mediafire.com/?3tcm58ig07a2eb5

Espero que os sirva de ayuda la entrada!!

Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.

donativo_paypal

LCD I2C y Arduino


A veces cuando estás montando un proyecto, puede que te quedes corto con los pines de tu tarjeta Arduino y necesites optimizar las conexiones hardware de tu diseño. En esta entrada vamos a ver como poder obtener unos pines más pasando de emplear una lcd conectada en modo paralelo (empleamos 6 pines) a una lcd que emplea el protocolo de comunicación I2C (empleamos 2 pines analógicos en el caso del Uno, pines digitales 2 y 3 para el Leonardo y pines 20 y 21 digitales en el caso del Mega). Yo me he comprado un adaptador bastante económico a través de ebay que va soldado a los pines de nuestra pantalla lcd, aunque también se venden los módulos y pantalla juntos. Os dejo unas fotos para que podáis ver el módulo (hay muchos en el mercado pero que funcionan exactamente igual de bien):

Pantalla y Adaptador

LCD I2C Adaptador

Como podéis ver este módulo trae cuatro pines que a partir de ahora son los que vamos a usar y que son los siguientes: GND, VCC, SDA y SCL. Además trae un potenciometro gracias al cual podremos regular el brillo de la pantalla (para poder ver correctamente los caracteres en ella) y un jumper para activar o desactivar el backlight (luz) de la pantalla (también se puede activar o desactivar por software).

La conexión a nuestras placas es bastante sencilla ya que solo son 4 cables, aunque hay que tener en cuenta la placa Arduino que vayamos a emplear ya que como he dicho antes cambia la disposición de estos pines, por tanto para la tarjeta Arduino Uno emplearemos los pines A4(SDA) y A5(SCL), para la Arduino Leonardo emplearemos los pines SDA y SCL y para la Arduino Mega emplearemos D20(SDA) y D21(SCL). Os dejo unos ejemplos de conexión:

Conexiones Modulo I2C LCD ARDUINO

Os dejo un código de ejemplo:

/* Sketch de ejemplo para testear el módulo adaptador paralelo a I2C de pantalla LCD
 Escrito por YWROBOT, modificado por Regata para www.tallerarduino.wordpress.com*/
 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//Comprobamos la version de nuestro IDE de Arduino y dependiendo de si es una version superior a la 1 ejecutamos distintos comandos
//esto es necesario ya que para versiones anteriores se empleaba el comando print para imprimir caracteres y ahora se emplea el comando write
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

//Creamos diferentes caracteres
uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = {	0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
  
LiquidCrystal_I2C lcd(0x20,20,4);  // definimos la direccion de la pantalla LCD a 0x20 e indicamos el numero de columnas y filas de la pantalla

void setup()
{
  lcd.init();  //Iniciamos la pantalla
  lcd.backlight();  //Activamos el backligt
  //Le decimos a la pantalla que cree los distintos caracteres arriba definidos
  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);
  lcd.home();  //Posicionamos el cursor al inicio
  lcd.print("Visitanos en:"); //Imprimimos el mensaje
  lcd.setCursor(0, 1);  //Nos posicionamos en la primera columna de la fila 2
  lcd.print("www.tallerarduino.");  //Imprimimos el mensaje
  lcd.setCursor(7, 2);  //Nos posicionamos en la quintaa columna de la fila 3
  lcd.print("wordpress.com");  //Imprimimos el mensaje
  lcd.setCursor(4, 3);  //Nos posicionamos en la cuarta columa de la fila 4
  lcd.print("We ");
  lcd.printByte(3);
  lcd.print(" Arduino!");
  delay(10000);
  displayKeyCodes();  //Llamamos a la funcion displayKeyCodes
}

//Muestra todos los caracteres
void displayKeyCodes(void) 
{
  int i = 0;
  while (1) 
  {
    lcd.clear();  //Borramos la pantalla
    lcd.setCursor(0,1);  //Nos posicionamos en la primera columna de la segunda fila
    //Mostramos los distintos caractares
    lcd.print("Codigos: 0x"); 
    lcd.print(i, HEX);
    lcd.print("-0x"); 
    lcd.print(i+16, HEX);
    lcd.setCursor(2, 2);  
    for (int j=0; j<16; j++)
      lcd.printByte(i+j);
    i+=16;
    delay(4000);
  }
}

void loop()
{
}

Aquí podéis ver un video del funcionamiento del programa sobre la pantalla LCD:

Y por último os dejo los archivos, donde viene el skecth, la librería para usar este módulo con vuestra pantalla LCD y el esquema de conexionado en Fritzing: http://www.mediafire.com/?naoloa8um1xfs0m

Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.

donativo_paypal

pinguino pic ejemplo 3. Escribiendo en una LCD


En este tercer ejemplo, vamos a ver como escribir en una LCD con controlador HD44780 mediante Pinguino PIC. La comunicación emplea 4 bits de datos, dichos pines del Pinguino PIC serán el 0,1,2 y 3 pero se pueden elegir modificando estos en el código escrito. Y 2 pines , que serán el 8 y el 9, para enviar comandos al LCD y para el Enable (habilitación del mismo).

Además emplearemos la retroiluminación que traen los LCD de 16 patillas, conectando los pines 15 y 16 del LCD a VCC y GND respectivamente. Una descripción de los pines es la siguiente:

La conexión del LCD gráficamente la podemos ver aqui en el siguiente esquemático:

Una foto del funcionamiento del LCD con el programa cargado en el Pinguino PIC:

Aquí un video del funcionamiento:

Y por último os dejo el código, y como podréis observar es facilisimo empezar a trabajar con un lcd:

/* Programa realizado por Regata para tallerarduino.wordpress.com */
 
// Comenta esta linea si usas un pinguino con PIC18F2550
//#define PIC18F4550

void borrarlinea(uint8_t linea); //Declaracion de la función de borrado de linea

//Función de configuración, donde indicaremos que usamos modo 4 bits
void setup()
{
	//Modo 8 bits
	//lcd(8, 9, 0, 1, 2, 3, 4, 5, 6, 7); // RS, E, D0 ~ D7
	
	//Modo 4 bits, no se emplean los últimos 4 bits
	lcd(8, 9, 0, 1, 2, 3, 0, 0, 0, 0); // RS, E, D4 ~ D8	
	
	//Indicamos el formato del lcd, en este caso 20x4
	lcd.begin(20,4);
}

//Función repetitiva
void loop()
{
	//Posicionamos el cursor del lcd en posición 0,0 del lcd
	lcd.setCursor(0,0);
	lcd.print("Bienvenidos a:");	// Escribimos la cadena que deseamos
	//Posicionamos el cursor del lcd en posición 3,1 del lcd
	lcd.setCursor(3,1);	
	lcd.print("Taller Arduino");  // Escribimos la cadena que deseamos
	//Posicionamos el cursor del lcd en posición 0,2 del lcd
	lcd.setCursor(0,2);
	lcd.print(" tu blog referencia");  // Escribimos la cadena que deseamos
	//Posicionamos el cursor del lcd en posición 1,3 del lcd
	lcd.setCursor(1,3);
	lcd.print("Pinguino y Ardu");  // Escribimos la cadena que deseamos
	//Escribimos a continuación de la última posición escrita
	lcd.print("ino");
	delay(1000);
	//Esta es una función que he hecho para borrar una linea en concreto,
	//donde el numero indicado es el número de linea del lcd
	borrarlinea(0);
	//También podemos usar lcd.clear(); para borrar todo el lcd
	delay(500);
}

//Función creada por mi para cuando necesito borrar una linea entera del lcd
//y no todo el lcd
void borrarlinea(uint8_t linea)
{
   int i;  //Declaramos una variable que usaremos para contar el número de caracteres
   lcd.setCursor(0,linea);  //Posicionamos el cursor para comenzar a borrar en la posicion 0 de la linea que indicamos
   for (i=0;i<20;i++)	//Borramos desde el caracter 0 hasta el 19
      lcd.print(" ");
}

Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.

donativo_paypal