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

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 15 novembro 2015 às 10:25

Carlos Furtado,

A lógica é a mesma, com uma simples diferença. Em contatos NF o PCF responsável pelas entradas irá apresentar sinal nas portas que tiverem dispositivos conectados com saidas 1, então, por exemplos com 4 botões NF o endereço binário que será transmitido será B00001111 então você usa o oposto desse binário como estado inicial  B00000000 (todos leds apagados) se abrir a porta 1 o binário seria B00001110 e você enviaria B00000001 e assim sucessivamente... espero ter ajudado! 

Comentário de Carlos Furtado Barata em 13 novembro 2015 às 6:41

Carlos Alito bom dia,

Consegui fazer os testes e ficou show, porem estou tentando fazer esse programa com uma logica inversa, ou seja, usando contatos fechados quando os mesmos abrirem o led correspondente ao sensor acenda, vc teria como me ajudar nessa programação.

Comentário de Eduardo Pinheiro da Silva em 14 julho 2015 às 15:38

Eu consigo usar ele como entrada ou saída no mesmo e também liberar saída sem interferir na outra usando biblioteca. Se interessar me avise Ilgner.

Comentário de Ilgner Aparecido Becheleni em 14 julho 2015 às 14:26

Olá , como faço um acionamento onde eu consiga acionar sem interferir no estado dos outros pinos já acionados ? Precisarei mapear qual eu já acionei  ?

Comentário de carlos guaru em 30 junho 2015 às 1:02

PESSOAL ESTOU TENTANDO USAR ESTE PROJETO MAIS QUANDO EU COLO E MANDO COMPILAR DA ERRO NA LINHA x=Wire.receive();       //Receive the data

O QUE ESTA ERRADO AI

Comentário de Carlos Furtado Barata em 18 junho 2015 às 12:23

Blz! vou tentar hj que estou com um tempo.

Comentário de carlos alito cavalcante de sousa em 17 junho 2015 às 18:36
Pode ser uma variável numérica também. O importante é testar um anterior com um atual. Tenta ai se não conseguir posso tentar escrever um código.
Comentário de carlos alito cavalcante de sousa em 17 junho 2015 às 18:33
Você cria uma variável de estado para cada saida do Pcf e muda de estado a cada click com o devido debounce ai o push button vai servir como on/off. Tipo vc cria uma variavel booleana pra saida 1 chamada de estado1 e bota ela em false. Quando o hexadecimal for aquele da saida 1 vc faz um SE para o estado, SE false muda pra true e se true muda pra false. Ai ou vc envia o comando pra acionar o led ou vc manda apagar todos e reacender os que deverão estar aceso.
Comentário de Carlos Furtado Barata em 17 junho 2015 às 15:29

Carlos boa tarde, fiz os testes aqui e está funcionando certinho, porém oq eu estou precisando e q quando eu pressione uma vez o botão o led acenda e quando eu pressione outra vez o led apague uma função ON/OFF no mesmo botão teria como me ajudar.

Comentário de Carlos Furtado Barata em 15 junho 2015 às 7:12

Vou testar o código mais tarde quando voltar do trabalho valeu Carlos obrigadão.

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço