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 Silvio Cavalcante em 15 julho 2013 às 23:01

Olá Carlos eu usei um CI uln2004 para fazer o driver, mas você pode usar um transistor NPN Ex. BC337 devidamente polarizado

até +

Comentário de carlos alito cavalcante de sousa em 13 julho 2013 às 17:55

Alguém já conseguiu ligar uma bobina de um relé na saída do pcf8574? se sim como?

Comentário de João Pedro em 13 julho 2013 às 17:54

Funciona com pinos pwm também??

Comentário de Luiz Ernesto Szczerbowski em 13 julho 2013 às 0:34

Olá companheiros de Garagem. Montei o circuito e rodei o programa do colega Luiz Roberto, o qual funcionou perfeitamente, só que os leds acendiam muito fracos. Após pesquisar, descobri um fato elementar: o PCF 8547 atuando como fonte de corrente ("sourcing") só consegue fornecer 0,1 mA, ao passo que como dreno de corrente (current sink) pode "drenar" 20 mA. Ou seja, para acionar um LCD ou outro circuito lógio, pode funcionar assim, mas para acender um led, acionar um acoplador ótico ou um relê, será preciso inverter a lógica: ligar o anodo do led no +V e o cátodo no chip. Aí o led acenderia com o nível baixo no pino.

Outra recomendação que vi é ligar o pino 13 (INT) do PCF 8547 ao +V para aumentar a estabilidade.

Pretendo aproveitar este tutorial para construir um módulo com um display LCD e um teclado com 5 teclas: Enter, Flecha para cima, Flecha para baixo, Flecha esquerda e Flecha direita para um sistema de menus e utilizar só 2 pinos do Arduino. Algo similar ao que a Adafruit fez com este produto: http://www.adafruit.com/products/714 Só que eles usaram um expansor de 16 bits, MCP23017.

Adaptei este programa para testar o circuito: pisca todos os pinos do chip de saída cada 1 segundo e  lê os pinos do chip de entrada e ecoa no monitor serial.

/* Programa teste para expansor de entrada/saida 8 bits I2C PCF8574AP
 Pisca todos os pinos do chip de saida, alternando HIGH e LOW a cada 1 segundo.
 Lê os pinos do chip de entrada e ecoa no monitor serial.
 Note que como todas as entradas estão ligadas ao +V, enquanto nenhuma tecla for apertada a leitura será 255.
*/
#include <Wire.h>
#define expansorSaida   B0111000  // Endereço do chip de saida
#define expansorEntrada B0111001  // Endereço do chip de entrada
/* Defina o endereço de cada chip assim: B0111 A2 A1 A0
 Por exemplo, se A2, A1 e A0 estão aterrados:  B0111000
 Se A2 e A1 estão aterrados e A0 ligado a Vcc: B0111001
 Isto vale para o PCF8574A e o PCF8574AP, cujo endereçamento começa em 0111000 bin = 56 dec
 No PCF8574 (sem letra, o PCF8574N e o PCF8574P o endereçamento começa em 0100000 bin = 32 dec
*/
void setup() {
  Wire.begin();
  Serial.begin(9600);
} // end setup
void loop() {
  Serial.print("Escrevendo 00000000 ");
  expansorWrite(B00000000);
  Serial.print("Lendo: ");
  Serial.print(expansorRead(), BIN);  // imprime a leitura em binário
  // se quiser a saída em decimal substitua BIN por DEC
  // se quiser a saída em hexa substitua BIN por HEX
  Serial.println();
  delay(1000);
  Serial.print("Escrevendo 11111111 ");
  expansorWrite(B11111111);
  Serial.print("Lendo: ");
  Serial.print(expansorRead(), BIN);
  Serial.println();
  delay(1000);
} // end loop
void expansorWrite(byte _data ) { // função para escrever no chip de saida
  Wire.beginTransmission(expansorSaida);
  Wire.write(_data);
  Wire.endTransmission();
} // end function
byte expansorRead() { // função para ler o chip de entrada
  byte _data;
  Wire.requestFrom(expansorEntrada, 1);
  if(Wire.available()) {
    _data = Wire.read();
  }
  return _data;
} // end function

Comentário de carlos alito cavalcante de sousa em 13 julho 2013 às 0:04

Opa! resolvi é só iniciar y = B00000000; (tudo em low); ou y = B1111111; (tudo em high)

Comentário de carlos alito cavalcante de sousa em 12 julho 2013 às 23:49

Valeu pelo artigo!

Mas tenho uma duvida, uma vez que clico em um botão, o led acende e fica acesso, ok! mas como faço para voltar o estado dos pinos P0-P7 para low novamente? já tentei mandar 0 para o PCF receptor mas não rolou!

Ajuda ai galera!

Comentário de Rodrigo José Araújo em 4 julho 2013 às 10:58

Amigos do Laboratorio de Garagem, seria possivel disponibiliar um diagrama de como ligar este Ci em um display lcd, de forma que eu possa usar este Ci para comtrolar o lcd. ( no video da loja vcs estão usando um lcd.)

 

Comentário de Isaac Nunes de Oliveira em 1 janeiro 2013 às 19:14

Os botões se ligal ao GND mesmo? Posso ligar com o VCC e resistores pullDown?

Comentário de Isaac Nunes de Oliveira em 1 janeiro 2013 às 19:14

Os botões se ligal ao GND mesmo? Posso ligar com o VCC e resistores pullDown?

Comentário de Ademir Fontana em 25 agosto 2012 às 12:49

Não precisa de um resistor de Pull Up nos pinos 14 e 15 do PCF8574 ligando no positivo?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço