Como usar o PCF8574 – Expansor de portas I2C
O CI PCF8574 é um expansor de portas I2C de 8 bits, utilizado para acionar até oito pinos do chip utilizando apenas duas portas do microcontrolador, liberando assim as demais portas para outras tarefas.
O PCF8574 é um CI com baixo consumo de corrente e pinos com potência suficiente para controlar dispositivos como leds mas que também podemos usar como saídas (e entradas) de uso geral, acionando relés, atuadores ou recebendo dados de sensores.
Características do PCF8574
Na imagem abaixo temos a pinagem do chip que vamos usar aqui, o PCF8574P (datasheet):
Os pinos Vdd e Vss são os pinos de alimentação (Vdd é o positivo, 2,5 à 6VDC, e Vss é o GND). Os pinos destacados em azul são da interface I2C (SDA e SCL), e os pinos em laranja são os pinos das 8 saídas do PCF8574 (P0 à P7). Temos também um pino INT, usado para trabalhar com interrupções do microcontrolador.
Os pinos em vermelho (A0, A1 e A2) são os pinos de endereçamento do PCF8574, endereço esse que será usado para comunicação I2C com o chip e identificar o dispositivo no barramento. O PCF8574 pode ter até 8 endereços diferentes, o que significa que no nosso circuito podemos ter ao mesmo tempo até 8 desses chips, totalizando 64 portas adicionais:
Então para selecionar o endereço I2C que desejamos usar com o chip, basta seguir a tabela acima, atribuindo o valor 0 ou 1 aos pinos A0, A1 e A2.
Conectando o expansor no Arduino
Neste exemplo vamos usar um botão para acionar 4 saídas (P0, P1, P4 e P5) do PCF8574. A cada toque do botão, um valor é enviado para o CI, que baseado nesse valor aciona a porta correspondente.
Monte o circuito abaixo, conectando os pinos A4 (SDA) e A5 (SCL) do Arduino Uno nos pinos SDA e SCL correspondentes do PCF8574 (pinos 14 e 15).
No circuito foram usados 4 leds nas saídas e também 5 resistores de 1K nos leds e no botão (como pull-up).
Os três pinos de endereçamento estão ligados ao negativo, o que significa que o nosso PCF8574 está com o endereço hexadecimal 0x20 (ou 32 em decimal) na interface I2C. Para verificar se o endereço está correto, utilize o programa I2CScanner que eu mostro neste post.
Programação do PCF8574 com Arduino
Usamos a biblioteca Wire (já inclusa na IDE) para comunicação do Arduino Uno com o PCF8574 utilizando a interface I2C. Dentro do loop, verificamos se o botão foi pressionado, o que incrementa a variável contador.
Essa variável é depois testada pelo SWITCH/CASE, que envia então para a sub-rotina transmissao() um valor (em decimal) correspondente à saída que deve ser acionada: 1(saída P0), 2 (P1), 4 (P2), 8 (P3), 16 (P4), 32 (P5), 64 (P6) e 128 (P7). Como no circuito estamos utilizando somente as saídas P0, P1, P4 e P5, os valores serão 1, 2, 16 e 32, respectivamente.
//Programa: PCF8574 com Arduino //Autor: Arduino e Cia #include <Wire.h> #define pino_botao 3 int contador = 1; void setup() { Serial.begin(9600); pinMode(pino_botao, INPUT); Wire.begin(); Serial.println("Acionando portas do PCF8574"); } void loop() { int valor = digitalRead(pino_botao); if (valor == 0) { contador++; Serial.print("Contador: "); Serial.println(contador); while (digitalRead(pino_botao) == 0) { delay(100); } } switch (contador) { case 1: //Aciona a porta P0 transmissao(1); break; case 2: //Aciona a porta P1 transmissao(2); break; case 3: //Aciona a porta P4 transmissao(16); break; case 4: //Aciona a porta P5 transmissao(32); break; } if (contador >= 4) { contador = 0; } } void transmissao(byte val) { //Inicia a transmissao para o PCF8574 endereço 32 Wire.beginTransmission(32); Wire.write(0); //Envia dados pela interface I2C Wire.endTransmission(); //Fim da transmissao Wire.beginTransmission(32); Wire.write(val); Wire.endTransmission(); }
Como estamos falando de um CI com saída de 8 bits, você pode substituir o valor em decimal pelo valor binário, simplesmente fazendo a conversão. Assim teremos a seguinte relação:
- P0: 1 (decimal) => 00000001 (binário)
- P1: 2 (decimal) => 00000010 (binário)
- P4: 16 (decimal) => 00010000 (binário)
- P5: 32 (decimal) => 00100000 (binário)
Para usar esse valor em binário no programa, por exemplo na porta P0, altere a linha 36 do programa para:
transmissao(B00000001);
Usando o valor em binário, podemos ver com mais clareza como funciona o processo de acionamento das portas no PCF8574.
Gostou? Confira outros posts com comunicação I2C e PCF8574 aqui mesmo no Arduino e Cia!
Muito bacana! No Aliexpress há um módulo para esse IC, será que é melhor? https://goo.gl/ryDJqL
Oi Fabio,
Obrigado pela dica. Tudo vai depender da aplicação, mas essa placa sem dúvida facilita na hora de conectar vários PCF8574 e também a seleção de endereço.
Abraço!
Adilson
como faço pra ler um valor de um sensor q esta conectado no PCF8574?
Oi Argerio ! Ainda nao fiz meus testes, mas pelo que entendi no texto, atraves PCF8574 so eh possivel fazer leituras ou comandos do tipo BOOLEANO, isto é, VERDADEIRO/TRUE=1 ou FALSO/FALSE=1. Serve para saber de uma porta/janela/botao esta fechado(1) ou aberto (0), ou para ligar(1) ou desligar(0) um lampada/rele em cada porta. Vi em outro artigo que NAO PODE trabalhar como leitura e escrita ao mesmo tempo, mas nao vi explicao de como mudar isso, se eh apenas pela forma de usar as funcoes ou outra configuracao. segue ou artigo que tem exemplo de leitura e escrita mas em dois chips diferentes [ http://labdegaragem.com/profiles/blogs/tutorial-sobre-pcf8574-e-como-utiliz-lo-com-arduino ] [ ]´s
não funciona o link
o endereço do link vai até "arduino" apague o que tiver depois
Boa tarde, aqui na minha cidade não consegui achar a placa PCF8574 mas achei a PCF8566 que possui bem mais entradas. Daria certo também? Acredito que se a resposta for sim, ampliaria ainda mais as possibilidades. O céu é o limite kkk!
Primeiro meus parabéns!!! Agora, a pergunta: qual a diferença entre o pcf8574 e o 74hc595???
Bom dia,
Os dois podem ser chamados de expansores de porta, basicamente tem a mesma função, e alguns preferem trabalhar com os registradores de deslocamento (shift register) como o 74HC595 e outros com os expansores I2C, como o PCF8574. A comunicação via I2C é um pouco mais lenta, e isso pode interferir no seu projeto, mas usa apenas 2 pinos do microcontrolador. Eu particularmente prefiro usar I2C, mas vai depender do seu projeto.
Abraço e obrigado! 🙂
Adilson
Boa tarde, é possível controlar (ler) push buttons com este CI? Obrigado!!
Oi Igor,
É possível sim. Eu ainda não tenho nenhum post sobre isso, mas recomendo este aqui do Instructables: https://www.instructables.com/id/PCF8574-i2c-Digital-IO-Expander-Fast-Easy-Usage/
Abraço!
Adilson