CD74HC4067 Multiplex 16 canali analogici-digitali Arduino Sketch

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:

CD74HC4067ArduinoSketch

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

CD74HC4067Integrato

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.