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

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 Wiechert em 20 agosto 2012 às 17:11

Obrigado, mas o tutorial não é meu, foi a turma do LDG quem fez...

De qualquer forma, nem sempre a simulação ocorre como deveria.

 

Comentário de Jucelino de Queiroz Barros Junio em 20 agosto 2012 às 17:04

Fiz sim cara, idêntico ao que está na imagem acima do seu tutorial (que está bem descritivo, parabéns!). Porém mesmo após as conversões para que o programa ficasse compatível com o Isis, Wire.requestFrom(0x41,1) e Wire.beginTransmission(0x40), não obtive o resultado esperado. Mas isso foi é só por curiosidade mesmo.

 

Muito obrigado pela atenção!

Comentário de Wiechert em 20 agosto 2012 às 16:57

Voce fez a ligação dos pinos de endereçamento no PCF para o GND de forma a indicar o endereço igual ao que está no sketch?

A tabela agora começa em 40fh para A2,A1,A0 em LOW...

 

Comentário de Jucelino de Queiroz Barros Junio em 20 agosto 2012 às 16:42

Mas tenta tipo um Wire.requestFrom(0x41,1) por exemplo. 

 

Não funciona...

Comentário de Wiechert em 20 agosto 2012 às 16:17

Jucelino, o PCF8574 no ISIS tem o endereço de 40h a 4Fh.

Comentário de Jucelino de Queiroz Barros Junio em 20 agosto 2012 às 16:06

Tentei simular esse tutorial no Isis, mas sem sucesso. Simulei utilizando um PCF8574 e um ATMega328P. 

Eu acho que o endereçamento do PCF é diferente no Isis.

Comentário de Silvio Cavalcante em 29 maio 2012 às 20:39

Olá Marcos muito obrigado pela dica

Comentário de Wiechert em 29 maio 2012 às 1:55

Olá Silvio,

Faz o seguinte, clica na biblioteca CORE, e arraste para a protoboard o IC DIP 8 pins.

Selecione o CI e nas propriedades mude os pinos de 8 para 16.

Agora mude o rótulo do chip para PCF8574.

Pronto!!!!

Comentário de Silvio Cavalcante em 29 maio 2012 às 1:00

Olá estou tentando passar para o fritzing um esquama eletrico com o PCF8574 mas não encontro o desenho do CI alguem poderia me dar uma dica.

  Grato

Comentário de Luiz Roberto Monti em 25 maio 2012 às 0:39

Segue abaixo o código com o acionamento das 8 portas de cada um dos PCF8574.

#include <Wire.h>
byte x=0;
byte y=0;
void setup()
{
Wire.begin();

}
void loop()
{
Wire.requestFrom(57,1);
if(Wire.available())
{
x=Wire.read();
}
if(x<255)
{
if(x==254){y = 1;}; // P0
if(x==253){y = 2;}; // P1
if(x==247){y = 8;}; // P3
if(x==251){y = 4;}; // P2
if(x==239){y = 16;}; // P4
if(x==223){y = 32;}; // P5
if(x==191){y = 64;}; // P6
if(x==127){y = 128;}; // P7
}
Wire.beginTransmission(56);
Wire.write(y);
Wire.endTransmission();
}

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço