25 de mayo de 2014

Arduino: LCD

En los proyectos de Arduino, es muy habitual querer mostrar algún dato. Podemos usar el apagado y encendido de una LED para indicar cuándo detectamos un objeto próximo a nuestro sensor infrarrojo; varias LED para mostrar números en binario...

Si disponemos de una pantalla LCD, es mucho más vistoso y cómodo visualizar los datos a través de ella.

Veamos primero una imagen de lo que pretendemos:


Lo primero que haremos será preparar las conexiones. He aquí un esquema realizado con Fritzing de cómo debemos conectarlo todo:


A continuación podemos ver el listado de pines:

PIN
Nombre
Descripción
1
VSS
GND
2
VDD
+5V
3
V0
Contrast Adjustment
4
RS
H/L Register Select signal
5
RW
H/L Read Write signal
6
E
H/L Enable signal
7
D0
H/L Databus line
8
D1
H/L Databus line
9
D2
H/L Databus line
10
D3
H/L Databus line
11
D4
H/L Databus line
12
D5
H/L Databus line
13
D6
H/L Databus line
14
D7
H/L Databus line
15
A
LED Power supply (Anode)
16
K
LED Power supply (GND)

En nuestro esquema no los usamos todos. Los pines quedarían así:
  • VSS: conectado a masa (GND de la Arduino).
  • VDD: directamente a +5V de la Arduino.
  • V0: aquí controlamos el contraste de los caracteres. Iría de los 5V hacia el pin 3 pasando a través de una resistencia que es la que establece el contraste. Si lo ponemos mal, puede ser que solamente veamos cuadrados grandes en lugar de las letras o directamente que no se vea nada. En mi caso, he utilizado 2 resistencias de 1kΩ y una de 330Ω. Si tenéis algún problema con esto, lo ideal es utilizar un potenciómetro e ir variando la resistencia hasta tener el contraste adecuado. Una vez lo consigamos, podemos medir con ayuda de un voltímetro la resistencia que hemos utilizado (ojo, si medimos una resistencia y hay tensión en el circuito podemos dañar el voltímetro).
  • RS: conectado al pin 12 de la Arduino.
  • RW: conectado a masa (GND de la Arduino).
  • E: conectado al pin 11 de la Arduino.
  • D4: conectado al pin 5 de la Arduino.
  • D5: conectado al pin 4 de la Arduino.
  • D6: conectado al pin 3 de la Arduino.
  • D7: conectado al pin 2 de la Arduino.
  • A: esta es la alimentación de la LCD. Yo le he colocado una resistencia de 330Ω entre los 5V y este pin para no tener el brillo al máximo. Al igual que en el V0, siempre podéis utilizar un potenciómetro para regular el brillo.
  • K: conectado a masa (GND de la Arduino).
Una vez conectados todos los cables, pasamos a cargar el programa en nuestra Arduino:

/*******************
 * Probando la LCD *
 *******************/

#include <LiquidCrystal.h> // para controlar la LCD

// Inicializamos la librería con los pines que hemos conectado:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Crea un objeto LiquidCrystal y asigna los pines

void setup() {
  lcd.begin(16, 2); // Configuramos el display con 16 columnas y 2 filas
}

void loop() {
  muestraTexto();
  mueveTextoDerecha(5);
  mueveTextoIzquierda(5);
}

/*** Esta función muestra el texto "Cozorello Tecnolóxico" en dos filas ***/
void muestraTexto() {  
  lcd.clear(); // borra la pantalla
  lcd.setCursor(1, 0); // Se sitúa el cursor en el caracter 1, fila 0 (la primera)
  lcd.print("Cozorello"); // Muestra un texto
  lcd.setCursor(0, 1); // Se sitúa el cursor en el caracter 0, fila 1 (la segunda)
  lcd.print("Tecnol"); // como la o de tecnolóxico lleva tilde, creo un nuevo caracter:
  
  oConTilde(6,1); // muestro la ó
  
  lcd.setCursor(7,1); // coloco el cursor a continuación de "Tecnoló"
  lcd.print("xico"); // termino la frase
}


/*** Esta función crea un caracter "ó" y lo muestra en la posición indicada ***/
void oConTilde(int x, int y) {
  byte letraO[8] = { // crea un array de tipo byte
    B00010,
    B00100,
    B01110,
    B10001,
    B10001,
    B10001,
    B01110,
    B00000
  };
  
  lcd.createChar(1, letraO); // caracter personalizado 2, pueden crearse 8 como mucho
  lcd.setCursor(x,y); // coloco el cursor en las coordenadas especificadas
  lcd.write(1); // muestro el caracter creado
}

/*** Esta función desplaza el texto x veces a la derecha ***/
void mueveTextoDerecha(int x) {
  if(x > 0) { // por si nos hemos equivocado...
    for(int i = 0; i < x; i++) {
      lcd.scrollDisplayRight(); // desplazamos una vez toda la pantalla a la derecha
      delay(400); // pausa de 400ms
    }
  }
}

/*** Esta función desplaza el texto x veces a la izquierda ***/
void mueveTextoIzquierda(int x) {
  if(x > 0) { // por si nos hemos equivocado...
    for(int i = 0; i < x; i++) {
      lcd.scrollDisplayLeft(); // desplazamos una vez toda la pantalla a la izquierda
      delay(400); // pausa de 400ms
    }
  }
}

En el código podemos ver cómo mostrar texto según las distintas filas de la LCD y la posición del caracter especificado, cómo desplazar a izquierda o derecha toda la pantalla e incluso cómo crear un caracter personalizado.

En el caso del caracter personalizado, he colocado los distintos bytes en distintas líneas para que podamos adivinar el dibujo. Cada caracter tiene 5 casillas de ancho por 8 de alto. El 1 lo utilizamos para iluminar la celda correspondiente y el 0 para dejarla apagada. La "ó" nos ha quedado de la siguiente forma:


Una vez cargado el código en nuestra Arduino, podremos ver al fin nuestra LCD funcionando: