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.
![A figura mostra uma foto de uma foto real do Módulo expansor de portas I2C PCF8574](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Figura-1-Modulo-expansor-de-portas-I2C-PCF8574.png?resize=406%2C415&ssl=1)
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 figura mostra uma foto de dois módulo PCF8574 conectado em série](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Figura-2-Dois-modulos-PCF8574-conectados-em-serie.png?resize=1024%2C489&ssl=1)
A pinagem do módulo expansor é bem simples de ser entendida, conforme mostrado na Figura 3.
![](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Figura-3-Pinos-do-modulo-expansor-PCF8574-1.png?resize=1024%2C576&ssl=1)
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:
![](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Blog-Jonas-84.png?resize=947%2C532&ssl=1)
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.
![A Figura mostra o circuito de funcionamento do módulo expansor de portas I2C PCF8574 com Arduino, em ilustração.](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Figura-4-Esquematico-de-ligacao-para-uso-do-modulo-expansor-de-portas-I2C-PCF8574-1.png?resize=1024%2C576&ssl=1)
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:
![A figura mostra uma captura de tela do caminho a ser seguido para encontrar o codigo do endereço I2C na Arduino IDE](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Figura-5-Codigo-para-verificar-o-endereco-I2C-do-modulo-expansor-de-portas-PCF8574-1.png?resize=665%2C600&ssl=1)
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.
![A Figura mostra uma captura de tela do Endereço I2C encontrado na Arduino IDE.](https://i0.wp.com/www.blogdarobotica.com/wp-content/uploads/2022/12/Figura-6-Endereco-I2C-no-modulo-expansor-de-portas-PCF8574-1.png?resize=698%2C416&ssl=1)
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.