Select Page

Un LCD o liquid crystal display es la forma más moderna, fácil y práctica de mostrar mensajes con Arduino. Gracias a la filosofía Arduino, existen una serie de placas llamadas shields que nos simplifican la vida a la hora del cableado, alimentación y configuración en Arduino y este es el caso del LCD Shield de DFROBOT con chip HD44780U. Si te suena extraño, no te preocupes, en este artículo vamos a analizar y aprender a utilizar un shield que nos provee de un display LCD y cinco teclas de uso múltiple, sumamente útil para nuestros proyectos con Arduino

Es muy común que en nuestros proyectos con Arduino debamos tener alguna comunicación con un usuario humano a través de algún tipo de interfaz para interactuar mostrando y recibiendo información del mismo. Como dispositivo de salida de información podemos usar desde un simple led que nos avisa que se puso en marcha un motor o que se produjo una condición de error, hasta sofisticados displays gráficos que pueden mostrar la evolución de una medición a través de una curva. Lo mismo sucede con los dispositivos de entrada, que permiten recabar información del usuario a través de pulsadores, teclados de distintos tipos o pantallas sensibles al tacto.

LCD Shield Arduino 2
LCD Shield Arduino 3

HD44780U es el chip controlador en el que esta basado el LCD. Algo importante para remarcar, es que los botones no están conectados a pines digitales. En cambio los pines están conectados mediante resistencias en serie a un pin analógico A0. Notar que el shield, no nos da acceso al pin A0 si quisiéramos soldarle pines macho. Realmente no es difícil de hacerlo funcionar, simplemente hay que leer el puerto A0. Ahora bien, qué valores de tensión tiene cada botón? Esto se resuelve de dos formas. La primera y autónoma es simplemente darle tensión al modulo, apretar cada botón y medir la tensión. La segunda y más ingenieril es ir a ver la hoja de datos o pagina del fabricante. Existen dos versiones de este shield, por favor mirar en la placa la versión correcta, solo cambia el array de resistencias.

Especificaciones técnicas

  • Voltaje de Operación: 5V DC
  • LCD Alfanumérico 1602: 2 filas, 16 columnas 
  • 5 Pulsadores (Arriba, Abajo, Der, Izq, Seleccionar)
  • Pulsador de RESET, para reiniciar el programa de Arduino
  • Potenciometro para regular el contraste del lcd
  • Expansión de pines Analógicos y digitales
  • No usar el pin 10 cuando se usa este Shield
  • Dimensiones: 80 x 58 mm

LCD SHIELD PinOut

Este lcd es muy práctico ya que la unica conexion que necesita es la del arduino a la pc, por ser un shield, solo hay que tener cuidado de unir pin a pin el shield al Arduino y listo.

PinFunción
Analog 0Button (select, up, right, down and left)
Digital 4DB4
Digital 5DB5
Digital 6DB6
Digital 7DB7
Digital 8RS (Data or Signal Display Selection)
Digital 9Enable
Digital 10Backlight Control

Existen una excelente pagina shieldlist.org que lista muchos de los shields en el mercado y este no es la excepción. Podes encontrarlo acá.

LCD Shield Arduino 4
pinout usado por el shield
LCD Shield Arduino 5
pinout usado por el shield

Parece complicado pero no lo es.

  • Se utiliza el pin analogico A0 para leer la botonera.
  • Los pines digitales son los mínimos indispensables para utilizar cualquier LCD. En este caso se utilizan del D4 al D8 para el LCD y D9 D10 como pines de control.

Desde arriba podemos ver los pines que el LCD Shield nos deja disponibles, los que él no usa los escupe para arriba, para soldar pines macho o hembra o soldar cables.

  • Sobre el backlight hablaremos más abajo en el post.
  • D0-D3 y D11-D13 son los pines que no usa el lcd y son los que nos deja disponibles para usar en el resto del proyecto.
  • El conector del puerto ICSP, lo tenemos íntegro para conectar lo que sea.
LCD Shield Arduino 6
Pinout visto desde el shield
  • Los botones de la botonera, estan conectados de una manera especial para ahorrarnos pines y lo trataremos mas abajo en el post. Todos estan conectados a la entrada analogica A0 y nos adelanta el rango de tensión que debemos leer para saber qué botón se presionó.
  • El botón de reset está ahí por comodidad, dado que el shield tapa el botón de reset original que contiene la placa Arduino.
  • RST es el pin que nos provee el arduino para resetearlo, que está conectado al botón.
  • 3.3v, es la salida de tensión de 3.3v para alimentar circuitos de esta tensión externos al dúo Arduino-LCD Shield.
  • 5v, es la salida de tensión de 5v para alimentar circuitos de esta tensión externos al dúo Arduino-LCD Shield y además alimenta al propio LCD y su circuitería.
  • GND, es el pin de tierra común.
  • Vin, es el pin de tensión de entrada o salida, según como lo quieras usar conociendo lo dicho en el post del Arduino UNO.
  • FInalmente nos provee delos pines analogicos no usados, A1-A5, dado que A0 está usado para la botonera.

Notar que los pines pwm D10 D9 D6 Y D5 no estarán disponibles como pwm.

LCD Shield con Arduino MEGA

Este shield es compatible con Arduino MEGA por el simple motivo que este último conserva compatibilidad pin a pin con el Arduino UNO. Te va a quedar algo corrido y extraño pero va a funcionar perfectamente, incluso con el mismo código y librería.

LCD Shield Arduino 7
LCD Shield con Arduino MEGA

LCD Backlight

El LCD shield contiene un preset o potenciómetro que regula la intensidad de luz del backlight o de la luz de fondo del LCD propiamente dicho. Es un preset porque se supone que una vez establecida la intensidad lumínica no se toca nunca más. No es compatible con la idea de que vamos a usar el LCD en distintos entornos, tu casa, la facu, de noche, al exterior y debiera ser un pote, pero ocuparia mucho espacio, debemos arreglarnos con lo que tenemos. Por suerte tenemos algo para presetearla.

LCD Shield Arduino 8
Preset del backlight

Esquematico

LCD Shield Arduino 9
click en la imagen para agrandar y descargar

LCD Shield Botonera

La botonera del LCD Shield está pensada y diseñada para no ocupar más pines digitales, que es lo que cualquiera de nosotros hubiéramos hecho. Lleva un poco de tiempo adaptarse, entenderlo y programarlo. Voy a tratar de hacerte esa tarea más fácil.

El shield no solo presenta los clásicos botones Arriba abajo, derecha e izquierda, sino que agrega un botón extra de selección, pensado para programar un menú en lcd.

LCD Shield Arduino 10
Botonera de cerca

Te presento la parte del esquemático de la botonera para entender cómo está lograda. Vemos un arreglo de resistencias de diferente valor y cada botón está unido a cada nodo entre las resistencias.

LCD Shield Arduino 11

Este circuito funciona como una gran divisor resistivo puesto en A0, entre la resistencia R6 de 2K y el resto sumado (por ley de ohm). Al presionar un botón, ponemos a masa uno u otro nodo del array de resistencias por ejemplo:

  • Si presionamos RIGHT: A0 queda cableado a GND midiendo en A0 0V.
  • Si presionamos UP: A0 queda entre puesto entre las resistencias de R6 y R2, creando un divisor resistivo que nos da como resultado 0.71v.
  • Si presionamos DOWN: A0 queda conectado entre las resistencias R6 y R2+R3, creando un divisor resistivo diferente al anterior y nos da como resultado 1.61v.
  • Si presionamos LEFT: A0 queda conectado entre las resistencias R6 y R2+R3+R4 , creando un divisor resistivo diferente al anterior y nos da como resultado 2.47v.
  • Si presionamos SELECT: A0 queda conectado entre las resistencias R6 y R2+R3+R4+R5 , creando un divisor resistivo diferente al anterior y nos da como resultado 3.62v.

Con el Arduino no medimos voltage en las entradas analogicas, no al menos directamente, lo que medimos es su equivalente de 0a 1023 y es por eso que te presentamos la siguiente tabla:

BotonTensionADC 8 bitADC 10 bit
RIGHT0.00v00
UP0.71v36145
DOWN1.61v82329
LEFT2.47v126505
SELECT3.62v185741

Diferenciamos dos tipos de ADC, porque el Arduino, trae un ADC de 10 bit pero podrias estar usando este shield con otro micro que tenga un ADC de solo 8 bit.

Pero esta tabla tiene un problema: Las resistencias contienen un error de fabricación que normalmente es de 5%. Si nosotros programamos un código donde compare de igual a igual con la tensión o el número en la columna ADC es probable que no ande, así que quedan algunas opciones:

  1. Realizar una etapa de calibración en cada LCD Shield que usemos.
  2. Agregar un rango de error del 5% al código.
  3. Como verás también, las tensiones son ascendentes y se puede trabajar con números mayores o menores > o <.

Es por esto que vas a encontrar códigos que o resuelvan esta comparación de la misma manera.

#include &lt;LiquidCrystal.h>    //Funciones del LCD


//Indica a la librería los pines de conexión del shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

//Varables para leer las teclas y el ADC
int lcd_key     = 0;
int adc_key_in  = 0;

//Contantes para identificar las teclas
#define btnDERECHA      0
#define btnARRIBA      1
#define btnABAJO       2
#define btnIZQUIERDA   3
#define btnSELECT      4
#define btnNADA        5

//Función que lee las teclas
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // Leer la entrada analógica

 //Las teclas se conectan a un divisor resistivo que produce distintos valores de tensión según la tecla pulsada
 
 if (adc_key_in > 1000) return btnNADA; //Si no hay ninguna tecla pulsada, sale para demorar menos tiempo

 if (adc_key_in &lt; 50)   return btnDERECHA;  
 if (adc_key_in &lt; 195)  return btnARRIBA; 
 if (adc_key_in &lt; 380)  return btnABAJO; 
 if (adc_key_in &lt; 555)  return btnIZQUIERDA; 
 if (adc_key_in &lt; 790)  return btnSELECT;   

 return btnNADA;  // No debería llegar aquí, pero por las dudas retorna este valor.
}

  
  
void setup() {
  // Inicializaciones

  lcd.begin(16, 2);                 //LCD de 16 columnas y 2 filas
  lcd.clear();                      //Borrar la pantalla
  lcd.setCursor(0, 0);              //Llevar el cursor al inicio
  lcd.print("Prueba de teclas:"); 

}

void loop() {
  // Bucle principal del programa

 lcd.setCursor(0,1);            // Lleva el cursor al inicio de la segunda linea
 lcd_key = read_LCD_buttons();  // Lee las teclas

 switch (lcd_key)               // Imprime un texto según el valor de la tecla detectada
 {
   case btnDERECHA:
     {
     lcd.print("DERECHA  ");
     break;
     }
   case btnIZQUIERDA:
     {
     lcd.print("IZQUIERDA");
     break;
     }
   case btnARRIBA:
     {
     lcd.print("ARRIBA   ");
     break;
     }
   case btnABAJO:
     {
     lcd.print("ABAJO    ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT   ");
     break;
     }
     case btnNADA:
     {
     lcd.print("NINGUNA  ");
     break;
     }
 }

}

DFRobot nos provee una librería llamada DFR_Key que soluciona un poco esto de detectar las tensiones a mano.

/*
DFRobot LCD Shield for Arduino
Key Grab v0.2
Written by Glendon Klassen
gjklassen@gmail.com
http://www.sourceforge.net/users/ecefixer
http://ecefixer.tumblr.com

Displays the currently pressed key on the LCD screen.

Key Codes (in left-to-right order):

None   - 0
Select - 1
Left   - 2
Up     - 3
Down   - 4
Right  - 5

*/

#include &lt;LiquidCrystal.h>
#include &lt;DFR_Key.h>

//Pin assignments for DFRobot LCD Keypad Shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//---------------------------------------------

DFR_Key keypad;

int localKey = 0;
String keyString = "";

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Key Grab v0.2");
  delay(2500);

  /*
  OPTIONAL
  keypad.setRate(x);
  Sets the sample rate at once every x milliseconds.
  Default: 10ms
  */
  keypad.setRate(10);

}

void loop()
{
  /*
  keypad.getKey();
  Grabs the current key.
  Returns a non-zero integer corresponding to the pressed key,
  OR
  Returns 0 for no keys pressed,
  OR
  Returns -1 (sample wait) when no key is available to be sampled.
  */
  localKey = keypad.getKey();

  if (localKey != SAMPLE_WAIT)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Current Key:");
    lcd.setCursor(0, 1);
    lcd.print(localKey);
  }
}

Links de Utilidad

A %d blogueros les gusta esto: