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

15 comentarios en “Teclado I2C con chip PCF8574 y Arduino”

  1. Muy buen tutorial, ya tengo base para cuando le meta mano al protocolo I2C

  2. Practicando Arduino, la verdad es que con todos los módulos I2C que hay se hace muy sencillo la realización de proyectos más completos y usando menos pines del Arduino para los mismos, o dejándolos para otros sensores/actuadores que no empleen el protocolo de comunicación I2C.

    Un saludo!!

  3. La verdad es que parece muy sencillo pero lo cierto es ue no consigo hacerlo funcionar ni a tiros, la unica diferencia es que tengo el pcf8574A y aunque le cambio la direccion por la 38 el arduino no se entera que tiene conectado nada. ¿Alguien me podria aconsejar por donde tengo que empezar ha buscar el error?

  4. Hola corbeyote!!

    Que raro esto que comentas, a mi me paso que al principio no me funcionaba porque había conectado mal el teclado. Mirando el teclado de frente (los números visibles hacia ti), el pin de la izquierda del teclado es el número 1. Otra cosa es saber el teclado que tienes (si es como el que pongo yo debería ir bien, he probado con 5 distintos que tengo en casa. Si es otro modelo quizás varíen las filas y columnas con respecto al teclado de membrana), a ver si damos solucionado tu error.

    Si puedes poner una imagen para ver como tienes las conexiones hechas sería lo mejor.

    Un saludo!!

  5. Enhorabuena por el artículo y por el blog en general. Hace tiempo que lo tengo en mis favoritos y es uno de mis preferidos. Sigue así, los que empezamos en esto te lo agradecemos. Un saludo!!!

  6. ya he solucionado el problema, no eran las conexiones sino que no habia sustituido la libreria keypad. La verdad es que funciona perfectamente, me habeis solucionado un problema que llevava tiempo con el y ya lo integrado en el sistema que estoy montando.
    Muchas Gracias

  7. Gracias a ti por visitarnos!! Me alegra mucho de que sirva de ayuda para la gente que esta en este mundo. Un saludo JuanKar!!

  8. Hola corbeyote!! Me alegro de que ya tengas solucionado el problema, la verdad es que este circuito funciona muy bien y libera a nuestro arduino en cuanto a pines se refiere. Un saludo!!

  9. Hola
    Muy buen post. Hay que poner dos resistencias pull up a las lineas SDA y SCL. ¿de que tamaño?

Deja un comentario