Teclado numérico 3×4 con LCD

Prologo.

En otro artículo ya hice un esbozo superficial sobre las pantallas de cristal líquido LCD, distinguiendo dos grandes grupos, las pantallas alfanuméricas y las pantallas gráficas. Por el momento, nos referiremos las pantallas LCD alfanuméricas, en concreto las de cuatro líneas y 40 columnas. En la actualidad la mayoría de los LCD están controlados con el conocido HD44780 de Hitachi. El cual puede ser configurado para manejar un display de matriz de puntos de cristal líquido bajo el control de un microprocesador de 4 u 8 bits.

En este artículo, pretendo hacer una aplicación que tenga utilidad para quien disponga de un LCD y quiera realizar una aplicación que le sirva de ayuda en su trabajo o para una aplicar en un proyecto. Hay muchas aplicaciones descritas en gran cantidad de artículos y webs de distintos autores y en todas ellas subyace un ‘toque’ personal que hace la diferencia, espero que en este, también encuentren la novedad o el punto que buscaban.

El propósito de este artículo es reunir una serie de unidades sencillas, como base de los ejemplos, con pantalla de cristal líquido LCD, que se encuentran disponibles para trabajar con Arduino. Se describen algunos ejercicios para comprender los principios de uso y sin perder el carácter didáctico de lo descrito.

Display LCD.

El uso de este dispositivo se ha extendido en los últimos años debido a la proliferación de los microcontroladores con sus cada ves mayores prestaciones y los sistemas de desarrollo que los sustentan. Hay esencialmente dos tipos de pantalla para elegir, serie y paralelo, en referencia a cómo se conectan y se comunican con el mismo PC.

En cuanto a los LCD, en el mercado pueden encontrarse distintos modelos que se adaptan a las necesidades de los proyectos que se planteen. Así, podemos encontrar LCD de una línea y 8 a 40 caracteres, 4 líneas por 40 caracteres y tantas líneas y caracteres que se necesiten. Los LCD gráficos están avanzando tanto que sus precios son cada día más asequibles a cualquier necesidad.

La mayoría de los LCD paralelos son muy similares, usan chips de interfaz estándar en la industria (como el HD44780 o HD44100) para la asignación de pines, a menudo son idénticos.

En este artículo, sólo trataré de los LCD de cuatro líneas y 20 caracteres o columnas. Naturalmente por que es el que tengo a mi disposición. Para controlar pantallas Cristal Liquido (LCD) basada en el Hitachi HD44780 (o compatible) se necesita la «Nueva librería LiquidCrystal» que nos proporciona FM, como se le conoce en el foro. Además, también utilizaremos un teclado 3×4 similar al de la imagen de abajo, dos resistencias, dos LED’s, dos pulsadores y algunos hilos de colores para conectar todo.No voy a entrar sobre los pros y los contras de cada uno, ya que este no es el objetivo del presente artículo, sin embargo, lo que voy a decir es que que, fundamentalmente, la decisión se reduce a su costo en comparación con la facilidad de uso, es la cuestión.

Si bien los display’s serie son más fáciles de poner en marcha y tienen un poco mejor ayuda con el software, además de tener algunas características adicionales. Por otro lado, los LCD paralelos, necesita cablearlas usted mismo, pero son mucho más baratos y en su mayor parte se puede mostrar la misma información.

Lo que pretendo realizar es un teclado, con el que introducir una clave de un número de entre 4, 6 o más dígitos y el programa compare los dígitos que se pulsan por el usuario, con la clave guardada y si hay coincidencia que, haga una cosa, en caso de no coincidir que, haga otra cosa. En principio, se ve sencillo.

Para abordar el proyecto, necesitamos unos pocos materiales a parte de la placa Arduino y el LCD, como estos mostrados.

El más importante, el teclado, este tipo de teclados, a pesar de que es de los años 80 (foto de Futurlec), es bastante corriente y fácil de encontrar en el mercado. El resto de componentes, es de uso común. El circuito electrónico que voy a utilizar se muestra en la imagen que sigue.

Mediante la ayuda de un teclado de 12 pulsadores, podemos entrar una serie de dígitos que, formen el código «secreto» para activar un sistema, si existe coincidencia o por el contrario, pondrá en acción otro sistema que indique que, se está forzando el acceso no autorizado a la instalación, por un desconocido.

Para esto, en primer lugar debemos configurar la librería Keypad.zip y declararemos los 7 pines de Arduino que conformaran el teclado, por un lados las 4 líneas (rows) y las 3 columnas (cols) y la conformación que tomarán los contactos, como se puede ver a continuación:

El primer paso es incluir la librería y las constantes que vamos a utilizar:

El paso que sigue es, reservar memoria en bytes, para los valores de los pulsadores y la asignación del pin que se corresponde con los de Arduino. Sin embargo, hay que observar que, vamos a necesitar un número alto de pines en este y los siguientes ejemplos. Por este motivo, la asignación de pines, se hace con vistas a no tener que cambiar con frecuencia dicha disposición. Además, se asignaran otras variables, en función de las necesidades que surjan.

Este es el momento de ‘crear’ el teclado propiamente dicho, es decir, con esta sentencia, el programa generará una matriz que verá como un teclado, al que se remitirá, cuando tenga que representar un dígito. Esto se consigue con la siguiente línea:

Tenemos que guardar una clave, luego, necesitamos hacer una reserva de memoria y además, el código que introduzca el usuario, también requiere un espacio de memoria. Posteriormente, con sólo comparar ambas matrices, obtendremos fácilmente si hay coincidencia entre ambas. Veamos como se hace:

En la asignación de las dos matrices de 6 dígitos, utilizamos la función char para almacenar los bytes de cada matriz. Una, para los dígitos de entrada llamada attempt, se compararán con la otra matriz, contenida en PIN. Sólo, si hay coincidencia, la clave es correcta y actuará la salida correspondiente. Se han dispuesto dos salidas complementarias, las cuales se pueden conectar a los dispositivos adecuados que, deriven la potencia necesaria para sus actuadores.

En el setup, configuramos los distintos pines, según convenga a cada uno, se declara el puerto serie y su velocidad:

Destacar las funciones que afectan al rebote de los pulsadores que, están integrados en la librería keypad representados por keypad.setHoldTime y keypad.setDebounceTime. Aquí. se ha reducido su tiempo de mantenimiento como se puede apreciar en el propio código.

Además, se ha incluido el mensaje que presentará al inicio del programa. En este mensaje, se puede hacer una descripción corta de lo que hay que hacer para entrar el código PIN. Esto se ha hecho con el siguiente código:

En este punto, para una mayor claridad, se deben declarar las rutinas que intervengan en el programa, acuérdese de hacer comentarios, para poder comprender qué hace cada rutina. Así pues, se declara la rutina void correctPIN() que, se ejecutará en el caso de haber coincidencia, es decir:

Y le seguirá la rutina void incorrectPIN() que se ejecutará en el caso contrario. Que hace exactamente lo mismo pero invertidos

Se ha incluido una rutina para activar un sistema (en este caso, visual) para activar un LED en su caso. Con void readKeypad(), se lee cualquier entrada de teclado, o sea, hace un chequeo del teclado, de modo que cuando se presione un pulsador o llave. Esto lo consigue mediante este código, asignando a char key, todo lo que llegue por el teclado con: char key = keypad.getKey(); si no se produce una entrada, permanecerá en espera. Gracias a esta sentencia de if (key != NO_KEY), en la cual permanecerá la ejecución del programa, esperando a que se produzca una entrada. Así que, este es el listado:

Le sigue la función switch (key) que es capaz de detectar la tecla que se ha pulsado. Cuando se produce una entrada del teclado, se guarda en la variable attempt, lo reconoce y evalúa con PIN[] si es exactamente igual, sale de esta subrutina y salta a la subrutina correctPIN() y sigue hasta el final de la misma.

En caso de que la evaluación no sea exacta, salta a la subrutina incorrectPIN(); y cuando termina, vuelve hasta la línea: for (int zz=0; zz<6; zz++) // borrar tentativa, para borrar la tentativa actual.

En último lugar está el lazo o loop() que, en este caso, contiene la llamada a readKeypad(); que ejecutará continuamente.

Veamos un primer ejemplo, este es el código para el programa de reconocimiento de clave:

Número PIN

Este código, es susceptible de ser modificado y mejorado, sin duda. Por ese motivo, vamos a seguir en nuestro empeño en descubrir nuevos modos de lograr ese resultado e incluso mejorarlo. A continuación, veremos otra forma de enfocar el proyecto para lograr el mismo resultado.

Ejemplo PIN con LCD.

Esto esta listo, sin embargo, si le añadimos un LCD, tendremos un proyecto mucho más profesional que, podremos incluir en un proyecto que requiera de un sistema de seguridad que, incluya una clave de 6 o más dígitos. Veamos los pasos a seguir, para comprender cómo lograrlo.

EL CIRCUITO.

En primer lugar, presento el esquema electrónico es muy sencillo, a pesar de los cables que necesita utilizar para el conexionado de los distintos componentes. Se adjunta el archivo Fritzing, aunque lleva pequeñas modificaciones (el teclado y el PCF8574 son de mi creación).

Como previsiblemente se van a necesitar muchos puertos del Arduino, he pensado en aplicar un expansor de puertos, para actualizar y refrescar conocimientos, se puede leer el expansor de puerto. Aquí, lo utilizamos para interconectar el teclado, porque necesita 7 entradas/salidas, de igual modo, se podría haber utilizado para el LCD. En este ejemplo, se ha dotado de un display LCD de 20×4 como se aprecia en el circuito anterior.

El código.

El siguiente es el código del segundo ejemplo, en este listado, he introducido unos cambios que permitirán una mayor flexibilidad, en el especto de margen de clave a utilizar, gracias a usar la librería Password que, nos facilita esta labor a la hora de crear y comparar una matriz de n dígitos.

La idea es la misma descrita en el ejemplo anterior. La inclusión de un LCD, para su control, hace necesario el uso de la librería LiquidCrystal, por supuesto, también hace falta usar las librerías incluidas en el ejemplo anterior que, no es necesario repetir.

Un punto a resaltar es que debido a que necesitamos más puertos del Arduino, en este caso, vamos a utilizar las entradas analógicas como entradas digitales, esto es posible si los declaramos con el numeral que le corresponde, es decir, en Arduino, los pines digitales normalmente, van del pin0 al pin13. Según el playground de Arduino:

Aquí, usaremos los siguientes, del pinA0 por pin14 a pinA3 por pin17, procurando no utilizar los pines analógicos pinA4 y pinA5, por si se emplean en algún momento como E/S I2C.

En la subrutina: «void keypadEvent(KeypadEvent eKey)» se hace atiende al teclado y compara con la clave guardada. La subrutina: «void guessPassword()» es la que, mediante la ayuda de un transistor universal NPN, permite activar o desactivar un relé con el que, podemos manejar la potencia necesaria para abrir o cerrar el sistema de acceso, si es el caso.

Número PIN largo.

A estas subrutinas, se les ha incluido unos mensajes que, están acordes en cada caso, para hacer comprender al usuario, la situación que impera en cada momento. De modo que al iniciar el proceso, rige un mensaje que invita a introducir un número PIN y la forma de hacer su entrada mediante la pulsación de la tecla «*» (asterisco), como confirmación del PIN introducido.

Mediante la librería Pasword, se evalúa el PIN introducido y se produce un destello de un LED por un corto período de tiempo 1/2 segundo cuando hay coincidencia con la clave correcta. En ese momento, el mensaje que muestra la pantalla LCD, cambia a un nuevo mensaje que, le indica al usuario que ha obtenido el acceso y termina el proceso.

Un tiempo después (este intervalo de tiempo se puede ajustar a su gusto, antes de compilar), se vuelve a inicia todo el proceso, a la espera de un nuevo intento por un nuevo usuario.

Este ejemplo es un proyecto «completo», ya que como elementos externos, sólo necesita de dos resistencias de 10k, dos transistores universales NPN y dos diodos 1N4007 y dos relés de 12V con doble contacto o similar, para poder activar cargas de mayor consumo. Para terminar el presente tutorial, se muestra un archivo AVI que ilustra el proyecto.

Por supuesto que pude utilizar un dispositivo expansor de puertos como el conocido PCF8574. No lo he incluido en este diseño, por que los pines del Arduino Diecimila, están «clavados», es decir, el proyecto no necesita más de los que ya tiene. Sin embargo se muestra una distribución del mismo proyecto utilizando el PCF8574, por si alguien lo quisiera incluir.

En este diseño, para mayor claridad, no se han incluido los relés y los componentes asociados para su control.

Nota.- En estos ejemplos, se utilizado un LCD de 20×4, sin duda que el usuario, puede adaptar otro tipo de LCD, modificando los pines que se dedican al control de cada tipo de LCD.

Las librerías utilizadas en este artículo o tutorial se pueden descargar desde estos enlaces:

15 comentarios sobre «Teclado numérico 3×4 con LCD»

  1. Hola, Henry.

    Te recomiendo que revises el artículo:
    http://www.hispavila.com/3ds/atmega/keypad.html

    Fíjate en la imagen 2 y 3, en estas imágenes aunque pertenecen a un hipotético teclado de 3×2 pulsadores, puedes ver su composición, de esta figura puedes deducir porque le llamamos 3 x 2 (3 columnas x 2 filas) y, al mismo tiempo, puedes intuir cómo implementar el teclado que tu necesitas de 4×3.

    Si tuvieras alguna pregunta al respecto, no dudes en indicarlo.

    Saludos.

  2. Hola Daniel. Ante todo darte las gracias por tus palabras.
    Respecto del código que me pides, te digo que, está disponible en el propio texto.
    Al leer tu consulta, pensé que habría algún problema de visualización y entré en esta página, para comprobar que no hubiera tal problema. Y, después de comprobado te aseguro que no veo ningún problema de visualización del código, concretamente el referido a «Número Pin largo», también es cierto que utilizo explorador de Internet, FireFox.
    Verás una barra que dice: «Ver código PHP», si pulsas en ese punto, se abrirá una ventana en la que aparece el código completo.

    Si tuvieras algún problema no dudes en indicarlo.
    Gracias.

  3. Hola Daniel, siento haber dilatado la respuesta a tu atenta consulta.
    Respecto al esquema que me pides, en principio no tenía pensado su inclusión, sin embargo, visto que puede ser un punto a echar en falta, he realizado una entrada con el correspondiente esquema y estará disponible en el propio tutorial.

    Gracias por todos.

  4. Hola, gracias por aportar tu conocimiento para los que apenas empezamos con arduino.
    Mi pregunta es, quiero enviar datos a traves de ETHERNET con un Shield de Arduino pero al querer acoplarlo quita espacios de salidas y entradas, entonces abria una forma de poner mandar datos a otro receptor?, con el XBEE tal vez?

    1. Hola Victor, gracias por tus palabras.

      Respecto de tu consulta, no he tenido la oportunidad de utilizar técnicas de envío de datos por el medio ETHERNET y no puedo darte consejo al respecto. Sin embargo, por lo que me indicas, cuando hablas que te quita espacio de E/S, pienso que dependiendo de la frecuencia, tal vez (no digo que se pueda), y considerando que Philips los usaba para transmitir datos, entre distancias cortas, si tuvieras un PCF8574, pruebalo, por lo menos te puede proporcionar hasta 8 puertos de E/S, nuevos y desde ese punto intenta meter el ETHERNET.

      No puedo darte ideas que no he probado ni experimentado, lo siento.

      Un saludo.

  5. Hola muy interesante eltutorialme llamo jonathan y acabo de aterrizar en el mundo arduino no tengo apenas conocimientos pero intento leer y aprender. Quizas sea por mi parte una tonteriadecir lo que te pregunto quisiera yacer un juego con 6 cables donde cada cable tenga una respuesta distinta pero quisieraq cada vez q seinicie el juego la accion de cada cable cambie aleatoriamente podrias indicarme como hacer o donde buscar esa manera de hacerlo aleatorio?
    Mil gracias de ante mano

Responder a Victor Cancelar la respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.