Problema scketch con Multiplexer 74hc4067

Buongiorno, come ho scritto nella presentazione mi sono avvicinato a arduino per un progetto musicale.
Ho appreso le basi per il progetto in questione, ovvero la creazione di un controller midi.

Con lo sketch che uso ora riesco tranquillamente ad usare 6 potenziometri, collegati direttamente ad Arduino Uno.

Purtroppo ho bisogno di molti più potenziomentri, almeno 60.

Ho dei multiplexer 74hc4067, nessun problema per il collegamento, ma non posso dire lo stesso per lo sketch.

So di chiedere tanto ma non ho idea da dove iniziare per impostare il multiplexer.
Anche qualche dritta sarebbe una manna dal cielo!

Il codice che uso a 6 potenziometri è questo:

int val = 0; //Our initial pot values. We need one for the first value and a second to test if there has been a change made. This needs to be done for all 3 pots.

int lastVal = 0;

int val2 = 0;

int lastVal2 = 0;

int val3 = 0;

int lastVal3 = 0;

int val4 = 0;

int lastVal4 = 0;

int val5 = 0;

int lastVal5 = 0;

int val6 = 0;

int lastVal6 = 0;

void setup()

{

Serial.begin(9600); // Set the speed of the midi port to the same as we will be using in the Hairless Midi software

}

void loop()

{

val = analogRead(0)/8; // Divide by 8 to get range of 0-127 for midi

if (val != lastVal) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.

{

MIDImessage(176,1,val);} // 176 = CC command (channel 1 control change), 1 = Which Control, val = value read from Potentionmeter 1 NOTE THIS SAYS VAL not VA1 (lowercase of course)

lastVal = val;

val2 = analogRead(1)/8; // Divide by 8 to get range of 0-127 for midi

if (val2 != lastVal2)

{

MIDImessage(176,2,val2);} // 176 = CC command, 2 = Which Control, val = value read from Potentionmeter 2

lastVal2 = val2;

val3 = analogRead(2)/8; // Divide by 8 to get range of 0-127 for midi

if (val3 != lastVal3)

{

MIDImessage(176,3,val3);} // 176 = CC command, 3 = Which Control, val = value read from Potentionmeter 3

lastVal3 = val3;

val4 = analogRead(3)/8; // Divide by 8 to get range of 0-127 for midi

if (val4 != lastVal4)

{

MIDImessage(176,4,val4);} // 176 = CC command, 4 = Which Control, val = value read from Potentionmeter 4

lastVal4 = val4;

val5 = analogRead(4)/8; // Divide by 8 to get range of 0-127 for midi

if (val5 != lastVal5)

{

MIDImessage(176,5,val5);} // 176 = CC command, 5 = Which Control, val = value read from Potentionmeter 5

lastVal5 = val5;

val6 = analogRead(5)/8; // Divide by 8 to get range of 0-127 for midi

if (val6 != lastVal6)

{

MIDImessage(176,6,val6);} // 176 = CC command, 6 = Which Control, val = value read from Potentionmeter 6

lastVal6 = val6;

delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.

}

void MIDImessage(byte command, byte data1, byte data2) //pass values out through standard Midi Command

{

Serial.write(command);

Serial.write(data1);

Serial.write(data2);

}

Grazie anticipatamente a chiunque possa aiutarmi!

ErikLovato:
Purtroppo ho bisogno di molti più potenziomentri, almeno 60. Ho dei multiplexer 74hc4067, nessun problema per il collegamento

Fino ad un certo punto. Sai di quanti multiplexer hai bisogno? Se ti servono 60 input analogici devi fare un paio di (semplici) conti e valutazioni.
Ogni integrato ho letto che dispone di 16 pin di ingresso [I0 - I15] a cui collegare i potenziometri, 4 pin di selezione dell'ingresso analogico [S0-S3] da collegare - immagino - a 4 uscite di Arduino e di un'uscita comune da collegare a un ingresso analogico di Arduino.

Quindi se ti servono 60 input esterni, chiamiamoli canali, il numero di integrati multiplexer che ti occorrono sono:
60 input analogici / 16 input per integrato = 3,75 integrati
Visto che un numero del genere è evidentemente impossibile, perlomeno le frazioni di integrato per ora non le hanno ancora inventate :D, si arrotonda il risultato per eccesso e gli integrati ammontano a 4. Questo implica che userai 4 ingressi analogici di Arduino. Qual è il massimo numero di input analogici che puoi collegare ai multiplexer?
16 input per integrato * 4 integrati = 64 input analogici
Si moltiplicano per 4 anche i pin digitali di uscita dell'Arduino da utilizzare per la selezione del canale di ingresso analogico.
4 pin di selezione canale * 4 integrati = 16 uscite digitali da collegare ad Arduino. Con un Arduino UNO ce la fai al pelo ad avere PIN a sufficienza, se sfrutti come uscite digitali anche i due ingressi analogici che non usi. Con un Arduino MEGA il problema non si pone proprio, in quel caso si hanno anche fin troppi PIN disponibili :D.
Ora passiamo alle domande:
Quale Arduino stai utilizzando/hai? Quanti integrati multiplexer possiedi?
Prima di pensare al programma, soffermati a definire il problema e i collegamenti HW che sono richiesti. A proposito di collegamenti, il pin di enable da quel che ho letto nel datasheet lo puoi tranquillamente collegare a massa, cosicché gli integrati siano sempre abilitati. Parimenti, collegherei a massa gli ingressi analogici dei multiplexer che non usi (64 - 60 = 4 ingressi analogici in eccesso).
Io ti consiglio di fare uno schema elettrico dei collegamenti su Fritzing o su siti tipo https://www.circuito.io, lo alleghi nella tua prossima risposta e dopo discutiamo su come impostare il software.

edit1: ho visto che usi la connessione seriale per comunicare col MIDI che occupa i PIN 0 e 1, pertanto non ce la fai a collegare le 16 uscite su un Arduino UNO senza usare un moltiplicatore di uscite di qualche tipo.
edit2: volendo si potrebbero usare solo 4 uscite che arrivano replicate ai 4 integrati, se non hai esigenze particolari nella selezione dei canali.

krypton18:
4 pin di selezione canale * 4 integrati = 16 uscite digitali da collegare ad Arduino.

NON necessariamente ...
... quei chip hanno un pin di "Enable" quindi ... 4 pin per selezionare l'ingresso e 4 pin per selezionare il chip e se la cava con 8 pin in tutto :wink:

Quindi 4 pin analogici per gli ingressi in arrivo dai 4 multiplexer + 4 pin digitali per gli "Enable" + 4 pin digitali per la selezione dell'ingresso ... e ce la fa tranquillamente con un Arduno UNO.

Il problema è poi vedere come sta messo con la SRAM ... in dipendenza di cosa deve fare con tutti questi valori analogici e con il resto del programma ::slight_smile:

Guglielmo

gpb01:
NON necessariamente ...
... quei chip hanno un pin di "Enable" quindi ... 4 pin per selezionare l'ingresso e 4 pin per selezionare il chip e se la cava con 8 pin in tutto :wink:

Parlo da chi ha poca esperienza nell'ambito, quindi da profano, ma non basterebbero solo 4 pin di selezione collegati in derivazione agli integrati? Si tengono gli integrati sempre abilitati, enable a massa, si fa una selezione comune e contemporanea del canale di acquisizione e poi con 4 analogread una di seguito all'altra si leggono i valori provenienti dagli integrati. Al ciclo successivo, si incrementa la combinazione di selezione e si ripete l'acquisizione.

Infatti, ci stavo giusto pensando questa notte ... :smiley: :smiley: :smiley:

Se si usano 4 ingressi analogici, si sa esattamente da QUALE chip si sta leggendo il valore, quindi ... bastano i 4 pin di selezione dell'ingresso, in parallelo su tutti i chip. Una volta selezionato, si va a leggere sul pin analogico relativo al chip il valore e così via :wink:

Diverso era il caso se si usava UN solo pin analogico per tutti ... in tal caso occorreva necessariamente usare l'ENABLE per selezionare il chip .

Guglielmo

ErikLovato:
Purtroppo ho bisogno di molti più potenziomentri, almeno 60.

A parte i suggerimenti che hai già ricevuto, mi devi togliere una curiosità: ma che ci devi fare con 60 potenziometri (tra l'altro manco un polipo riuscirebbe a gestirli..;)) ossia ben 60 controlli MIDI?
E poi sicuro che ti servono tutti in parallelo per azionarli in tempo reale e non ti basta ad esempio avere i tuoi 6 attuali e tramite pulsanti selezionarli in "banchi" da 6 (cosa quindi esclusivamente software)?
E, se anche fosse che necessiti veramente di 60 controller/cursori, non faresti prima con più moduli Arduino collegati in MIDI Thru?

docdoc:
A parte i suggerimenti che hai già ricevuto, mi devi togliere una curiosità: ma che ci devi fare con 60 potenziometri (tra l'altro manco un polipo riuscirebbe a gestirli..;)) ossia ben 60 controlli MIDI?
E poi sicuro che ti servono tutti in parallelo per azionarli in tempo reale e non ti basta ad esempio avere i tuoi 6 attuali e tramite pulsanti selezionarli in "banchi" da 6 (cosa quindi esclusivamente software)?
E, se anche fosse che necessiti veramente di 60 controller/cursori, non faresti prima con più moduli Arduino collegati in MIDI Thru?

Scusate pensavo di aver impostato le notifiche ma evidentemente no.
Comunque il numero 60 era indicativo, ed il motivo del bisogno di cosi tanti potenziometri/slider è per un progetto. Dovrei costruire e comandare un intero sintetizzatore Vsti. E di solito passiamo dai 60 ai 90 comandi da dover configurare.

Avere solo 6 Pot per poi selezionarli in banchi come mi dicevi risulterebbe molto scomodo.

E comunque mentre stai riproducendo un suono, non tocchi più di un paramentro alla volta, quindi ti dirò la verità ne vorrei anche 150 di potenziomentri!

Grszie mille per tutte le risposte

ErikLovato:
Scusate pensavo di aver impostato le notifiche ma evidentemente no.
Comunque il numero 60 era indicativo, ed il motivo del bisogno di cosi tanti potenziometri/slider è per un progetto. Dovrei costruire e comandare un intero sintetizzatore Vsti. E di solito passiamo dai 60 ai 90 comandi da dover configurare.

Avere solo 6 Pot per poi selezionarli in banchi come mi dicevi risulterebbe molto scomodo.

E comunque mentre stai riproducendo un suono, non tocchi più di un paramentro alla volta, quindi ti dirò la verità ne vorrei anche 150 di potenziomentri!

Grszie mille per tutte le risposte

Se rispondessi alle domande si potrebbero fare meno ipotesi su quello che hai "in casa"...

Comunque se ne vuoi così tanti, a meno di usare il metodo consigliato da Guglielmo, l'impiego dell'Arduino MEGA è d'obbligo. Con il MEGA si hanno 16 input analogici a disposizione, dunque se connetti ciascuna uscita comune dei multiplexer a detti input ottieni un totale di 256 potenziometri collegabili.

ErikLovato:
Dovrei costruire e comandare un intero sintetizzatore Vsti. E di solito passiamo dai 60 ai 90 comandi da dover configurare.
Avere solo 6 Pot per poi selezionarli in banchi come mi dicevi risulterebbe molto scomodo.

Ehm, io suono le tastiere da parecchio (seppure da autodidatta, suono in un gruppo cover Genesis) ed uso parecchi VST, per cui scusami ma non capisco proprio questa tua esigenza. Le impostazioni dei VST per ogni brano le fai tramite un VST host (Chainer, Forte, ecc.), poi potresti voler variare qualcosa durante il brano stesso, ma neanche Rick Wakeman aveva bisogno di 60 o 120 cursori da variare durante la performance, nonostante le 8 tastiere... :slight_smile: Per non considerare anche lo spazio necessario per 60 cursori o potenziometri (6 file da 10?)...

Per me tu potresti avere anche solo 6 cursori che mandano determinati eventi MIDI, e a seconda del brano potresti programmare il VST host per rimappare quegli eventi ricevuti in quelli specifici del brano, e quindi avere una mappatura ben più che dinamica.

Poi se vuoi proprio avere tutti quei cursori, contento te, ma direi che se ne fai 10 per Arduino, ognuno dei quali connesso in cascata via MIDI Thru, risolvi più facilmente ed è anche modulare...