Go Down

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

brunello22

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

Code: [Select]


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

ZioZio


Code: [Select]


   }
    if (i >= 8 && i <= 15 ) {
      potenziometro[i] = analogRead (A1);
    }

[/quote]

a questa non ci sarei mai arrivato..

ZioZio

Code: [Select]

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
Code: [Select]


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

ZioZio

scusate gli errori di ortografia e vocabolario automatico..

elpapais

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

guarda il 74165.
www.infoportal.it support at infoportal.it

ZioZio

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

ZioZio

nessuno riesce ad aiutarmi?

brunello22

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

ZioZio

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

brunello22

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

ZioZio

beh in realtà l'ho già postato il 30 settembre.. più su ho messo tutto lo sketch più la parte dove non mi funziona..

brunello22

Non so' che valori tu debba inviare al Midi, però se sono valori ricavati dall'analogico è un conto... se sono ricavati da un pin digitale, che ti dà uno 0 o un 1, mica puoi fare questo

Code: [Select]
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];



ZioZio

hai ragione, quelli sono parametri per un potenziometro ed ho sbagliato, ma la parte precedente è compilata in modo corretto vero? Come posso farlo funzionare con i pulsanti?

brunello22


Quote
ma la parte precedente è compilata in modo corretto vero?
Ni... nel senso che dato che le uscite dei 4051 sono su pin diversi, basta fare
Code: [Select]
for (a = 0; a <= 7; a++) {

dopo ti spiego il perchè


Quote
Come posso farlo funzionare con i pulsanti?
Se dici cosa devi inviare alla pressione di un pulsante, forse ti posso anche aiutare

ZioZio

Vuoi sapere se alla pressione del pulsante deve rimanere acceso e per spegnerlo bisogna schiacciare di nuovo o quando si rilascia si spegne?
Se è questo che vuoi sapere, io ho bisogno della prima, quindi schiacciare 2 volte, 1 acceso 1 spento..
Quindi dato che ho dato il valore "a" non ho bisogno di continuare fino a 32 ma si si inizia da capo?

Go Up