Premessa:
Vedremo in questa guida un interessante integrato CD74HC4067 della famiglia dei multiplexer che ci permetterà di “moltiplicare” i nostri pin digitali o analogici. Per moltiplicare si intende riuscire ad ottenere più pin su un microcontrollore esempio arduino.
LISTA DEI MATERIALI:
- Arduino Uno
- CD74HC4067 Multiplexer
- 2x Strip 20 vie
- Breadboard
Esso si comporta come un interruttore. Dallo schema si nota che dall’arduino i PIN DIGITALI: 8, 9, 10, 11 sono collegati al S1, S2, S3, S4 del multiplex. Così facendo ci troveremo a gestire 4 pin digitali, che cambiando di valore da LOW ad HIGH trasmetteranno in uscita 16 combinazioni binarie:
Per semplificare le cose, 1 è HIGH, 0 è LOW
S0 S1 S2 S3 N
0 0 0 0 – 0
1 0 0 0 – 1
0 1 0 0 – 2
1 1 0 0 – 3
0 0 1 0 – 4
1 0 1 0 – 5
0 1 1 0 – 6
1 1 1 0 – 7
0 0 0 1 – 8
1 0 0 1 – 9
0 1 0 1 – 10
1 1 0 1 – 11
0 0 1 1 – 12
1 0 1 1 – 13
0 1 1 1 – 14
1 1 1 1 – 15
In questo modo tramite arduino impostando il pinmode in output dei 4 pin digitali avremo n combinazioni in base al valore binario scelto compreso tra 0 e 15. Esempio se i pin 8, 9, 10, 11 digitali sono impostati ad HIGH ( quindi 1 1 1 1 ) si attivera il pin 15 cioè l’ultimo ( in figura è rappresentato dalle linee verdi ).
SKETCH ESEMPIO ARDUINO:
int s0 = 8; int s1 = 9; int s2 = 10; int s3 = 11; //Mux in "SIG" pin int SIG_pin = 0; void setup(){ pinMode(s0, OUTPUT); pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); pinMode(s3, OUTPUT); digitalWrite(s0, LOW); digitalWrite(s1, LOW); digitalWrite(s2, LOW); digitalWrite(s3, LOW); Serial.begin(9600); } void loop(){ //Loop through and read all 16 values //Reports back Value at channel 6 is: 346 for(int i = 0; i < 16; i ++){ Serial.print("Value at channel "); Serial.print(i); Serial.print("is : "); Serial.println(readMux(i)); delay(1000); } } int readMux(int channel){ int controlPin[] = {s0, s1, s2, s3}; int muxChannel[16][4]={ {0,0,0,0}, //channel 0 {1,0,0,0}, //channel 1 {0,1,0,0}, //channel 2 {1,1,0,0}, //channel 3 {0,0,1,0}, //channel 4 {1,0,1,0}, //channel 5 {0,1,1,0}, //channel 6 {1,1,1,0}, //channel 7 {0,0,0,1}, //channel 8 {1,0,0,1}, //channel 9 {0,1,0,1}, //channel 10 {1,1,0,1}, //channel 11 {0,0,1,1}, //channel 12 {1,0,1,1}, //channel 13 {0,1,1,1}, //channel 14 {1,1,1,1} //channel 15 }; //loop through the 4 sig for(int i = 0; i < 4; i ++){ digitalWrite(controlPin[i], muxChannel[channel][i]); } //read the value at the SIG pin int val = analogRead(SIG_pin); //return the value return val; }
NOTA BENE: il pin SIG del multiplex è impostato in lettura analogica.
Il CD74HC4067 è capace di leggere più segnali analogici. Può essere usato in entrambe le direzioni. Così si potrebbe collegare il pin SIG a 5V, e quindi essere in grado di commutare i 5v a uno dei 16 pin e poter così controllare ad esempio16 relè. Funziona anche con la seriale.
Buon progetto.