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):
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:
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.