Go Down

Topic: chip 74hc4051 (Read 5216 times) previous topic - next topic

uwefed

#15
Jun 20, 2016, 03:15 pm Last Edit: Jun 20, 2016, 03:16 pm by uwefed
Code: [Select]
for ( contatore = 0 ; contatore = 7 ; contatore++ ); {
è doppiamente sbagliato.
Ciao Uwe

ZioZio

Code: [Select]
for ( contatore = 0 ; contatore = 7 ; contatore++ ); {
è doppiamente sbagliato.
quindi?

Cosa dovrebbe fare questo programma? :o


Dove pensi di stare selezionando l'ingresso di interesse del multiplexer?
vorrei capire cosa sto sbagliando o cosa ho mancato di fare

gpb01

Credo che Uwe ti stesse facendo notare che, oltre alla logica, è sbagliata anche la sintassi di quel for ...
.. hai visto nel reference come funziona il FOR ?  Prova a ragionare su cosa hai scritto tu e su come, nel reference, è scritto che funziona e ... vedi se riesci a capire l'errore ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

ZioZio

Credo che Uwe ti stesse facendo notare che, oltre alla logica, è sbagliata anche la sintassi di quel for ...
.. hai visto nel reference come funziona il FOR ?  Prova a ragionare su cosa hai scritto tu e su come, nel reference, è scritto che funziona e ... vedi se riesci a capire l'errore ;)

Guglielmo
quindi oltre ad aver sbagliato a scrivere for che non ci sta proprio, è anche sbagliata la scrittura nella stringa del codice?

SukkoPera

Se i pin 10, 11 e 12 sono quelli che usi per pilotare il multiplexer, e quindi per scegliere l'ingresso da collegare ad A0, va bene la pinMode(), ma dovrai anche farci sopra delle digitalWrite(), altrimenti come credi che capisca il multiplexer quale ingresso ti interessa?

Visto che non mi sembri espertissimo a programmare, mi permetto di insistere: dai un'occhiata ad https://github.com/SukkoPera/Arduplex/blob/master/examples/CD4051/CD4051.ino e dimmi se non ti sembra più semplice da usare.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

ZioZio


questo codice riesco a salvarlo sulla mega solo che non capisco come mai i controller midi non lo vedono


Code: [Select]
int controlChange = 176;

int potiWert[16];
int controllerWert[16];
int controllerWertAlt[16];

int i = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void setup() {
 Serial.begin (9600);

 }

 void loop() {
  for (i = 0; i <= 7; i++) {
    bit1 = bitRead(i,0);
    bit2 = bitRead(i,1);
    bit3 = bitRead(i,2);

    digitalWrite(11, bit1);
    digitalWrite(12, bit2);
    digitalWrite(13, bit3);

    potisAbfragen (i,A0);
    potisAbfragen (i+8,A1);
  }
}

void potisAbfragen(int zaehler, int analogPin) {
   potiWert[zaehler] = 0.2 * potiWert[zaehler] + 0.8 * analogRead(analogPin);
   controllerWert[zaehler] = map(potiWert[zaehler],0,1023,0,127);
   if (controllerWert[zaehler] != controllerWertAlt[zaehler]) {
    sendeMIDI(controlChange, (20+zaehler), controllerWert[zaehler]);
    controllerWertAlt[zaehler] = controllerWert[zaehler];
   } 
}

void sendeMIDI(int statusByte, int dataByte1, int dataByte2) {
    Serial.write(statusByte);
    Serial.write(dataByte1);
    Serial.write(dataByte2);
 
}
/code]

ZioZio

ci ho messo un pochino ma adesso almeno gli 8 potenziometri riesco a farli andare..
bene, qui vi posto il codice..



Code: [Select]

int potenziometro = 0;
int i = 0;


int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void setup() {
 
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 Serial.begin (9600);

 }

 void loop() {
  for (i = 0; i <= 7; i++) {
    bit1 = bitRead(i,0);
    bit2 = bitRead(i,1);
    bit3 = bitRead(i,2);

    digitalWrite(9, bit1);
    digitalWrite(10, bit2);
    digitalWrite(11, bit3);

  potenziometro = analogRead (A0);
  Serial.print (potenziometro);
  Serial.print ("    ");

  }
   
  Serial.println(" ");
  delay (400);

}
/code]

bene a questo punto devo far andare il secondo chip 4051 con il pin A1..
ho fatto tutti i collegamenti, ma non riesco proprio a farlo andare..

mi date qualche informazione o almeno dirmi dove devo guardare perchè non trovo niente in rete che mi spiega come devo fare il codice per metterlo in seriale..

brunello22

ok, stai andando "quasi" bene

questo e' il collegamento che penso tu abbia fatto


questo sketch che ti passo è un esempio di come gestire i due multiplexer, mettendo il valore letto in una matrice

Code: [Select]

int potenziometro[16] ;
byte i = 0;

void setup() {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  Serial.begin (9600);
}

void loop() {
  for (i = 0; i <= 15; i++) {
    digitalWrite(9, bitRead(i, 0));
    digitalWrite(10, bitRead(i, 1));
    digitalWrite(11, bitRead(i, 2));
    if (i >= 8 ) {
      potenziometro[i] = analogRead (A1);
    }
    else {
      potenziometro[i] = analogRead (A0);
    }
    Serial.print (potenziometro[i]);
    Serial.print ("    ");
  }
  Serial.println(" ");
  delay (400);
}




ZioZio

ok, stai andando "quasi" bene

questo e' il collegamento che penso tu abbia fatto

[
:smiley-lol:  :smiley-lol:  :smiley-lol:
grazie, ho capito molte cose da questa sketch.. non avevo pensato ad if\else ed il "i <=15"...

e se devo mettere un altro chip 4051? sempre in seriale o devo fare una cosa a parte?

comunque ho capito che devo rifare i collegamenti che mi sà che c'è qualcosa che non va, infatti usando un altro arduino e altri potenziometri funziona tutto..

grazie sei stato gentilissimo..

brunello22

Quote
e se devo mettere un altro chip 4051? sempre in seriale o devo fare una cosa a parte?
I 4051 non sono messi in seriale, ma in parallelo
Per metterne un'altro lo colleghi sempre in parallelo e usi A2

ZioZio

si giusto in parallelo..
si lo so A2,io dicevo nel codice, mi basta fare "1<=23" ma if\else? o devo usare un altro tipo di codice?

uwefed

Non sono messi in paralello ma ogni 4051 multiplexa un entrata analogica. La selezione delle entrate del 4051 é messo in paralello. Se vuoi puoi usare anche altre 3 Pin di arduino per selezionare indipendentemente il pin del 4051.

Ciao Uwe

ZioZio

ma quindi devo mettere A0 e A1 con 3 pin digitali (diciamo 2,3 e 4) per 2 multiplexa 4051, se ne voglio aggiungere altri 2 per esempio usoA2 e A3 con altri tre pin digitali (diciamo 5,6 e 7) per altri 2 multiplexa 4051 e quindi fare 2 codici separati, oppure posso fare tutto con gli stessi 3 pin digitali (2,3 e 4) per A0 A1 A2 e A3.. in quest' ultimo caso il codice come bisogna scriverlo in questa parte:

Code: [Select]

 if (i >= 8 ) {
      potenziometro[i] = analogRead (A1);
    }
    else {
      potenziometro[i] = analogRead (A0);
    }


per A2 e A3 come bisogna scriverlo?
questo non capisco..

uwefed

ma quindi devo mettere A0 e A1 con 3 pin digitali (diciamo 2,3 e 4) per 2 multiplexa 4051, se ne voglio aggiungere altri 2 per esempio usoA2 e A3 con altri tre pin digitali (diciamo 5,6 e 7) per altri 2 multiplexa 4051 e quindi fare 2 codici separati, oppure posso fare tutto con gli stessi 3 pin digitali (2,3 e 4) per A0 A1 A2 e A3
puoi fare entrambe le cose, come vuoi e come é meglio ( raguppare i 4 4051 in un gruppo o in 2gruppi).

Metti il numero del entrata sui pin 2,3 e 4 e leggi il valore analogico (meglio 2 volte e scarti il primo valore letto perché puó essere sbagliato a causa del cambio entrata del 4051).

Ciao Uwe

ZioZio

va beh, farò separato, per non aver problemi.. grazie per il momento  ;-)

Go Up