Expansor de puertos con el PCF8574.

EXPANSOR DE PUERTO CON EL PCF8574.

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 o expansor de puerto PCF8574, el DS u hojas de datos del fabricante (Philips), me aclaró ciertos puntos, otros sin embargo, no había forma sencilla de comprender, así que, cuando lo tuve claro, decidí hacer algo de luz a los lectores que tengan esa sensación y aquí es donde empieza este, mi trabajo. Este es el encapsulado.

 pcf8574_foto pinesPCF8574
Fig. 1

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.

fig 9pFig. 2

 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:

direccionarFig. 3

Suponiendo que los pines A2, A1 y A0 están unidos a masa, habremos direccionado:

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.

según esto cabe destacar que disponemos 8 direcciones posibles para 8 dispositivos.

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 que usted puede por ejemplo, controlar ocho segmentos LED con sólo dos pines del microcontrolador (pero no todo el hardware I2C utiliza una mismadirección fija como el PCF8574).

Los dispositivos I2C requieren de una dirección exclusiva para su direccionado. Así, el PCF8574 necesita configurar una dirección, mediante la conexión de los pines A2, A1 y A0, a ALTO o a BAJO, 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 anterior figura 9). Este es, uno de los muchos dispositivos que utilizan esta tecnología I2C.

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.

teclado3x4_0_03      teclado3x4-551p
  Teclado de 3×4 con 10 salidas.   Vista de las pistas de los contactos.
Fig. 4

EL ESQUEMA.

Adaptado a mi teclado que se muestra en la imagen de arriba.

i2ckeypad_eschemapFig. 5 Circuito práctico

PRACTICA.

El código en cuestión es de Angel Sancho <angelitodeb@gmail.com> y aparece en el Playground de Arduino.

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

foto_keypad

gral_kaypadFig. 6

En esta última fotografía, puede apreciarse que en la protoboard, aparece un pequeño circuito en la parte alta, pertenece al RTC (Real Time Clock) 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.

conexiones_keypadFig. 7

<p style=»text-align: justify;»>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. </p>

Esto es todo, por este simple tutorial

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.