Archivo de la etiqueta: keyboard

Teclado I2C con chip PCF8574 y Arduino


En la anterior entrada he hablado de como convertir una pantalla LCD para comunicarse con nuestras placas Arduino a través del protocolo de comunicación I2C, la cual podéis ver aquí. Entonces decidí investigar acerca de como realizar un teclado I2C para poder trabajar con nuestro Arduino sin necesidad de utilizar un montón de pines digitales, que podremos utilizar para otros menesteres, y aunque no he encontrado mucha información he conseguido obtener un teclado I2C que funciona perfectamente para nuestros proyectos, pasando de emplear 8 pines digitales a sólo 2 pines de comunicación (SDA y SCL en nuestro Arduino). El teclado que he empleado para las pruebas ha sido un teclado de membrana muy económico como el de la imagen.

KEY4X4M01

Para ello usaremos el integrado PCF8574 y como hemos comentado anteriormente hay que tener en cuenta que se pueden encontrar dos tipos de integrados PCF8574, uno el PCF8574N y otro el PCF8574A, que se diferencian en el valor de la dirección del dispositivo que podemos asignar, aumentando así las posibilidades a la hora de crear más dispositivos I2C para trabajar con nuestras placas Arduino, os dejo unas imagenes de como poder seleccionar la dirección I2C para el dispositivo en cada uno de los integrados arriba mencionados y una tabla de referencia de direcciones para el PCF8574N según se conecten los pines A0, A1 y A2.

Direcciones diferentes PCF8574

Tabla referencia Direcciones I2C

En esta imagen podéis ver como cablear todos los componentes para poder convertir vuestro teclado matricial en un teclado I2C con el que poder trabajar perfectamente desde vuestro Arduino (yo he usado el integrado PCF8574N para las pruebas):

Conexion teclado a pcf8574

NOTA: Yo he optado por conectar los pines A0, A1 y A2 del PCF8574N a tierra, para así obtener como dirección del dispositivo I2C (en este caso el teclado de membrana) 0×20 (en valor hexadecimal).

Os pongo también el esquemático realizado en Eagle por si alguien lo entiende mejor:

Esquematico eagle Teclado I2C PCF8574

El ejemplo que he usado para realizar las pruebas es el siguiente:

/*Probando Teclado I2C con integrado PCF8574 y Arduino UNO*/

//Añadimos las librerias
#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>

//Indicamos el numero de filas
const byte FILAS = 4;
//Indicamos el numero de columnas
const byte COLUMNAS = 4; 

//Indicamos como queremos que nos devuelva el valor de la tecla pulsada
char teclas[FILAS][COLUMNAS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

//Indicamos los pines de configuracion de filas y columnas
byte PinsFilas[FILAS] = {0,1,2,3}; 
byte PinsColumnas[COLUMNAS] = {4,5,6,7};

//Indicamos la direccion I2C de nuestro dispositivo, se puede modificar dependiendo de las conexiones A0,A1 y A2
//Mirar datasheet PCF8574
int i2caddress = 0x20;

Keypad_I2C kpd = Keypad_I2C( makeKeymap(teclas), PinsFilas, PinsColumnas, FILAS, COLUMNAS, i2caddress );

void setup()
{
  Serial.begin(9600); //Iniciamos configuracion serie para ver las teclas pulsadas
  kpd.begin();  //Iniciamos el teclado
}

void loop()
{
  char tecla = kpd.getKey();  //Asignamos el valor devuelto por el teclado a la variable tecla
  //Mostramos el valor por el monitor serie
  if (tecla)
  {
    Serial.println(tecla);
  }
}

Aquí podéis ver una imagen del circuito montado y conectado al Arduino y además un ejemplo de la pulsación de las teclas a través del monitor Serie:

IMAG0028

Monitor Serie Teclado I2C PCF8574

Como siempre os dejo los archivos para que podáis hacer funcionar perfectamente este ejemplo: https://www.mediafire.com/?28b26tzosl6hrxi

Espero que os sirva de ayuda la entrada!!

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.

donativo_paypal

SHIELD TECLADO V1.1 PARA ARDUINO CON 1 PIN


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.

donativo_paypal

Teclado para Arduino que emplea solo un pin


Hola de nuevo, después de unos días inactivo debido a los examenes de la Universidad estoy por aquí para presentaros una placa que he hecho con el software Eagle (una maravilla), se trata de un teclado 4×4 controlado solo por un pin analógico de nuestro Arduino. Ya tengo diseñada la placa y comprados todos los componentes, así que una vez que tenga insolada la placa procederé a soldar todos los pulsadores y resistencias me pondré a hacer pruebas con ella.  Una vez comprobado el buen funcionamiento sobre el Arduino os subiré los archivos del eagle para que la podáis mejorar o para poder haceros este teclado que sin duda nos ayudará en nuestros proyectos.

Aquí os dejo el esquema de conexión del teclado a nuestro Arduino:

En esta imagen podeis comprobar los valores que se producen en el pin que va conectado a la entrada analógica de nuestro Arduino:

Nota: Los valores del teclado analógico no son precisos debido a las tolerancias de las resistencias pero son valores muy próximos, con el monitor serie del IDE de arduino podeis ver los valores exactos y apuntarlos.

 

 

Para comprobar si eran exactas he montado el circuito en Proteus y las pruebas fueron exitosas. Ahora tocar probar si funciona realmente sobre nuestro Arduino. Os dejo para que veais más o menos como será la placa real unas fotos de las placas que he hecho del teclado en Eagle, una para conectar encima de Arduino como una shield y la otra para conectar con 3 pines (Vcc, Out, Gnd).

Espero que os sirvan de ayuda, en cuanto tenga montada la placa (me voy a decantar por la que va encima de Arduino, es decir, la primera) os enseño las fotos.

P.D: En un post posterior he realizado una mejora para esta shield, allí encontrareis los archivos de la shield teclado.

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.

donativo_paypal