PCF8574: sobre el expansor E/S I2C para Arduino

PCF8574 CHIP de TI

Seguro que has escuchado hablar del IC PCF8574, un chip que puede comprarse por separado o ya montado en módulo como otros muchos componentes electrónicos para facilitar tu integración con tu placa Arduino. En este caso, se trata de un extensor de las entradas y salidas para el bus I2C.

Puedes pensar que Arduino ya cuenta con su propio bus I2C integrado, y es cierto. Pero el PCF8574 puede ayudar a ampliar ese bus más allá de los límites de tu placa de desarrollo, lo cual puede ser de gran ayuda para algunos makers que necesitan algo más que lo aportado por Arduino.

¿Qué es el bus I2C?

Arduino UNO funciones millis

El nombre I2C proviene de Inter-Integrated Circuit o inter-circuitos integrados. Su versión 1.0 fue creada en 1992 por Philips. Luego vendría una segunda 2.1 en 2000 y en la actualidad se ha transformado en un estándar (a 100 kbit/s, aunque permite hasta 3.4 Mbit/s máximo) cuando en 2006 caducó la patente y se puede usar de forma libre.

En la actualidad es muy usado en la industria para comunicación, y también los makers lo aprecian mucho para sus proyectos para comunicar diferentes microcontroladores y periféricos integrados en un IC.

El I2C es un bus bastante conocido de comunicación serie. Usa un protocolo síncrono de comunicación con solo 2 canales (existe una tercera, pero está acoplada a referencia o GND), de hecho también se le conoce como TWI (Two Wire Interface):

  • Uno para el clock o reloj (SCL).
  • Otro para datos (SDA).
Ambos son conexiones CMOS de drenador abierto y necesitan resistencias pull-up. Además, si un dispositivo transmite un 0 y otro un 1 podría haber problemas, por eso se pone siempre a 1 (nivel alto) la línea y los dispositivos transmiten siempre 0 (nivel bajo).

Eso implica que el maestro y esclavo envían datos por el mismo cable o pista, que es controlada por el primero que es el que genera la señal de reloj. Cada uno de los dispositivos periféricos conectados al bus I2C tendrá una dirección única asignada, para así poder direccionar las transmisiones. Pero no se necesita que el maestro siempre sea el mismo (multimaestro), sí que siempre sea él quien inicie la transferencia.

Como ya expliqué en el artículo de Arduino I2C al que antes hice referencia, cada placa tiene estas conexiones del I2C en lugares diferentes. Es algo que tienes que tener presente para poderlo usar adecuadamente en cada versión de placa:

  • Arduino UNO: el SDA está en A4 y el SCK en A5
  • Arduino Nano: igual que el anterior.
  • Arduino Mini Pro: igual.
  • Arduino Mega: SDA está en el pin 20 y SCK en el 21.
  • Más información sobre las placas.

Ya sabes que puedes usar el I2C para tus sketches de forma fácil, ya que se incluye la biblioteca Wire.h con diversas funciones para esta comunicación serie:

  • begin(): inicia la biblioteca Wire y especifica si es master o slave
  • requestFrom(): usado por el maestro para solicitar datos al esclavo.
  • beginTransmission(): comenzar la transmisión con esclavo.
  • endTransmission(): finalizar la transmisión.
  • write(): escribe datos desde un esclavo como respuesta a una petición del maestro o puede poner en cola la transmisión de un maestro.
  • available(): devolverá el número de bytes para leer.
  • read(): lee un byte transmitido desde un esclavo a un maestro o viceversa.
  • onReceive(): llama a una función cuando un esclavo recibe una transmisión de un maestro.
  • onRequest(): llama a una función cuando un esclavo solicita datos de un maestro.

Para más información sobre la programación de Arduino y funciones puedes descargar nuestro tutorial en PDF.

¿Qué es el PCF8574?

módulo PCF8574

El PCF8574 es un expansor de entradas y salidas (E/S) digitales por bus I2C. Puede estar fabricado por diversos fabricantes, además de tenerlo disponible en IC y módulos. En cualquier caso, es muy práctico para conectarlo a tu placa Arduino y tener capacidad para controlar más dispositivos que los que permite la placa base.

