Teclado con I2C y el PCF8574

Hola! Amigos.
Llevo algún tiempo realizando una práctica en Arduino con el I2Cbus, basado en el dispositivo de Philips PCF8574P. La verdad es que, no tenía idea de lo complicado que iba a resultar, en principio estoy tratando de realizar un teclado numérico de 4x3, tal cual el ejemplo que aparece en este enlace:

http://www.arduino.cc/playground/Main/I2CPortExpanderAndKeypads

El caso es que he cableado el teclado mediante 12 pulsadores sobre una placa de medidas adecuadas, según se desprende del esquema electrónico que acompaña al mentado ejemplo, he utilizado tres resistencias de 10k a positivo las RPA (Resistencias de Polarización a Alto, más conocido por el término anglosajón Pull-up), o sea, tal cual el ejemplo. He cableado todos los elementos implicados y he cargado el "i2ckeypad.pde" al Arduino, que ya tiene el resto de archivos en su carpeta correcta, supongo por que no me da errores de compilación.

Mi sorpresa es que, tan sólo ha presentado el mensaje: "Testing keypad/PCF8574 I2C port expander arduino lib" en el monitor.
Sin embargo, no consigo que me devuelva el número del pulsador presionado, pensé que se trataba de la patilla 13, que debe ir conectada a masa, pero sorpresa, tampoco es esto.

He leído las hojas de características del PCF8574 y aquí se presenta el primer escollo (no entiendo el inglés) y por consiguiente los detalles se me pierden. Llego a entender que:

Un bit de datos se transfiere en cada de pulso reloj. Los 
 datos en la línea SDA deben permanecer estables durante el 
período de pulso ALTO del reloj, con cambios en la línea de 
datos en este tiempo ha de ser interpretado como señales 
de control.

Bueno, no se si está bien traducido. Siento haber tomado tanto tiempo, pero quería explicar lo mejor posible mi problema.

Puede ayudarme alguien del foro, por favor.

Un saludo.

Me ha llegado el arduino el mismo viernes y todavía no he podido probar mucho, pero esto del teclado 3x4 es una de las cosas que quiero probar bien.
En cuanto lo haga pondré nis resultados.

Vaya, que suerte la mia.

Por lo visto nadie ha trabajado nunca con el preciado bus I2C.

Mientras llega una respuesta a la consulta que genera este hilo, me he puesto a realizar pruebas con otros dispositivos que utilizan este protocolo (I2C) y he probado a realizar un RTC con el DS1307.

He de confesar que, en mi primer paso, me cargué la patillas 4 y 5 analógicas del Atmega168, que le vamos a hacer, cosas que pasan, aunque no se el porqué de tal fallo.

El caso es que he adquirido un Atmega328 que por lo que llevo practicando, se adapta al Arduclema, que es la placa que dispongo y que adquirí en www.ray-ei.com y que por su robustez me convence más que otras.

A lo que iba, he conectado correctamente el DS1307 y me funciona con una precisión de lo más envidiable que puedas imaginar. De categoría.

Ahora viene la pregunta, dado que yo no soy un programador o no llego a 'novatius plenis' ;).

Hay algún entendido que pueda indicarme algún enlace para poder realizar un pequeño cambio y hacer un RELOJ con unos pulsadores que me permitan poner en hora, vanzar y ajustar el reloj.

Sólo para hacer una practica con el Arduino y el DS1307 y de paso aprendo un poco. Me han comentado de un programa gráfico que permite programar fácilmente, :-[ no se.

Por el momento voy haciendo unas prácticas con lo que tengo a mano, un teclado numérico, un LM35, un opto y a ver que puedo hacer con estos y otros componentes. Igual hago unos documentos de mis experiencias con ellos y el I2C y los cuelgo, jo que gozada.

Nada más chicos, espero que hayáis tenido unas vacaciones bien pasadas por agua y diversión que 'pa eso están'

Lo dicho saludos.

Hola,

Hay mucha gente que ha trabajado con I2C... y muchísima con RTC.
No tienes más que buscar en google para comprobar lo que te digo...Eso sí, mucho en ingles:
http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock
http://www.glacialwanderer.com/hobbyrobotics/?p=12

En castellano: Fecha, Hora y Arduino | Carballada

y un montón más....

Si has entendido el código que has usado para control del DS1307, verás que cuando inicias, usas una función para ponerlo a la fecha y hora deseada. Por lo que es relativamente sencillo realizar el cambio que quieres. A parte de una botonera, me imagino que quieres visualizar de alguna manera, no? Hay librerias y un motón de ejemplos de manejo de LCD y botoneras.
Manejo pulsador:
http://arduino.cc/es/Tutoriales/Pulsador
Para LCD puedes utilizar la libreria de manejo con 4 bits:
http://www.arduino.cc/playground/Code/LCD4BitLibrary

También puedes usar el puerto serie para ponerlo en fecha-hora y ver datos si no quieres complicarte por el momento

Saludos y a por ello... :wink:

Igor R.

Hola! De nuevo por aquí.

Gracias Igor por tu aporte. Estoy revisando los enlaces que me pasaste.

Gracias otra vez.

Hola Velón,

Por lo que he podido ver en otros esquemas, también ponen resistencias pull-up en los pines SCL y SDA al arduino.
¿Has probado esto?

Yo todavía estoy haciendo pinitos de novato y todavía no he probado nada de i2c, aunque me tocará, porque un teclado 3x4 tengo que poner para mi proyecto y para evitar gastar muchas entradas usaré el PCF8574. Ya te contaré cuando llegue ahí y estaré atento a tus avances.

Un saludo,
Johnny

¡ah! y gracias a Igor R por la cantidad de luz que aporta con sus respuestas.

Hola! amigos, un saludo a todos, en especial a Igor R.

Verás he hecho una prueba con el RTC DS1307 y me funciona, lo que prueba que las salidas SDA y SCL están en condiciones, respecto a las PRA (Resistencias de Polarización a Alto), las que utilizo son las de la propia tarjeta del Arduino.

A pesar de todo, aún no he tenido tiempo de probar con el PCF8574, ya tengo un par de ideas para probar a ver si me funciona. Ya te comentaré como me ha ido la experiencia con este expansor de puertos.

Por cierto, he traducido al español, el Data Sheet del DS1307 (a mi manera) a ver que te parece, lo puedes ver en:

http://www.hispavila.com/3ds/atmega/EL_RTC_DS1307.pdf

Espero tus impresiones.

Un saludo.

Gracias!!
Ahora estoy de viaje, me lo miraré cuando llegue.

Ánimo!!

:wink:

Hola velon,

Ayer hice la páctica del teclado con el PCF8574P y me funcionó a la primera !!!
El esquema que he realizado es el que viene en la página de Arduino que pusiste inicialmente:


y el teclado he utilizado uno de este estilo, identificando los pines según el esquema del teclado para conectarlos al PCF8574P de forma correcta.

Ya mostraré fotos.

Un saludo,
Johnny

Hola! Johnny

Me complace leer tu post, sin duda has alcanzado la meta que te habías propuesto. Por dicho motivo debo felicitarte y mi enhorabuena por todo ello.

En mi caso (PCF8574AP), por lo visto no he comprendido cómo poner la dirección para poder acceder al dispositivo ya que, no consigo leer ni escribir nada, por consiguiente voy a seguir indagando la forma de comunicarme con él.

He probado erróneamente con la dirección 0x20, que es como viene en el ejemplo de:

http://www.arduino.cc/playground/Main/I2CPortExpanderAndKeypads

Para el PCF8574, pero como el mio es un PCF8574A, he de cambiar esta dirección, yo estoy pensando siempre, en los bits de mas peso y en este punto, creo que me estoy metiendo en un lío monumental, sobre todo, debido a que se me olvida que el bit de menor peso, el de L/E no interviene ya que el sistema lo monta de forma automática, lo he leído en algún sitio. Voy a probar con la dirección 0x38.

Si alguien puede sacarme de dudas será bienvenida su ayuda.

Saludos

El ejemplo al que apuntas es el que he usado yo y efectivamente la dirección 0x20 es la que he usado. El integrado es el PCF8574P
La verdad es que no tengo mucho mérito ya que de momento me he limitado a copiar un esquema y utilizar código escrito por otros, con la suerte de no tener problemas.

Por lo que he podido entender del datasheet, para el PCF8574A debes usar la dirección 0x38, como bien dices.
Espero que tengas éxito.

Un salido,
Johnny

Hola! saludos a todos.

Por fin he puesto en funcionamiento el teclado de 3x4 con la ayuda del PCF8574A que, efectivamente su dirección de esclavo es 0x38 o lo que es lo mismo b01110000. He utilizado el código del Playground de Arduino, con la librería que le acompaña.

Una vez más, gracias al tiempo que dedican algunos a responder las consultas que otros hacemos. Espero poder ayudar a alguien en la primera ocasión.

Saludos

Me alegro mucho de que finalmente te funcione.
Este post que iniciaste tu me ha ayudado a aprender algunas cosas.

Un saludo,
Johnny

Hola! De nuevo por aquí.

Como decía en el anterior post, ya conseguí poner en marcha el teclado de 3x4. Hay que reconocer que no es fácil (por lo menos para mi) entender a primera pasada la composición del byte de dirección, con el dichoso bist de menor peso así como el bit de máximo peso, en los cuales no intervienen para el programador, ya que éstos dos bits lo procesa el mismo microcontrolador mediante la propia orden, bien sea primer byte y si se trata de lectura o escritura.

En fin, ya está aclarado el tema. El siguiente es el código que he utilizado, cuya autoría consta en el mismo.

/*
 *  i2ckeypad.pde - keypad/I2C expander interface example for Arduino
 *
 *  Copyright (c) 2009 Angel Sancho <angelitodeb@gmail.com>
 *  All rights reserved.
 *
 *
 *  LICENSE
 *  -------
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *
 * EXPLICACION
 *  -----------
 * 
 * Este ejemplo fue probado con PCF8574P y el teclado numerico SPARKFUN 4x3 
 * alambrado como se puede ver en la imagen i2ckeypad_example_schema.png y 
 * como trazar un mapa de pines por defecto de la libreria i2ckeypad.
 * 
 *  R1, R2 and R3 son 10K
 * 
 * Los pines analogicos del Arduino, (SDA) pin1 analogico conectado al pin15 
 * del PCF8574 y (SCL) pin0 analógico conectado al pin14 del PCF8574.
 * 
 *   http://www.arduino.cc/playground/Main/I2CPortExpanderAndKeypads
 * 
 */ 

#include <Wire.h>
#include <i2ckeypad.h>

#define ROWS 4
#define COLS 3

// Con A0, A1 y A2 del PCF8574A a masa I2C se direcciona 0x38, el PCF8574 se direcciona 0x20.
#define PCF8574A_ADDR 0x38

i2ckeypad kpd = i2ckeypad(PCF8574A_ADDR, ROWS, COLS);

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  kpd.init();

  Serial.print("Testear keypad/PCF8574A I2C port expansor lib Arduino\n\n");
}

void loop()
{
  char key = kpd.get_key();
  if(key != '\0') 
  {
        Serial.print(key);
  }
}

El tutorial que he creado lo he colgado en este enlace:
http://www.hispavila.com/3ds/atmega/expansor_puerto.html

Espero que lo pueda aprovechar alguien que tenga dudas.

Saludos.

Hola! Amigos.

Llevaba tiempo sin aparecer por este foro. Ha habido mucho movimiento en este tiempo y me ha faltado el momento para contactar, revisar el foro y atender consultas, si era el caso, pido disculpas por todo.

He podido ver algún error de enlace como el que aparece en la entrada #7 (más arriba) donde hablo de un archivo pdf que realicé como traducción y resulta que lo colgué en el sitio adecuado para descargarlo, sin embargo el enlace que puse (arriba) no es bueno, por lo que ruego al master, que elimine dicha entrada, para evitar errores.
El enlace correcto es el siguiente:

http://www.hispavila.com/3ds/atmega/descargas/ds1307_rtc.pdf

Siento el error cometido. Espero poder participar más a menudo.

Gracias por todo.