chip 74hc4051

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

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]

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

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..

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

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);
}

Brunello:
ok, stai andando "quasi" bene

questo e' il collegamento che penso tu abbia fatto

[

:grinning: :grinning: :grinning:
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..

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

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?

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

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:

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

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

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

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

va beh, farò separato, per non aver problemi.. grazie per il momento :wink:

Non è che mi pare molto complicato fare una serie di IF

int potenziometro[24] ;
byte i = 0;

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

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

[/quote]

a questa non ci sarei mai arrivato..
int controlChange = 176; // Control-Change MIDI canale 1

//multiplexer analogico (A0-A1)
int potenziometro[16];
int controller[16];
int controllerAlt[16];

int i = 0;

//potenziometro esterno (A2)
 int controllerNumero = 36;
 int controller2 = 0;
 int controllerAlt2 = 0;
 int poti = 0;


//pin digitali Multiplexer (5-6-7)
int bit1 = 0;
int bit2 = 0;
int bit3 = 0;


//multiplexer pulsanti (3-4)
int pulsante[16];
int a = 0;


//sensore prossimita
int triggerPin = 8;
int echoPin = 9;

void setup() {
 //Select-Pins 4051s potenziometri e pulsanti
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);

//
 pinMode (pulsante, INPUT);
 
//Sensore prossimita
 pinMode(8, OUTPUT); //Trigger 
 pinMode(9, INPUT); //Echo 
 
 Serial.begin(9600);
}

void loop() {


//potenziometro esterno
 poti = analogRead(A2);
 controller2 = map(poti,0,1023,0,127);

 if (controller2 != controllerAlt2) {
  Serial.write(controlChange);
  Serial.write(controllerNumero);
  Serial.write(controller2);

  controllerAlt2 = controller2;
 
 }
  // multiplexer analogico A0 A1
  for (i = 0; i <= 7; i++) {
  bit1 = bitRead(i,0);
  bit2 = bitRead(i,1);
  bit3 = bitRead(i,2);

  digitalWrite(4, bit1);
  digitalWrite(5, bit2);
  digitalWrite(6, bit3);

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

void multiPot(int contatore,int analogPin) {
  potenziometro[contatore] = 0.2 * potenziometro[contatore] + 0.8 * analogRead(analogPin);
  controller[contatore] = map (potenziometro[contatore],0,1023,0,127);
  if  (controller[contatore] != controllerAlt[contatore]); {
    sendeMIDI(controlChange, (20+contatore), controller[contatore]);
    controllerAlt[contatore] = controller[contatore];
  }
}

void sendeMIDI(int statusByte,int dataByte1, int dataByte2) {
  Serial.write(statusByte);
  Serial.write(dataByte1);
  Serial.write(dataByte2);

}


  for (a = 0; a <= 31; a++) {
  bit1 = bitRead(a,0);
  bit2 = bitRead(a,1);
  bit3 = bitRead(a,2);

  digitalWrite(4, bit1);
  digitalWrite(5, bit2);
  digitalWrite(6, bit3);
  if (a >= 16 ) {
  pulsante[a] = digitalRead (2);
  
  multiPul(a,2);
  multiPul(a+24,3);
 }
}

void multiPul(int contatore,int digitalPin) {
  pulsante[contatore] = 0.2 * pulsante[contatore] + 0.8 * digitalRead(digitalPin);
  controller[contatore] = map (pulsante[contatore],0,1023,0,127);
  sendeMIDI(controlChange, (40+contatore), controller[contatore]);
  controllerAlt[contatore] = controller[contatore];
  
}

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

forse ho fatto una scemata..
in poche parole ho usato 4 multiplexer 4051 con gli stessi 3 pin digitali (fin qui nella norma)
il farro è che 2 multiplexer li ho usati per dei pulsanti e ora il codice non riesco a farlo andare in questa parte qui

  for (a = 0; a <= 31; a++) {
  bit1 = bitRead(a,0);
  bit2 = bitRead(a,1);
  bit3 = bitRead(a,2);

  digitalWrite(4, bit1);
  digitalWrite(5, bit2);
  digitalWrite(6, bit3);
  if (a >= 16 ) {
  pulsante[a] = digitalRead (2);
  
  multiPul(a,2);
  multiPul(a+24,3);
 }
}

void multiPul(int contatore,int digitalPin) {
  pulsante[contatore] = 0.2 * pulsante[contatore] + 0.8 * digitalRead(digitalPin);
  controller[contatore] = map (pulsante[contatore],0,1023,0,127);
  sendeMIDI(controlChange, (40+contatore), controller[contatore]);
  controllerAlt[contatore] = controller[contatore];
  
}

senza questa parte funziona tutto.. mi potreste aiutare?
son sicuro che questo codice servirà anche ad altri utenti "italiani" che come me non ne sanno quasi niente, anzi diciamo pure niente!!

scusate gli errori di ortografia e vocabolario automatico..

il 4051 non è il massimo per scansionare dei pulsanti....

guarda il 74165.

lo so che non è il massimo, solo che ho visto che puo funzionare lo stesso dato che in corso d'0pera ho cambiato progetto e non posso smontare tutto di nuovo, per questo mi serviva sapere come fare per usare il codice di questo multiplexer con i pulsanti..

nessuno riesce ad aiutarmi?

E come no...
solo che non ho capito bene cosa vuoi fare ... e come lo stai facendo

in poche parole ho usato 4 multiplexer 4051 per usare 32 potenziometri, pero in corso d'opera ho deciso di usare solo 16 potenziometri e altrettanti pulsanti.. vorrei saper ora come devo fare il codice per usarte i pulsanti con i multiplexer 4051 dato che è già tutto montato..
grazie..

perchè non metti tutto lo sketch, cosi' forse riusciamo a capirci qualcosa