lunes, 24 de octubre de 2016

Arduino + LCD Keypad Shield (1)

Mi primer aproximación a un keypad con display LCD.


En ocasiones, cuando estamos desarrollando algún circuito, es necesario un display para ver cómo van las cosas, y en muchas situaciones la consola del entorno Arduino es una opción incomoda o simplemente no está disponible. Demás esta que mencione que en determinados proyectos es necesario informar con mensajes de texto sobre diversas acciones o estados al usuario de nuestro desarrollo. En estos casos disponer de un display local es la mejor solución.

Para estos casos basta conectar un display del tipo que sea al Arduino.  Lo más fácil suele ser un display LCD de 16 caracteres por 2 renglones (16x2) del tipo I2C, para no tener que conectar muchos pines, que suelen tener la mala costumbre de soltarse en el peor momento, lo que suele provocar las típicas "rabietas" por las que a los electrónicos y técnicos en general se nos acusa de mal genio y de hablar solos.

Una posible y práctica solución es un pequeño Shield comercial, cuya finalidad principal es mejorar nuestras relaciones con quienes nos rodean, dado que no necesitan de cables de conexión, sus pines encastran perfectamente con Arduino, permitiendo montar con seguridad y robustez un display con botones, lo que es ideal para muchas pruebas de campo, o como dispositivo final en cualquier proyecto.

El Shield aquí comentado dispone de un LCD de 16x2 más 5 botones, listos para usar en nuestros proyectos, y un botón de reset. Ocupa o consume varios pines del Arduino para la gestión del display, dejando libres los pines digitales del 0 al 7, y las puertas analógicas de A1 a A5, también deja libre el ICSP.

La ventaja del LCD keypad Shield es que se coloca rápidamente en su sitio asegurando una robusta sujeción a prueba de cables bailarines, evitando el uso del protoboard y así garantiza la estabilidad del conjunto.

Vista general del Shield:

Identificación de componentes y pines:

Máscara de componentes:
Diagrama eléctrico:
El LCD se conecta con Arduino de la siguiente forma:

Para no usar 5 pines en el reconocimiento de los 5 botones, éstos están conectados en serie con resistencias a una única entrada analógica, de modo que se reconoce el botón pulsado mediante el valor de tensión leído en A0 (esto tiene el inconveniente de no poder discriminar si se pulsan dos botones al mismo tiempo)

No entraré en los detalles del control de un display LCD, a los fines prácticos de esta entrada no es relevante, pero la librería proporcionada por Arduino que se encarga de gestionar un display LCD es la LiquidCrystal.h (el entorno Arduino dispone de varios ejemplos realmente muy interesantes). 

Las funciones de la librería son las siguientes:
  • begin
  • clear
  • home
  • print
  • setCursor
  • cursor
  • noCursor
  • blink
  • noBlink
  • display
  • noDisplay
  • autoscroll
  • noAutoscroll
  • leftToRight
  • rightToLeft
  • scrollDisplayLeft
  • scrollDisplayRight
  • createChar
  • setRowOffsets
Existen ejemplos de como usar estas funciones en Internet, recomiendo visitar el sitio oficial para profundizar en el uso de cada función: https://www.arduino.cc/en/Tutorial/HelloWorld

He desarrollado una pequeña aplicación usando las funciones más comunes de la librería, basándome en el material disponible en http://www.prometec.net/lcd-keypad-shield/  para experimentar el funcionamiento del Shield.

El código completo es el siguiente:

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Definición del objeto lcd

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

int ValorAnalog = 0;

int Leer_Botones() {          // Función para leer los pulsadores 
  ValorAnalog = analogRead(A0); // Leemos la entrada analógica A0
  
  // Mis botones: 0=Right, 131=Up, 305=Down, 478=Left, 721=Select
  // Y los comparamos con un margen cómodo
    
  if (ValorAnalog > 900)  return btnNONE;  // Ningún botón pulsado 
  if (ValorAnalog < 50)   return btnRIGHT; 
  if (ValorAnalog < 250)  return btnUP;
  if (ValorAnalog < 450)  return btnDOWN;
  if (ValorAnalog < 650)  return btnLEFT;
  if (ValorAnalog < 850)  return btnSELECT; 

  return btnNONE;                         // Por si todo falla
}
  
void setup() {  
  lcd.begin(16, 2);             //Inicializar el LCD
  lcd.print(" E.E.S.T. Nro 6 ");//Imprime un mensaje simple
  lcd.setCursor(0,1);           //Cursor a linea 2, posición 1
  lcd.print("VIEGAS BARROS V.");//Imprime un mensaje simple
  delay(5000);             //Tiempo para que se lea la "propaganda"
  lcd.clear();                  //Limpiamos el display
  lcd.print("  TECLA   VALOR ");//Imprime encabezado
}

void loop() {  
  lcd.setCursor(0,1);             // Cursor a linea 2, posición 1
  switch(Leer_Botones()) {        // Según sea el botón pulsado...
    case btnRIGHT : lcd.print(" DERECHA "); break;
    case btnLEFT  : lcd.print("IZQUIERDA"); break;
    case btnUP    : lcd.print("  ARRIBA "); break;
    case btnDOWN  : lcd.print("  ABAJO  "); break;
    case btnSELECT: lcd.print(" SELECTOR"); break;
    case btnNONE  : lcd.print(" NINGUNA "); break;
  }
    
  //Pequeña rutina para posicionar el valor analógico leído
  lcd.setCursor(10, 1);             // Cursor a linea 2, posición 10
  if (ValorAnalog<10) { lcd.print("   "); lcd.setCursor(13, 1); }
  else
    if (ValorAnalog<100) { lcd.print("  "); lcd.setCursor(12, 1); }
    else
      if(ValorAnalog<1000) { lcd.print(" "); lcd.setCursor(11, 1); }
  
  lcd.print(ValorAnalog);       // Imprime el valor de la entrada A0
}

Este código se basa en la función Int Leer_Botones()que por lo que pude observar se encuentra en la mayoría de los ejemplos de Internet. Su funcionamiento es muy sencillo, solo lee el valor de tensión presente en la entrada analógica A0 del Arduino, para luego -según se encuentre dicha tensión en determinado rango- entregar cómo resultado una constante literal fácilmente reconocible. 

Las tensiones previstas para cada pulsador son: 0, 175, 350, 525, 700 y 1023 para el caso de reposo. 

Pero los valores entregados por cada pulsador pueden diferir debido a las tolerancias de los componentes resistivos usados en el divisor de tensiones, por lo que es recomendable chequearlos.

El programa es sencillo, está bastante documentado y es fácilmente adaptable a cualquier proyecto.

Ventajas del Shield: 
Es muy práctica cuando se quiere experimentar con un prototipo sin enredarse demasiado con cableríos.

Desventajas del Shield:
Para conectar sensores y/o actuadores hay que soldarlos a la placa, o al menos soldar pines -hembras o machos, según criterio del desarrollador- o idear otra forma de conexión segura sobre los pines libres del Arduino.

1 comentario:

  1. Acabo de iniciar un proyecto con este modulo y la información me pareció muy útil y clara, saludos!

    ResponderBorrar