INTRODUCCIÓN.
Cuando estuve preparando un proyecto en el que mediaba un Arduino, un teclado y una memoria, hubo un momento en el que, me faltaban patillas de E/S, estaba preocupado con el tema de las «pocas» patillas de las que podía disponer con el Arduino. No andaba yo muy fino, en realidad no tenía conocimiento de las posibilidades que ponía a mi alcance el I2C-bus.
Estuve indagando, como siempre, en la red hallé la respuesta. La red y mi empeño personal, por supuesto. Así que, adquirí en el comercio un dispositivo del que desconocía bastante, aunque había oído que podía expandir un puerto. Aquello me sonaba a «chino», yo conocía de los multiplexores, decodificadores síncrono y asíncronos, pero lo de expandir un puerto, la verdad, no tenía claro el tema.
Consulté que dispositivos había accesibles para realizar un montaje y hacer una prueba para ver cómo funcionaba el nuevo expansor de 8 bit. Lo que más me llamó la atención es que, usaba el bus I2C, es decir que con dos cables, hilos o patillas, podía obtener las posibilidades de un puerto de 8bits o casi, con las funciones de un teclado, lo que se adaptaba felizmente al proyecto. A decir verdad, existen varios dispositivos en el mercado que sirven para este tipo de propósito (como el de TI PCA9535 entre otros), sin embargo, yo usaré el PCF8574A que, es del que dispongo.
EL PCF8574
Entra en escena el expansor de I/O PCF8574, en el DS u hojas de datos del fabricante (Philips), me aclaró ciertos puntos, otros sin embargo, no había forma de comprender y aquí es donde empieza este, mi trabajo.
Según el DS, el PCF8574 consiste en un puerto cuasi bidireccional de 8 bit, que se sirve de una interfaz I2C-bus. El PCF8574 tiene una baja corriente de consumo e incluye salidas cerrojo (latch) con capacidad de alta corriente para conducir directamente LEDs. Este, también posee una línea de interrupción (INT), que puede ser conectada a la lógica interrupt del microcontrolador. Mediante el envío de una señal interrupt sobre esta línea, la E/S remota puede informar al microcontrolador si hay datos entrantes en sus puertos sin necesidad de comunicarse a través del I2C-bus. Esto quiere decir que el PCF8574 puede seguir siendo un simple dispositivo esclavo.
Encapsulado en 16-DIP. El PCF8574 y PCF8574A son versiones que difieren sólo en su dirección Slave, como se muestra más abajo, en la Fig.9. Si usted tiene un PCF8574P o PCF8574AP. Debe tener en cuenta la diferencia de dirección de según cual utilice. El PCF8574P tiene su dirección a partir de 0100 0000 (hex 40h), el PCF8574AP por su parte, tiene su dirección a partir de 0111 0000 (hex 70h). No obstante esto, no afecta en absoluto al modo en que el dispositivo funciona, a menos que tenga más de 8 de estos dispositivos.
Analicemos un poco más esto del direccionado. En primer lugar debemos ignorar el primer bit (bit Start) y también el último bit (bit Acknowledge), ya que son los bits de comunicación y no forman parte de la dirección que queremos estudiar. Veamos:
1 | 0 | 1 | 1 | 1 |A2 |A1 |A0 | R/<span style="text-decoration: overline;">W</span> |
Suponiendo que los pines A2, A1 y A0 están unidos a masa, habremos direccionado:
1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | R/<span style="text-decoration: overline;">W</span> |
Esta es la dirección 0x38 en hexadecimal, según el valor de R/W, esto se entiende como que es 0, se trata de escritura y cuando este bit es 1, la dirección es 0x39 ya sabemos que se trata de lectura.
123 | 0 | 1 | 1 | 1 |A2 |A1 |A0 | R/<span style="text-decoration: overline;">W</span> || 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | <= Escritura (38h)| 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | <= Lectura (39h)
según esto cabe destacar que disponemos 8 direcciones posibles para 8 dispositivos.
123456789 A2 |A1 |A0 |R/<span style="text-decoration: overline;">W</span>|| 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | = 0x38| 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | = 0x39| 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | = 0x3A| 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | = 0x3B| 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | = 0x3C| 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | = 0x3D| 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | = 0x3E| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | = 0x3F
Como la biblioteca serie de Arduino empuja a la izquierda cuando realiza la comunicación I2C, debemos asegurarnos de que cuando se trata de la izquierda ponemos los valores correctos y a continuación, «empujamos» todo a derecha antes. Perdemos R/W (que básicamente no nos interesa porque el pin actúa de todos modos).
Pero antes quiero presentar unos apuntes interesantes sobre el tema, que si lo desea puede saltarse.
Por cierto. En un foro, donde se discute las posibilidades de este dispositivo, he encontrado unas notas que vienen a corroborar las posibilidades del PCF8574, estas son de alguna manera parte de lo que se discute entre entendidos (lo aporto para un mayor y más rico contenido de este tema), dice así…
… , si tiene alguna necesidad adicional de entradas y salidas digitales, este chip PCF8574, puede ser una respuesta a sus oraciones. sólo requiere de dos conexiones de su microcontrolador (los cables de bus I2C) y le proporcionará un puerto de 8 pines que, pueden configurarse individualmente para ser Entrada o Salida.
Lo grandioso de este chip es que, si usted necesita incluso más entradas o salidas bastará con añadir otro de estos, sin necesidad de conexiones adicionales a su microcontrolador. La dirección hardware de esclavos I2C puede ser configurada para cualquiera de las 8 diferentes direcciones, lo que significa que, puede tener un total de 8 de estos chips en el mismo bus I2C.
sólo tiene que conectar el bus I2C, pines (SDA y SCL) de su microcontrolador a cada una de los correspondientes pines SDA y SCL del dispositivo PFC8574 y además, usted necesitará un par de resistencias RPU en estos cables ([comenta uno], he usado resistencias de 82k para hacer compatible mi sensor LEGO).
Esto significa por ejemplo que usted puede, controlar ocho segmentos LED con sólo dos pines del microcontrolador (pero no todo el hardware I2C utiliza el mismo prefijo de dirección fija como el PCF8574).
El PCF8574 necesita configurar una dirección, mediante la conexión a ALTO o a BAJO de los pines A2, A1 y A0, de acuerdo a lo que usted desee. El PCF8574A comienza en la dirección 0111xxx0 donde xxx depende de como usted conecte A2, A1, A0. (por su parte el PCF8574 empieza en la dirección 0100xxx0, como se muestra en la Figura 9).
Llegados a este punto, vamos a proceder con un ejemplo, creo que es un método adecuado, cuando la teoría llega a su parte más teórica o empírica. Así que, pondré un código que permita hacer algo con el PCF8574A que, como dije, es el que tengo a mano, pero antes quiero mostrar cuan fácil y cómo he realizado esta práctica.
He buscado ayuda en el foro Arduino y hago constar la gran ayuda que me han prestado los componentes del foro. Sigamos. Conservo el teclado de un viejo telefonillo, creo recordar, venía con un radio-despertador con teléfono. Como se aprecia en la foto, lo he desguazado y lo aprovecharé para realizar esta práctica. El lector que emprenda esta práctica, debe utilizar el teclado que mejor se adapte a sus necesidades o posibilidades.
El Esquema.
Adaptado a mi teclado que se muestra en la imagen de arriba.
PRACTICA
El código en cuestión es de Angel Sancho <angelitodeb@gmail.com> y aparece en el Playground de Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* * 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 numérico * alambrado como se puede ver en la imagen i2ckeypad_example_schema.png * y como trazar un mapa de pines por defecto de la librería i2ckeypad. * * R1, R2 and R3 son 10K * * Los pines analógicos del Arduino, (SDA) pin1 analógico conectado al pin15 * del PCF8574 y (SCL) pin0 anal?ico 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("Testea keypad/PCF8574A I2 Cport expansor lib Arduino\n\n"); } void loop() { char key = kpd.get_key(); if(key != '\0') { Serial.print(key); } } |
Poco más que la aplicación de las librerías <Wire.h> y <i2ckeypad.h>. Si queremos utilizar por ejemplo, un teclado de 4×4, se debe modificar la línea de definición:
#define COLS 3
por esta otra: #define COLS 4
En esta última fotografía, puede apreciarse que en la protoboard, aparece un pequeño circuito en la parte alta, pertenece al RTC basado en el DS1307 que, se encuentra conectado al bus I2C. Con cada tecla del teclado numérico, se produce un destello del LED de la placa Arduino, lo que puede tomarse como referencia de haber sido presionada una llave o tecla. A continuación, una aproximación de lo descrito.
Estaría bien, hacer una aplicación para ver cómo utilizar este magnifico dispositivo PCF8574A. Esto será motivo para un futuro documento con el que tratar este dispositivo, quizá el proyecto que se comenta al principio.
Hola, he visto tu información sobre el PCF, la verdad estoy buscando artículos para aprender un poco sobre el tema ya que tengo un pic 16f84 que es el único donde he practicado, compré el libro de microcontroladores PIc de autor Palacios y trae unos ejemplos para entrenar sobre el bus I2C, pero no logro hecharlo a andar en tu paginaweb veo que tienen diferente direccionamiento los de un tipo contra otro ahora con esto voy a checar el número exacto, no sabia que pudieran variar la dirección, tal vez por esto no trabaja, pero tengo una duda, la señal del relock del bus I2C cuánto debe de durar, las señales de los datos cuánto deben de durar?, si tienes este dato y me lo puedes compartir te lo agradeceré o un tutorial de kinder para I2C que me puedas recomendar ya que soy nuevo en este asunto en tu web lo haces parecer muy fácil tienes una didáctica muy buena y lo agradezco.
Hola Juan.
En principio, tanto si utilizas el PIC, como otro micro como el Atmega, en sus librerías viene los tiempos que se usan para el reloj y los datos. Por dicho motivo, creo que no te deben preocupar estos parámetros, ya que para ti, serán transparentes.
Desde mi punto de vista y por lo que me indicas, tu problema está más cerca de la dirección de tu PCF8574 o PCF8574A, fíjate bien, si este es el código de tu dispositivo, cada dispositivo tiene su dirección, y otra cosa, ¡OJO! como lo que pones, puedes poner en BINARIO o HEXADECIMAL, lee mi artículo «introducción al I2C-Bus», te puede aclarar mejor el tema.
Si tuvieras alguna consulta no dudes en hacérmelo saber.
Saludos.
Buenas. He trabajado con el pcf y tengo una duda no se si sera normal debido a que estamos hablando de un dispositivo que su salida siempre sera de impedancia tendiendo a infinito para poder ser entrada. Pero al medir voltaje del pin en salida va de 0 a 3.3v o 0 a 5v. Segun sea el caso. Eso viendo el pin sin vargam al conectar un led al pin cae a 1.7v y pues escasamente prende el led. Eso es normal le veonlogica por el hecho que es impedancia infinita para que en modo entrada no se queme. Me podrian dar una mano si tosos funcionan asi. Gracias.