El pinout del PCF8574 es sencillo, ya que solo incluye 8 pines cuasidireccionales (P0-P7 donde se conectan los chips a comunicar), y por otro lado tienes los SDA y SCL que debes conectar a la placa de Arduino, así como VCC y GND para alimentar también el módulo. Y no olvides los tres pines de direccionamiento A0, A1, A2 para elegir a cuál de los dispositivos se dirige la comunicación…

PCF8574 pinout

Posee otras características que debes conocer:

  • Sus conexiones, al ser drenador abierto, pueden ser usadas tanto como entradas como para salidas.
  • La corriente máxima es de 25mA cuando actúa como salida (sumidero, cuando la corriente fluye dirección PCF8574) y de 300 µA (fuente, la corriente fluye desde el PCF8574).
  • La tensión de alimentación es de 2.5 y 6v. El consumo en stand-by es muy bajo, tan solo 10 µA.
  • Todas las salidas disponen de latches, para mantener el estado sin necesidad de acciones externas. Solo se debe actuar cuando se quiere cambiar el estado.
  • Se pueden obtener 8 direcciones posibles, es decir, hasta 8 dispositivos con los que comunicarse o usando 8 módulos ampliarlo hasta 64 dispositivos. Las direcciones (pines A0,A1,A2) serán:
    • 000: dirección 0x20
    • 001: dirección 0x21
    • 010: dirección 0x22
    • 011: dirección 0x23
    • 100: dirección 0x24
    • 101: dirección 0x25
    • 110: dirección 0x26
    • 111: dirección 0x27
  • Admite interrupción (INT) por una línea especial para detectar datos sin monitorizar constantemente.

Integración con Arduino

Captura de pantalla de Arduino IDE

La conexión con Arduino es muy sencilla, tan solo debes conectar Vcc con el pin 5v de la placa Arduino, y GND con GND de Arduino. Por otro lado, los pines del módulo PCF8574 SDA y SCL los puedes conectar con los pines 14 (A5 SCL) y 15 (A4 SDA). Solo con eso ya comenzaría a funcionar, evidentemente puedes usar los Px para conectar los dispositivos que quieres comunicar…

Después solo faltaría comenzar con un sketch de ejemplo en Arduino IDE. Lo puedes hacer sin usar biblioteca adicional como por ejemplo…


#include <Wire.h>
 
const int address = 0x38;
 
void setup()
{
   Wire.begin();
   Serial.begin(9600);
}
 
void loop()
{
   for (short channel = 0; channel < 8; channel++)
   {
      // Escribir dato en cada uno de los 8 canales
      Wire.beginTransmission(address);
      Wire.write(~(1 << channel));
      Wire.endTransmission();
      
      // Lee dato del canal
      delay(500);
   }
}

Como entrada:

#include <Wire.h>
 
const int address = 0x38;
 
void setup()
{
   Wire.begin();
   Serial.begin(9600);
}
 
void loop()
{
   short channel = 1;
   byte value = 0;
 
   // Leer el dato del canal
   Wire.requestFrom(pcfAddress, 1 << channel);
   if (Wire.available())
   {
      value = Wire.read();
   }
   Wire.endTransmission();
 
   // Mostrar el valor leido por el monitor serie
   Serial.println(value);
}

O también usar bibliotecas, como por ejemplo la PCF8574 que puedes descargar aquí y usar un código similar a este del propio ejemplo que viene junto con esta biblioteca:

#include <Wire.h>
#include "PCF8574.h"
 
PCF8574 expander;
 
void setup() 
{
  Serial.begin(9600);
  
  expander.begin(0x20);
  
  /* Setup some PCF8574 pins for demo */
  expander.pinMode(0, OUTPUT);
  expander.pinMode(1, OUTPUT);
  expander.pinMode(2, OUTPUT);
  expander.pinMode(3, INPUT_PULLUP);
 
  /* Blink hardware LED for debug */
  digitalWrite(13, HIGH);  
  
  /* Toggle PCF8574 output 0 for demo */
  expander.toggle();
  
  /* Blink hardware LED for debug */
  digitalWrite(13, LOW);
}
 
 
 
void loop() 
{
}


Sé el primero en comentar

Deja tu comentario

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

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.