/*

Pessoal, to precisando de ajuda:
Sensor de Luminosidade usando 3 CIs 4051 (multiplexador),
sendo um mestre (master) e os dois seguintes os escravos (slaves).

O problema é que ele parece não estar fazendo as leituras corretamente, porque repete o mesmo valor 8 vezes, depois mais 8 e assim por diante. Parece que está lendo um sensor e atribuindo o mesmo valor aos outros.

Se alguem puder ajudar, fico grato.

Depois coloco o esquema de ligaćão, outra coisinha que deu trabalho, mas saiu.

Adaptado de:
http://www.arduino.cc/es_old/Tutoriales/74HC4051
e
http://playground.arduino.cc/Learning/4051
*/


int t = 200;
// Declara tempo de delay.
int m0 = 2;
int m1 = 3;
int m2 = 4;
// Pinos de enderacamento do master.
int s0 = 5;
int s1 = 6;
int s2 = 7;
// Pinos de enderacamento do slave.
int slave;
// Declara a variavel slave que vai ser utilizada so pra sabermos qual CI estamos lendo.
int LED;
// Declara a variavel LED
int y;
// Declara o numero do pino do multiplexador.
void setup()
{
Serial.begin(9600);
pinMode(m0, OUTPUT);
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
// Declara os pinos master e slave como saidas.
for (LED=30; LED<=45; LED++)
pinMode(LED, OUTPUT);
// Declara os pinos 30 a 45 como saida para os LEDs.
}

void loop()
{

for (int LED=30; LED<=45; LED++)
{
digitalWrite(LED, HIGH);
delay(t/10);
digitalWrite(LED, LOW);
delay(1);
}
LED--;
for (int LED=44; LED>=30; LED--)
{
digitalWrite(LED, HIGH);
delay(t/10);

digitalWrite(LED, LOW);
delay(1);
}
// Um simples blink para saber quando comeca a sequenci de leitura dos LDRs.
digitalWrite(m0,LOW);
digitalWrite(m1,LOW);
digitalWrite(m2,LOW);
{
slave = 1;
for (y=0;y<8;y++)
{
switch (y)
{
case 0:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED = 30;
break;
case 1:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED++;
break;
case 2:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 3:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 4:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);
LED++;
break;
case 5:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);

LED++;
break;
case 6:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
case 7:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
}
Serial.print("Valor de slave ");
Serial.print(slave);
Serial.print("-");
Serial.print(y);
Serial.print(" = ");
Serial.println(analogRead(0));
analogWrite(LED, analogRead(0));
delay(t);
}
digitalWrite(m0,HIGH);
digitalWrite(m1,LOW);
digitalWrite(m2,LOW);
{
slave = 2;
for (y=0;y<8;y++)
{
switch (y)
{
case 0:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED = 38;
break;
case 1:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED++;
break;
case 2:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 3:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 4:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);
LED++;
break;
case 5:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);
LED++;
break;
case 6:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
case 7:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
}
Serial.print("Valor de slave ");
Serial.print(slave);
Serial.print("-");
Serial.print(y);
Serial.print(" = ");
Serial.println(analogRead(0));
analogWrite(LED, analogRead(0));
delay(t);
}
}
}
}

Exibições: 434

Responder esta

Respostas a este tópico

Como no programa anterior, você tem uma sequencia numérica binária que podes gerar com o FOR. No caso, os 3bits menos significativos de um Byte. Podes usar este recurso para "escrever" o binário porta digital.

Isso elimina todos esses Cases.

http://garagelab.com/profiles/blogs/tutorial-4051-mux-demux-with-ar...

Tem algum motivo para você não usar dois pinos analógicos? Assim não precisaria usar três chips e usaria apenas dois?
Se tiver disponível apenas um pino analógico, ainda pode usar o pino 6 do 4051 com um resistor de pull-up, precisando utilizar apenas cinco pinos digitais.

É que na verdade preciso aprender como programar isso aí. Sou daqueles chatos que gostam de entender como funciona ^- ^ porque se pegar um código pronto, resolvo o problema agora, mas e depois quando aparecer um problema diferente? Se entender como programar 64 sensores analogicos no I2C, posso resolver o que vier. 

Já achei dois erros, que faziam minhas leituras serem sempre zero: primeiro que tava usando os pinos 13 e 14 do master pros slaves 1 e 2, quando o correto seriam os pinos 12 e 13.

Segundo, não sei por qual designio dos deuses, o I2C master parece que reserva pra si mesmo o valor zero, entao tem que usar o valor 1 pro slave 1 e 2 para slave 2, assim:

slave 1:

digitalWrite(m0,HIGH);
digitalWrite(m1,LOW);
digitalWrite(m2,LOW);

(não mais LOW-LOW-LOW)

slave 2: 

digitalWrite(m0,LOW);
digitalWrite(m1,HIGH);
digitalWrite(m2,LOW);

Segundo essa lógica (mesmo que eu esteja errado), não seria possível usar 8 expansores, e sim apenas 7, porque se o valor ZERO (LOW-LOW-LOW) está reservado ao master, e se o maior valor = 7 (HIGH-HIGH-HIGH = 1 + 2 + 4), então não seriam possiveis 64 sensores, e sim "apenas" 56. Mesmo assim, um belo upgrade no Arduino. 

O Mega, que eu tenho aqui, tem 51 digitais e 15 analogicos. Se preciso de 6 digitais e 1 analogico pra ligar 54 sensores (e não 64, como diz o site www.arduino.cc), ainda assim seriam 448 sensores!

O 4051 não usa I2C, ele é um chip comum, você viu no datasheet que o pino de sinal 0 é o 13, o sinal 1 é o 14 e o sinal 2 é o 15?
Quando você faz 100, você está endereçando o pino de sinal 1 (PINO 14)...

Pensei que fosse I2C, valeu a dica.

Quanto aos pinos, tava usando o enderecamento certo do datasheet: 

13 = y0 = 0-0-0

14 = y1 = 1-0-0

15 = y2 = 0-2-0

12 = y3 = 1-2-0

Mas só funcionou  quando mudei os pinos 13 e 14 para 12 e 13, respectivamente. Vou checar de novo, posso estar me confundindo em alguma coisa, por inexperiencia mesmo.

Figure 1. Pin connection#(!..%,3)./54#/-#(!..%,3)./54).(6%%6336$$#(!..%,3)./54!"#3

Código atualizado:

/*
Sensor de Luminosidade usando 3 CIs 4051 (multiplexador),
sendo um mestre (master) e os dois seguintes os escravos (slaves).
Adaptado de:
http://www.arduino.cc/es_old/Tutoriales/74HC4051
e
http://playground.arduino.cc/Learning/4051
*/

#include <Wire.h>
int t = 500;
// Declara tempo de delay.
int m0 = 2;
int m1 = 3;
int m2 = 4;
// Pinos de enderacamento do master.
int s0 = 5;
int s1 = 6;
int s2 = 7;
// Pinos de enderacamento do slave.
int slave;
// Declara a variavel slave que vai ser utilizada so pra sabermos qual CI estamos lendo.
int LED;
// Declara a variavel LED
int y;
// Declara o numero do pino do multiplexador.
void setup()
{
Serial.begin(9600);
pinMode(m0, OUTPUT);
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
// Declara os pinos master e slave como saidas.
for (LED=30; LED<=45; LED++)
pinMode(LED, OUTPUT);
// Declara os pinos 30 a 45 como saida para os LEDs.
}

void loop()
{

for (int LED=30; LED<=45; LED++)
{
digitalWrite(LED, HIGH);
delay(t/10);
digitalWrite(LED, LOW);
delay(1);
}
LED--;
for (int LED=44; LED>=30; LED--)
{
digitalWrite(LED, HIGH);
delay(t/10);

digitalWrite(LED, LOW);
delay(1);
}
// Um simples blink para saber quando comeca a sequencia de leitura dos LDRs.

digitalWrite(m0,LOW);
digitalWrite(m1,LOW);
digitalWrite(m2,LOW);

{
slave = 1;
for (y=0;y<8;y++)
{
switch (y)
{
case 0:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED = 30;
break;
case 1:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED++;
break;
case 2:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 3:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 4:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);
LED++;
break;
case 5:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);

LED++;
break;
case 6:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
case 7:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
}
Serial.print("Valor de slave ");
Serial.print(slave);
Serial.print("-");
Serial.print(y);
Serial.print(" = ");
Serial.println(analogRead(A0));
analogWrite(LED, (analogRead(A0)));
delay(t);
}
digitalWrite(m0,LOW);
digitalWrite(m1,LOW);
digitalWrite(m2,LOW);
{
slave = 2;
for (y=0;y<8;y++)
{
switch (y)
{
case 0:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED = 38;
break;
case 1:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,LOW);
LED++;
break;
case 2:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 3:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,LOW);
LED++;
break;
case 4:
digitalWrite(s0,LOW);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);
LED++;
break;
case 5:
digitalWrite(s0,HIGH);
digitalWrite(s1,LOW);
digitalWrite(s2,HIGH);
LED++;
break;
case 6:
digitalWrite(s0,LOW);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
case 7:
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
digitalWrite(s2,HIGH);
LED++;
break;
}
Serial.print("Valor de slave ");
Serial.print(slave);
Serial.print("-");
Serial.print(y);
Serial.print(" = ");
Serial.println((analogRead(A0)));
analogWrite(LED, (analogRead(A0)));
delay(t);
}
}
}
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço