Trabalhando com o expansor de portas PCF8574-AP para criar uma hierarquia deles

Pessoal, estou tentando entender o PCF8574, e minha intenção é colocar um deles no arduino e debaixo do PCF8574 "pai", colocar mais PCF8574 "filhos" e talvez PCF8574 "netos"... quero fazer uma hierarquia de PCF8574´s!!! 

Desta forma o CI "pai" teria 8 filhos e cada filho teria mais 8 filhos, logo o pai teria 64 netos com 8 portas cada um, ou seja um arduino com 2 portas transformadas em (64*8=) 512 portas... razoável né?

Quero entender bem esse expansor para meus próximos projetos.

Segui um tutorial aqui do LdG e adaptei o PCF8574 fazendo-o ascender 8 LED´s usando 2 portas do arduino, a A5 e A4.

 

Agora... como eu faria pra ligar um novo PCF8574 "filho" na porta P1 (ou P2...etc) do PCF8574 "pai"? Como enviar comando para a porta P3 (ex.) do filho para ascender um LED? 

 

Adicionei as imagens pra ilustrar melhor... do jeito que está, funciona.

Eis o código do bicho:

#include <Wire.h>
void setup()
{
 Serial.begin(9600); 
 Wire.begin();
}
void loop()
{
  int y = 1;
  while(y <= 128){
  ascender(y);
  y=y*2;
  }
 ascender(0);
 delay(1000);
}

void ascender(int led){
 Wire.beginTransmission(56); //Iniciar a transmissão
 //Enviar os dados pro PCF8574-AP
 Wire.write(led);
 Serial.println(led);
 Wire.endTransmission(); //Finalizar a transmissão
 delay(100);
}

 

Exibições: 944

Anexos

Responder esta

Respostas a este tópico

Você não precisa de PAI -> FILHO, você está usando o protocolo I2C, no mesmo barramento você pode usar vários deles.

Um deles é esse que você está usando agora "endereço" 56, A = 0, B = 0, C = 0 pelo que entendi, se você colocar os os pinos de endereço como A = 1, B = 0, C = 0  (001) você terá o endereço 57, e assim sucessivamente, podendo ter até 7 deles no mesmo BUS.

Marcelo, entendi a teoria... mas agora fiquei na duvida de como implementar isso... pode me ajudar?

O pino A5 está no C1:P14 e o A4 está no C1:P15... devo ligá-los invertido no C2 (segundo CI) ou ponho o A5 e A4 nas mesmas portas que coloquei no C1 ?

Desta forma no código devo instanciar os comandos no C2 assim : 

Wire.beginTransmission(56);

Wire.send(1);

E ao C1 assim:

Wire.beginTransmission(57);

Wire.send(1);

Não entendi bem o conceito de 7 CI no máximo... A,B,C = 0 ? Não quero ficar de alugando e se tiver links, são mais fácies, ok... 

Muito obrigado até agora!!!

 

Correção.

1. Eu me enganei quando coloquei que era no máximo 7 chips como tem 3 bits para definir o endereço você pode ter 8 chips.

2. Antes em vez de usar A1, A2, A3 eu usei A, B, C, como os pinos de definição de endereço

Pelo que entendi desse chip é assim,

Quando os PINOS A0 = 0, A1 = 0, A2 = 0 você está fazendo ele ter o endereço 56, se você no segundo chip colocar A0 = 1, A1 = 0, A2 = 0, esse terá o endereço 57.
Não tem como "cascatear" o protocolo I2C, todos os 8 chips, tem que ter ligado o pino CIn:P14 ao A4 e o pino CIn:P15 ai A5.

Dá uma lida no tutorial sobre o PCF8574, que acho que vai ficar mais claro.


http://labdegaragem.com/profiles/blogs/tutorial-sobre-pcf8574-e-com...

 

Marcelo, obrigado pela ajuda... acho que resolvi... devo ter feito o post no momento que vc digitava...

Obrigado pela atenção

Marcelo, passei algumas horas ontem a noite procurando entender os ABCs e esse conceito de BUS... consegui.

Coloquei 2 PCFs e os fiz interagir com os LED´s...

Aos que leram minha dúvida deste tópico, o problema inicial foi na montagem dos chips, pois as letras ABC são referente à pinagem do chip onde A se for 0, deve ser ligado no GRN e se for = 1 deve ser ligado no Vcc, desta forma o chip pode ser identificado pelo Arduino que envia o comando pro pinos de cada um respectivamente.

Assim se vc tiver um PCF8574 (tipo AP) e ligar os 3 primeiros (veja o datasheet http://www.littlediode.com/datasheets/pdf/Datasheets-PCF/PCF8574.PDF ) pinos no GRN, vc terá A=0, B=0 e C=0 ! Assim vc vai iniciar a transmissão de dados pelo byte 56 (modelos AP, se não 36!) sendo:

Wire.beginTransmission(56);

Wire.write(128);
Wire.endTransmission();

Se vc ligar o pino A no Vcc, terá A=1, B=0, C=0, assim o numero do chip será 57 conforme datasheet.

O numero 128, deve ser interpretado por vc como binário, sendo assim vc "verá" qual a porta que receberá energia, liberando pro seu LED(ou seilá o que) 

Depois vou postar as funções pra facilitar a vida ao controlar as portas expandidas, que é esse o objetivo de implementar esse chip no circuito todo né!

Legal, você pegou a idéia.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço