Tutorial sobre PCF8574 e como utilizá-lo com Arduino

 

Adquira estes componentes na Loja do Lab de Garagem

O circuito integrado PCF8574 é um expansor de portas entradas/saídas de 8bits por interface de comunicação I2C(apenas duas portas: serial clock(SCL) e serial data(SDA)). Com ele é possível expandir as portas de um microcontrolador utilizando apenas essas duas portas para 8 portas. Se utiliza endereçamento para se comunicar com os dispositivos conectados a ele. E uma alimentação de 2.5V a 6V.

 

Olhando o datasheet podemos ver a pinagem do PCF8574:

Onde: A0,A1,A2 são o pinos de endereçamento

            P0,P1,P2,P3,P4,P5,P6,P7 são as saídas em bits(cada um é um bit)

            SDA,SCL são as entradas de comunicação com o microcontrolador.

 

Para fazê-lo funcionar é necessário determinar o endereçamento do pcf8574, novamente no datasheet podemos ver quais endereçamentos são disponíveis:

onde: L significa LOW ou 0V(GND)

           H significa HIGH ou VCC

 

Cuidado!! O PCF8574 que foi usado neste exemplo foi o PCF8574 (sem letra no final). O PCF8574, o PCF8574N e o PCF8574P tem o mesmo endereçamento (32). Agora, o PCF8574A e o PCF8574AP começam com o endereço 56!


Vendo a definição de interface do PCF8574 no datasheet, podemos ver como este funciona:

De acordo com o endereçamento que foi determinado, o PCF8574 vai receber ou mandar a informação de acordo com o valor no I/O data bus. Como cada pino é um bit(valor binário) então o PCF tem um total de 255 de entrada ou saída.
Por exemplo: Se o PCF8574 estiver como receptor de dados, este vai receber o valor 32 pelos SDA e SCL  e jogar na saída este valor em binário, ativando apenas o P5 em HIGH.
Se for o valor 48, o PCF8574 vai ativar os pinos P5 e P4 ao mesmo tempo. Isto é, o PCF8574 manda de uma vez o valor que foi recebido.
Agora se o PCF8574 estiver como emissor de dados, é simplesmente o contrário.
Detalhe que o PCF8574 pode ser emissor e receptor, isto depende da montagem e da programação utilizada no microcontrolador. Mas não pode ser utilizado como emissor e receptor ao mesmo tempo!
Agora vamos para a parte prática, utilizando o Arduino, dois PCF8574 conectado a ele e uns leds:
O PCF8574 da esquerda será o receptor, que receberá os comandos e acenderá os leds e o PCF8574 da direita será o emissor e se um botão for apertado, acenderá um led.
O código para o Arduino é este:

#include <Wire.h>

byte x=0;
byte y=0;

void setup()
{
Wire.begin();
}

void loop()
{
Wire.requestFrom(33,1);       //Se PCF8574A - mude de 33 para 57 
if(Wire.available())     //If the request is available
{
x=Wire.receive();       //Receive the data
}
if(x<255)                     //If the data is less than 255
{
if (x==254) { y = 0; } //P0
if (x==253) { y = 2; } //P1
if (x==247) { y = 8; } //P3
if (x==251) { y = 4; } //P2
}                                               //Se PCF8574A mude 32 para 56
Wire.beginTransmission(32);     //Begin the transmission to PCF8574 
Wire.send(y);                                //Send the data to PCF8574
Wire.endTransmission();            //End the Transmission
}

Na programação, quando um botão for apertado, o PCF8574, com o endereço 33, irá mandar o dado para o Arduino, o Arduino irá receber, converter e depois mandará o dado para o PCF com endereço 32. E pronto!

Esperamos que tenham gostado! Boa sorte e boa diversão!

Referências:

http://arduino.cc/en/Reference/Wire

http://www.datasheetcatalog.org/datasheet2/b/0fjjhr6h643gldhx3o1rgk...

Exibições: 45447

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de carlos alito cavalcante de sousa em 13 junho 2015 às 12:05

Bom dia Carlos Furtado.

Para comunicar certinho os PCF de INPUT e OUTPUT você pode fazer assim:

Quanto as variáveis:

byte RecebePCF=0;
byte EnviaPCF=B00000000;

byte estadoAntigo = B11111111;

//Para ler o que foi clicado (INPUT)

Wire.requestFrom(33,1); //Se PCF8574A - mude de 33 para 57
if(Wire.available()) //Se existir algo para ler...
{
RecebePCF=Wire.read(); //Recebe os dados do PCF...

if (RecebePCF != 255) {

if (RecebePCF == 239){ //led1
EnviaPCF = B00000001; //endereço hexadecimal de cada entrada do pcf...
}

if (RecebePCF == 223){ //led2
EnviaPCF = B00000010;
}

if (RecebePCF == 254){ //led3
EnviaPCF = B00000100;
}

if (RecebePCF == 253){ //led4
EnviaPCF = B00001000;
}

if (RecebePCF == 251){ //led5
EnviaPCF = B00010000;
}

}
}

//Agora você deve mandar a informação para o PCF OUTPUT onde devem estar ligado os leds já com filtro e tudo que não interfira no acendimento parcial dos mesmos...

//Você testa se o botão não é o mesmo já clicado para não ficar gastando memória "atoa"

if (estadoAntigo != EnviaPCF) {

 //32 é o meu endereço no PCF de saída (com as portas de A0 a A2 em LOW - Veja o ADDRESS REFERENCE no post que ele mostra todos os endereços que podem ser setados.)
Wire.beginTransmission(32);
Wire.write(EnviaPCF);
Wire.endTransmission();
}

caso queira apagar todos os leds para um "estado inicial" você manda o comando:

//Apagando leds...
EnviaPCF = B00000000;
estadoAntigo = EnviaPCF;
Wire.beginTransmission(32);
Wire.write(EnviaPCF);
Wire.endTransmission();

Comentário de Carlos Furtado Barata em 13 junho 2015 às 7:11

Bom dia a todos, Carlos vc conseguiu fazer o controle dos led's com o PCF8574, tipo ligar e desligar os led's através de botões, se vc conseguiu vc poderia postar o código estou tentando aqui mas estou pegando uma surra rsrsrs. 

Comentário de Rafilsk em 27 maio 2015 às 7:59
Valeu Carlos
Comentário de carlos alito cavalcante de sousa em 27 maio 2015 às 7:18
Eu tenho aqui rodando uma aplicação com 4 pcfs funfando direitinho. Basta fazer a coisa certa e ler/enviar as os bits em seu tempo certo para fazer a sincronia correta
Comentário de carlos alito cavalcante de sousa em 27 maio 2015 às 7:15
Rafilsk sua dúvida se resolve juntando se não me engano até 8 chips e conectandos todos a porta i2c normalmente e mudando os endereços em cada, para que esses sejam únicos, atraves dos inputs A0 até A2... na hora de receber/enviar dado vc chama o endereço em HEX e lê ou envia o que desejar, se usar um lcd por exemplo, vc referência normalmente o endereço na biblioteca i2c do lcd
Comentário de Rafilsk em 27 maio 2015 às 3:03

Bom dia srs estou precisando usar mais portas ainda como ficaria os enderecamentos pra 2 PCF8574 nesse caso

Comentário de Eduardo Pinheiro da Silva em 31 julho 2014 às 14:34

Consegui simular os PCF8574 no ISIS, porém com algumas limitações. . . 
Devido a ele não tem os pinos de +VCC e GND a sua output fica em 'tri-sate' (nem 0, e nem 1) e com o multimetro mede 2,5V.
Mas apenas para testar a lógica do software já está ótimo. Agora só falta implementar na prática;

Comentário de Eduardo Pinheiro da Silva em 30 julho 2014 às 10:11

Verdade Wiechert, A simulação as vezes não é perfeita. . . Eu aproveito muito a simulação, porque no trabalho pega mal eu ficar montando uma protoboard hehehe . .. Vão achar meio estranho! Já comprei este C.I to esperando chegar.

Mas obg pelas dicas . . .

Comentário de Wiechert em 30 julho 2014 às 0:55

Tem horas que é preciso deixar o simulador de lado e implementar os testes no mundo real... Não existe simulador perfeito.

Comentário de Eduardo Pinheiro da Silva em 30 julho 2014 às 0:31

Wiechert,

Realmente, eu não tinha visto, porém fiz tudo conforme vc mencionou e ainda não funciona... Rodei um programinha que scaneia quais dispositivos estão conectados na I2C e informa o endereço na serial e isso funcionou, porém a aplicação (acionamento simples de leds) não funcionou. . . Sabe me dizer se tem algo a mais que possa limitar essa simulação?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço