Como utilizar o módulo expansor de portas I2C PCF8574
O módulo PCF8574 (Figura 1) é um componente que permite aumentar a quantidade de portas digitais de entrada/saída de um microcontrolador. Ele possui interface de comunicação I2C e utiliza apenas duas portas (SCL e SDA) para controlar os 8 pinos do chip.

O módulo PCF8574 é ideal para projetos grandes ou em que os pinos do microcontrolador não são suficientes. Ademais, você pode conectar até 8 módulos PCF8574 em série em um projeto, totalizando 64 portas de entrada/saída.
O modo de conexão em série de módulos PCF8574 pode ser observado na Figura 2.

A pinagem do módulo expansor é bem simples de ser entendida, conforme mostrado na Figura 3.

Na sua estrutura, temos do lado esquerdo 4 pinos para comunicação com o microcontrolador, são eles VCC, GND, SDA e SCL.
Na parte superior há 9 pinos, sendo 8 portas digitais de entrada e saída (P0, P1, P2, P3, P4, P5, P6 e P7) e em pino de interrupção lógica (INT).
Na parte central do módulo temos os jumpers para ajuste do endereço I2C. O módulo expansor PCF8574 pode ser configurado com diferentes endereços dependendo das posições dos jumpers. Existem três jumpers de seleção do endereço (A0, A1 e A2), que são colocados em nível lógico baixo quando conectados ao pino – e nível alto quando conectados ao pino +. A Tabela 1 descreve os endereços possíveis:

Nesse tutorial aprenderemos como utilizar o módulo expansor de portas I2C PCF8574 em conjunto com o Arduino para acionar 8 LEDs de forma ordenada.
MATERIAIS NECESSÁRIOS
- 1 x Placa Uno SMD R3 ATmega328;
- 1 x Cabo USB compatível com Arduino;
- 1x Módulo Expansor de Portas I2C PCF8574;
- 8 x Led vermelho difuso 5mm;
- 8 x Resistor 220 Ohms;
- Jumpers Macho-Macho;
- Jumpers Macho-Fêmea.
ESQUEMÁTICO DE LIGAÇÃO
A Figura 4 ilustra o esquemático de ligação para uso do módulo expansor de portas I2C PCF8574 em conjunto com o Arduino para acionar 8 LEDs de forma ordenada.

Ao realizar a montagem observe os seguintes pontos:
- Os polos negativos dos LEDs devem estar ligados ao GND do Arduino;
- Os polos positivos dos LEDs devem ser conectados aos pinos do módulo expansor (P0, P1, P2, P3, P4, P5, P6, P7 e P8).
- O pino SCL do módulo deve ser conectado com a porta A5 do Arduino UNO.
- O pino SDA do módulo deve ser conectado com a porta A4 do Arduino UNO.
- A alimentação do módulo deve ser feita utilizando o 5V do Arduino.
CONHECENDO O ENDEREÇO I2C DO SEU MÓDULO EXPANSOR
O endereço do módulo expansor de portas PCF8574 pode ser obtido consultando a Tabela 1. Para certificar que o endereço está correto, podemos executar um código exemplo da biblioteca wire.h. Para tal, abra o Arduino IDE e acesse o exemplo pelo seguinte caminho: Arquivo > Exemplos > Wire > i2c_scanner, conforme a Figura 5:

Realize o upload do código para o Arduino e abra o monitor serial. O código realizará o escaneamento do endereço do módulo PCF8574 e retornará seu valor na segunda linha exibida no monitor serial, conforme pode ser verificado na Figura 6.

ELABORANDO O CÓDIGO
Com o esquemático montado e de posse da informação do endereço I2C do módulo PCF8574, podemos proceder a programação. A proposta deste projeto é utilizar o módulo expansor de portas I2C PCF8574 em conjunto com o Arduino para acionar 8 LEDs de forma ordenada. Para tal, faremos uso da biblioteca “PCF8574.h”, que pode ser baixada através do seguinte link:
www.blogdarobotica.com/biblioteca-PCF8574
Aprenda a adicionar biblioteca no Arduino IDE: Clique aqui!
Acompanhe a lógica para a construção do código a partir dos seguintes passos:
1.Incluir a biblioteca “PCF8574.h”
Essa biblioteca será responsável por executar os comandos envolvendo o módulo expansor PCF8574.
2. Declarar o endereço I2C do módulo
Para declaração do endereço no código utilizaremos o comando: “PCF8574 pcf8574(X)”, sendo X é o endereço I2C do módulo PCF8574, que foi encontrado na Tabela 1 ou no código anterior.
3. Inicializar a comunicação serial e realizar as configurações iniciais
Na função setup(), inicializamos a comunicação serial através da instrução “Serial.begin(9600);”.
Logo após, definimos os pinos de digitais do módulo PCF8574 como saída (OUTPUT) por meio da instrução “pcf8574.pinMode(Pn, OUTPUT);”, em que n é o número do pino.
Em seguida, usamos a estrutura condicional para verificar se a inicialização do módulo PCF8574 ocorreu bem.
4. Ligar dos LEDs de forma ordenada
Iniciamos a função loop() realizando o acionamento dos LEDs de forma ordenada com intervalo de 1 segundo. Para ligar os LEDs usamos a instrução “pcf8574.digitalWrite(Pn, HIGH);”, em que n representa número do pino.
5. Desligar os LEDs de forma ordenada
Logo em seguida, realizamos o desligamento dos LEDs de forma ordenada. Para tal, usamos a instrução “pcf8574.digitalWrite(Pn, LOW);”, sendo n o número do pino. Por fim, temos como o resultado o seguinte código:
Por fim, temos como o resultado o seguinte código:
/* - LIGAR E DESLIGAR LEDS EM ORDEM COM MÓDULO EXPANSOR DE PORTAS I2C PCF8574 - ================================================= === BLOG DA ROBOTICA - www.blogdarobotica.com === ================================================= Autor: Jonas Souza E-mail: contato@blogdarobotica.com Facebook: facebook.com/blogdarobotica Instagram:@blogdarobotica YouTube: youtube.com/user/blogdarobotica ================================================= === CASA DA ROBOTICA - www.casadarobotica.com === ================================================= Facebook: facebook.com/casadaroboticaoficial Instagram:@casadarobotica ================================================== */ #include "PCF8574.h" //Inclui a bliblioteca "PCF8574.h" para controlar o módulo expansor. PCF8574 pcf8574(0x20); //Declaração do endereço I2C achado void setup() { Serial.begin(9600); //Inicia a comunicação serial pcf8574.pinMode(P0, OUTPUT); //Define o pino P0 do módulo como saída pcf8574.pinMode(P1, OUTPUT); //Define o pino P1 do módulo como saída pcf8574.pinMode(P2, OUTPUT); //Define o pino P2 do módulo como saída pcf8574.pinMode(P3, OUTPUT); //Define o pino P3 do módulo como saída pcf8574.pinMode(P4, OUTPUT); //Define o pino P4 do módulo como saída pcf8574.pinMode(P5, OUTPUT); //Define o pino P5 do módulo como saída pcf8574.pinMode(P6, OUTPUT); //Define o pino P6 do módulo como saída pcf8574.pinMode(P7, OUTPUT); //Define o pino P7 do módulo como saída Serial.print("Iniciando..."); //Exibe uma mensagem de inicialização no monitor serial assim que o código começa a funcionar if (pcf8574.begin()) { //Verifica a inicialização do módulo PCF8575 Serial.println("OK"); //Manda uma mensagem de OK caso a inicialização seja feita com sucesso } else { Serial.println("N-OK"); //Manda uma mensagem de N-OK caso ocorra algum erro de comunicação } } void loop() { pcf8574.digitalWrite(P0, HIGH); //Liga o LED conectado ao pino P0 delay(1000); //Tempo de espera entre a ligação de um led e outro em milissegundos pcf8574.digitalWrite(P1, HIGH); //Liga o LED conectado ao pino P1 delay(1000); pcf8574.digitalWrite(P2, HIGH); //Liga o LED conectado ao pino P2 delay(1000); pcf8574.digitalWrite(P3, HIGH); //Liga o LED conectado ao pino P3 delay(1000); pcf8574.digitalWrite(P4, HIGH); //Liga o LED conectado ao pino P4 delay(1000); pcf8574.digitalWrite(P5, HIGH); //Liga o LED conectado ao pino P5 delay(1000); pcf8574.digitalWrite(P6, HIGH); //Liga o LED conectado ao pino P6 delay(1000); pcf8574.digitalWrite(P7, HIGH); //Liga o LED conectado ao pino P7 delay(1000); pcf8574.digitalWrite(P0, LOW); //Desliga o LED conectado ao pino P0 delay(1000); //Tempo de espera entre o desligamento de um led e outro em milissegundos pcf8574.digitalWrite(P1, LOW); //Desliga o LED conectado ao pino P1 delay(1000); pcf8574.digitalWrite(P2, LOW); //Desliga o LED conectado ao pino P2 delay(1000); pcf8574.digitalWrite(P3, LOW); //Desliga o LED conectado ao pino P3 delay(1000); pcf8574.digitalWrite(P4, LOW); //Desliga o LED conectado ao pino P4 delay(1000); pcf8574.digitalWrite(P5, LOW); //Desliga o LED conectado ao pino P5 delay(1000); pcf8574.digitalWrite(P6, LOW); //Desliga o LED conectado ao pino P6 delay(1000); pcf8574.digitalWrite(P7, LOW); //Desliga o LED conectado ao pino P7 delay(1000); }
Por fim, temos o funcionamento do projeto, mostrado no Vídeo 1.
Espero ter ajudado,
Obrigado a todos e em caso de dúvidas deixe seu comentário abaixo!
Att. Jonas Souza
Graduando em Engenharia Elétrica.