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: 45426

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 Luiz Roberto Monti em 25 maio 2012 às 0:19

Boa noite Galera!!!  Montei novamente o circuito na protoboard e desta vez funcionou, exceto o P0, mas ai eu alterei linha if (x==254) { y = 0; } //P0 para if (x==254) { y = 1; } //P0, pois 1 decimal convertido para binário é B00000001; 2 é B00000010; 4 é B00000100;  8 é B00001000; 16 é B00010000; 32 é B00100000; 64 é B01000000 e finalmente 128 é B10000000, desta forma consegue-se acionar uma porta por vez do PCF8574.

Comentário de Virgílio Costa Matos em 24 maio 2012 às 20:46

Essa alteração salvou meu dia, muito bom galera do LAB, muito obrigado

Comentário de Laboratório de Garagem em 24 maio 2012 às 17:57

Galera, reeditamos o tutorial. Por favor, deêm uma olhada na observação destacada em vermelho. A questão central é a mudança de endereçamento. O PCF8574 (sem letra no final), PCF8574N e o PCF8574P usam o endereço a partir do 32. Agora, o PCF8574A e o PCF8574AP usam o endereço a partir do 56.

Valeu galera!

Abraços!

Comentário de Luiz Roberto Monti em 24 maio 2012 às 13:06
Boa tarde senhores! Segui o tutorial para usar a comunicação I2C no LCD e deu certo, apenas tive que alterar o endereço para 38. Neste aqui não deu certo, mesmo fazendo as alterações dos endereços para 56 e 57 em decimal ou 38 e 39 em hexadecimal. Também tive que alterar os comandos Wire.receive para Wire.read e Wire.send para Wire.write e por fim alterar as 4 variáveis a==254, a==253, a==247 e a==251 para x==, pois a IDE, ao fazer o upload, informava que a variável "a" não estava definida no escopo. Feito todas estas alterações não funcionou.
Comentário de Luiz Roberto Monti em 23 maio 2012 às 23:25
Para aqueles que queiram ou necessitem operar circuitos com I2C a longas distâncias visitem o site: http://xj900diversion.free.fr/bus/I2C%20-%20RS-485%20adapter.htm , trata-se de um conversor I2C - RS-485 adapter.
Comentário de Virgílio Costa Matos em 3 maio 2012 às 10:17

Então conectei os pinos de configuração A0 (pin 1), A1 (pin 2) e A2 (pin 3) tudo em LOW (no GND do arduino), liguei os pinos  SDA,SCL nos pinos 4 e 5 do arduino. Liguei o pin 16 no 5v e 8 no GND do arduino.

No código não consegui usar a função Wire.send(value) parece que descontinuaram ela estou tentando com Wire.write(value), estou usando o Arduino Uno. 

Como tudo esta em LOW estou tentando transmitir dados com Wire.beginTransmission(32);

Comentário de Laboratório de Garagem em 2 maio 2012 às 19:17

Virgilio, qual é sua dúvida?? Voce seguiu o tutorial passo a passo?? Voce conectou o o PCF8574 corretamente??

LdG

Comentário de Virgílio Costa Matos em 2 maio 2012 às 18:33

Comprei o expansor de portas PCF8574AP que vende aqui na loja do labdegaragem mas não consegui fazer o mesmo funcionar, alguém que comprou o mesmo produto e teve sucesso?

Comentário de Rafael Melo Cardoso em 25 abril 2012 às 10:36

Parabéns! Muito bom o post!

Comentário de Joe Nova em 22 abril 2012 às 8:59

Parabens ao LDG ! e ao Marcos por ter me spresentado ao PCF8574

abços

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço