He estado mejorando la shield del teclado para el Arduino, añadiendo un condensador de 100nF para mejorar las lecturas del pin de salida que va conectado al pin A0. Os pongo unas imagenes realizadas con el Eagle3D y un ejemplo de código para que veais como funciona, además os subo el esquemático, la pcb y el fotolito.
Esquemático de la Teclado Shield v1.1:

La imagen 3D realizada con Eagle3D:

Un ejemplo para utilizar el teclado con la placa Arduino:
/*Programa realizado para tallerarduino.wordpress.com por Javier Couto Rego (Regata) para
apertura de puerta mediante password de 4 digitos*/
/*
El circuito:
* LCD RS pin a pin digital 12
* LCD Enable pin a pin digital 11
* LCD D4 pin a pin digital 5
* LCD D5 pin a pin digital 4
* LCD D6 pin a pin digital 3
* LCD D7 pin a pin digital 2
* LCD R/W pin a masa
* Potenciometro de 10K:
* patilla a +5V y la otra a masa
* Patilla central al pin LCD VO (pin 3 del LCD)
*/
//
#include <LiquidCrystal.h>
// Indicamos los pines a los que tenemos conectado el lcd
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Indicamos los pines donde tenemos conectados los actuadores
int buzzer = 6; //En el pin 6 tenemos un buzzer
int puerta = 1; //En el pin 1 conectamos la salida para un relé
int errores=0; //Variables para comprobar si hay errores
int error=0;
int i;
//Arrays donde guardamos el pass y un pass por si bloqueamos el
//circuito por pasarnos de intentos
int pass[4] = {1,2,3,4};
int desbloqueo[4] = {4,3,2,1};
int password[4];
//Variable donde guardaremos el valor que nos devuelva la función de lectura de tecla
int tecla=0;
void setup() {
// Indicamos numero de columnas y filas del LCD e iniciamos
lcd.begin(20, 4);
lcd.setCursor(0,0);
//Mostramos en pantalla el mensaje Password:
lcd.print("Password:");
//Indicamos como salidas el relé y el buzzer (pines 1 y 6)
pinMode(1,OUTPUT);
pinMode(6,OUTPUT);
}
void loop()
{
//Comprobamos si se han producir 3 intentos errores de introduccion de pass
if (errores<3)
{
//Posicionamos el cursor en el LCD
lcd.setCursor(8,1);
for(i=0;i<4;i++) //Pass para cuatro caracteres
{
tecla=teclado(); //asiganmos a tecla el valor que nos devuelve la función teclado()
if (tecla>=0 && tecla<=9) //Comprobamos que el valor de las teclas esten comprendidas entre 1 y 9
//para evitar introducir letras
{
password[i] = tecla; //En la posición correspondiente del array guardamos el valor introducido
lcd.print("*"); //En pantalla mostramos un * para evitar que vean el código
delay(20); //retardo de 20mseg
}
else //Si introducimos un valor que no este entre 1 y 9 restamos 1 a i, esto es para volver a
//introducir el caracter en esa posicion otra vez
{
i=i-1;
}
}
//En este bucle comprobamos que la contraseña que hemos introducido coincida con la que teniamos configurada
for(i=0;i<4;i++)
{
if (pass[i]!=password[i]) //Se comprueba caracter a caracter y si no coinciden
{
i = 4; //Asignamos a i 4 para salir del bucle for
error = 1; //Indicamos que hay error
errores = errores + 1; //Sumamos 1 intento a errores
}
}
if (error==0) //Si no hubiera error
{
//Mostrariamos en pantalla Pantalla Password: Done
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password:");
lcd.setCursor(8,1);
lcd.print("Done");
//Activamos las salidas de buzzer y rele durante 500 mseg
digitalWrite(buzzer,HIGH);
digitalWrite(puerta,HIGH);
delay(500);
//Desactivamos las salidas de buzzer y rele
digitalWrite(buzzer,LOW);
digitalWrite(puerta,LOW);
//Limpiamos el LCD y mostramos Password:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password:");
lcd.setCursor(8,1);
}
else //Si hay error
{
//Mostramos ERROR en pantalla durante 50 mseg
lcd.setCursor(8,1);
lcd.print("ERROR");
delay(50);
//Borramos pantalla y mostramos Password:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password:");
lcd.setCursor(8,1);
}
}
//Si se producen 3 intentos erroneos de introducir clave
else
{
//Mostramos en pantalla BLOQUEADO
lcd.setCursor(6,1);
lcd.print("BLOQUEADO");
lcd.setCursor(8,2);
//Bucle donde introducimos el pass para DESBLOQUEAR el sistema
for(i=0;i<4;i++)
{
tecla=teclado(); //asiganmos a tecla el valor que nos devuelve la función teclado()
if (tecla>=0 && tecla<=9) //Comprobamos que el valor de las teclas esten comprendidas entre 1 y 9
//para evitar introducir letras
{
password[i] = tecla; //En la posición correspondiente del array guardamos el valor introducido
lcd.print("*"); //En pantalla mostramos un * para evitar que vean el código
delay(20); //retardo de 20mseg
}
else //Si introducimos un valor que no este entre 1 y 9 restamos 1 a i, esto es para volver a
//introducir el caracter en esa posicion otra vez
{
i=i-1;
}
}
//En este bucle comprobamos que la contraseña que hemos introducido coincida con la que teniamos configurada
for(i=0;i<4;i++)
{
if (desbloqueo[i]!=password[i]) //Se comprueba caracter a caracter y si no coinciden
{
i = 4; //Asignamos a i 4 para salir del bucle for
error=1; //Indicamos que hay error
}
else
{
error=0; //Indicamos que no hay error en ese caracter
}
}
//Si no hubiera error
if (error==0)
{
//Reiniciamos el contador de intentos
errores=0;
//Mostramos por pantalla DESBLOQUEADO durante 50mseg
lcd.clear();
lcd.setCursor(4,1);
lcd.print("Desbloqueado");
delay(50);
//Limpiamos el LCD y mostramos por pantalla Password:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password:");
lcd.setCursor(8,1);
}
//Si hay error
else
{
//Mostramos en pantalla Password: para seguir introduciendo pass de desbloqueo
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password:");
lcd.setCursor(8,2);
}
}
}
//Funcion que devuelve la tecla pulsada
int teclado()
{
int tecla;
int valoradc=analogRead(5); //Leemos el pin analogico 5 del arduino
//donde tenemos conectado el teclado de 1 pin
switch (valoradc) //Según el valor que nos da la lectura asignamos una tecla
{
case 865: return 7; //Devuelve tecla 7
break;
case 650: return 8; //Devuelve tecla 8
break;
case 508: return 9; //Devuelve tecla 9
break;
case 339: return 10; //Devuelve tecla 10
break;
case 803: return 4; //Devuelve tecla 4
break;
case 614: return 5; //Devuelve tecla 5
break;
case 486: return 6; //Devuelve tecla 6
break;
case 329: return 11; //Devuelve tecla 11
break;
case 735: return 1; //Devuelve tecla 1
break;
case 574: return 2; //Devuelve tecla 2
break;
case 460: return 3; //Devuelve tecla 3
break;
case 317: return 12; //Devuelve tecla 12
break;
case 698: return 14; //Devuelve tecla 14
break;
case 551: return 0; //Devuelve tecla 0
break;
case 445: return 15; //Devuelve tecla 15
break;
case 310: return 13; //Devuelve tecla 13
break;
default: return 16; //Devuelve tecla 16
}
}
Y aquí os dejo los archivos de la Teclado Shield v1.1: http://www.mediafire.com/?xk8ake4e1x5gbd4
Espero que os sirva esta Shield.
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.

Me gusta esto:
Me gusta Cargando...