El PCF8575 es un expansor de entradas y salidas digitales de 16 bits que opera mediante el bus I2C. Su principal ventaja es permitir añadir 16 GPIO adicionales utilizando únicamente dos líneas de comunicación del microcontrolador, como SDA y SCL en plataformas tipo Arduino.
La dirección del dispositivo puede configurarse mediante pines dedicados, lo que permite conectar hasta 8 unidades en un mismo bus I2C. De este modo, es posible alcanzar un total de 128 líneas de entrada/salida adicionales sin aumentar el número de pines del microcontrolador.
El PCF8575 opera en un rango de tensión de entre 2.5 V y 5.5 V, lo que permite su integración tanto en sistemas de 3.3 V como de 5 V.
El consumo en reposo es extremadamente bajo, del orden de 10 µA, lo que lo hace ideal para aplicaciones de bajo consumo o sistemas que se alimentan por batería.
La corriente total suministrada por el dispositivo puede alcanzar aproximadamente 100 mA, teniendo en cuenta el conjunto de todos los pines.
La comunicación se realiza a través de I2C con frecuencias de hasta 400 kHz, lo que facilita su integración en sistemas embebidos sin necesidad de implementar protocolos complejos.
El tiempo de conmutación típico es de unos 4 µs. Aunque puede emplearse para generar señales digitales de baja frecuencia, no es adecuado para aplicaciones que requieran PWM de alta velocidad, debido a las limitaciones inherentes al bus I2C.
El PCF8575 es un componente económico y ampliamente disponible. A continuación se muestra una comparativa entre distintos fabricantes y distribuidores.
El dispositivo internamente tiene un registro de 16 bits conectado directamente a los pines. Cada bit controla un pin físico (P0–P17), por lo que cuando escribes datos, en realidad estás modificando ese registro.
La comunicación es muy simple: el microcontrolador envía dos bytes seguidos. El primero afecta a los pines P0–P7 y el segundo a P10–P17. Estos valores se guardan en un latch interno, lo que permite que el estado de los pines se mantenga sin necesidad de comunicación continua.
Una de sus particularidades es que no existe configuración clásica de entrada o salida. Los pines son cuasi-bidireccionales, lo que simplifica mucho su uso:
Internamente, cada pin tiene una pequeña corriente hacia VCC, lo que permite leer niveles altos cuando se utiliza como entrada sin necesidad de resistencias externas en muchos casos.
Cuando escribes un valor, este pasa por un registro interno, se almacena y se refleja directamente en los pines. No hay capas intermedias ni configuraciones complejas.
Además, el PCF8575 dispone de una salida de interrupción (INT) que se activa cuando cambia el estado de un pin de entrada, evitando tener que estar leyendo continuamente el dispositivo.
En lectura, el proceso es igual de directo: el microcontrolador solicita los datos y recibe el estado actual de todos los pines en dos bytes.
En este ejemplo se utiliza el PCF8575 no solo como expansor de salidas, sino también como interfaz de entrada.
Se configura el pin P1 como entrada, al que se conecta un pulsador, y el pin P0 como salida, donde se encuentra el LED.
En cada iteración del programa, se lee el estado de P1 mediante digitalRead(). Si el pulsador está activo (nivel alto), se escribe un nivel alto en P0, encendiendo el LED. En caso contrario, el LED permanece apagado.
Este comportamiento refleja una característica clave del PCF8575: sus pines son cuasi-bidireccionales, lo que permite usarlos dinámicamente como entrada o salida sin hardware adicional complejo.
Este tipo de configuración es especialmente útil cuando se necesita ampliar el número de entradas/salidas de un microcontrolador manteniendo una arquitectura simple basada en I2C.
1#include <PCF8575.h> 2// Dirección I2C del PCF8575 3PCF8575 pcf8575(0x20); 4 5void setup() { 6 Serial.begin(115200); 7 // P1 como entrada (botón) 8 pcf8575.pinMode(P1, INPUT); 9 // P0 como salida (LED) 10 pcf8575.pinMode(P0, OUTPUT); 11 pcf8575.begin(); 12} 13 14void loop() { 15 bool estado = pcf8575.digitalRead(P1); 16 if(estado == HIGH) { 17 pcf8575.digitalWrite(P0, HIGH); 18 } else { 19 pcf8575.digitalWrite(P0, LOW); 20 } 21}