Analogový multiplexer CD74HC4067

Analogový multiplexer CD74HC4067 je velice šikovný integrovaný obvod, který umožňuje najednou připojit 16 vstupů, přepínat mezi nimi pomocí čtyř ovládacích pinů a vybraný vstup převést na jeden výstup. Tento analogový výstup pak můžeme načíst pomocí Arduina a ušetřit přitom 11 propojovacích vodičů. Neztrácíme přitom nijak na přesnosti a ani nejsme omezeni rychlostí čtení.

Pro propojení multiplexeru 4067 a Arduino desky je třeba propojit celkem 8 vodičů. Propojíme GND společně s EN a zemí, VCC s pinem +5V, S0 s pinem D4, S1 s pinem D5, S2 s pinem D6, S3 s pinem D7 a SIG s pinem A0. Na všechny datové piny a také analogový pin můžeme využít jiné volné, jen je zapotřebí tuto změnu provést také v programu. A co se týká pinu VCC, můžeme použít i +3V3, jen pak budeme muset při přepočtu na milivolty změnit konstantu z 5000 na 3300. A zároveň napětí připojené na pin VCC stanovuje horní hranici měřeného napětí, tedy analogovou hodnotu 1023.

Ukázkový kód obsahuje na svém začátku nastavení ovládacích pinů S0 až S3 a poté nastavení výstupního pinu SIG. V podprogramu setup provedeme nastavení ovládacích pinů na výstupní a poté ještě nastavíme komunikaci po sériové lince. V nekonečné smyčce loop vytvoříme pomocnou proměnnou pro načítání výsledků a poté vždy ve smyčce for načteme všech 16 hodnot pomocí podprogramu nactiKanal, které zároveň vytiskneme jako analogovou hodnotu a po přepočtu také jako napětí v milivoltech. Po vytištění hodnot ze všech měřících kanálů už následuje pouze pauza pro přehlednější výpis. Zmíněný podprogram nactiKanal obsahuje pomocné pole s ovládacími piny a také tabulku s kombinacemi pro všechny nastavitelné kanály. Pod těmito proměnnými se nachází opět for smyčka pro nastavení hodnot pro aktuální kanál a následné naměření analogové hodnoty z pinu SIG pro aktuálně měřený kanál. Tato naměřená hodnota je poté funkcí vrácena.

// Multiplexer 16 kanálů CD74HC4067

// nastavení ovládacích pinů S0-S3
int pinS0 = 4;
int pinS1 = 5;
int pinS2 = 6;
int pinS3 = 7;

// nastavení výstupního pinu SIG
int pinSIG = A0;

void setup(){
  // nastavení ovládacích pinů jako výstupních
  pinMode(pinS0, OUTPUT); 
  pinMode(pinS1, OUTPUT); 
  pinMode(pinS2, OUTPUT); 
  pinMode(pinS3, OUTPUT); 
  // komunikace po sériové lince rychlostí 9600 baud
  Serial.begin(9600);
}

void loop(){
  // pomocná proměnná pro načtení analogové hodnoty
  int analogSIG;
  // postupné načtení a vytištění informací ze všech 16
  // kanálů, pro načtení je použita funkce nactiKanal
  for(int i = 0; i < 16; i ++){
    analogSIG = nactiKanal(i);
    Serial.print("Analogova hodnota kanalu ");
    Serial.print(i);
    Serial.print(" je : ");
    Serial.print(analogSIG);
    Serial.print(", tj. ");
    Serial.print(analogSIG*5000.0/1023.0);
    Serial.println(" milivoltu.");
    delay(50);
  }
  Serial.println();
  // pauza pro přehlednější výpis
  delay(2000);
}

int nactiKanal(int kanal){
  // pomocné pole s ovládacími piny pro jejich nastavení
  int ovladaciPiny[] = {pinS0, pinS1, pinS2, pinS3};
  // tabulka všech možných kombinací ovládacích pinů
  int kanaly[16][4]={
    {0,0,0,0},  // kanál  0
    {1,0,0,0},  // kanál  1
    {0,1,0,0},  // kanál  2
    {1,1,0,0},  // kanál  3
    {0,0,1,0},  // kanál  4
    {1,0,1,0},  // kanál  5
    {0,1,1,0},  // kanál  6
    {1,1,1,0},  // kanál  7
    {0,0,0,1},  // kanál  8
    {1,0,0,1},  // kanál  9
    {0,1,0,1},  // kanál 10
    {1,1,0,1},  // kanál 11
    {0,0,1,1},  // kanál 12
    {1,0,1,1},  // kanál 13
    {0,1,1,1},  // kanál 14
    {1,1,1,1}   // kanál 15
  };
  // nastavení kombinace ovládacích pinů
  // pomocí smyčky for
  for(int i = 0; i < 4; i ++){
    digitalWrite(ovladaciPiny[i], kanaly[kanal][i]);
  }
  // načtení analogové hodnoty z pinu SIG
  int napetiSIG = analogRead(pinSIG);
  // vrácení načtené hodnoty
  return napetiSIG;
}

Po nahrání programu do Arduino desky s připojeným multiplexerem CD74HC4067 uvidíme například tento výpis, kde na pin C14 je připojeno napětí +5V a C15 připojena zem:

Analogova hodnota kanalu 0 je : 772, tj. 3773.22 milivoltu.
Analogova hodnota kanalu 1 je : 740, tj. 3616.81 milivoltu.
Analogova hodnota kanalu 2 je : 648, tj. 3167.16 milivoltu.
Analogova hodnota kanalu 3 je : 618, tj. 3020.53 milivoltu.
Analogova hodnota kanalu 4 je : 513, tj. 2507.33 milivoltu.
Analogova hodnota kanalu 5 je : 458, tj. 2238.51 milivoltu.
Analogova hodnota kanalu 6 je : 381, tj. 1862.17 milivoltu.
Analogova hodnota kanalu 7 je : 371, tj. 1813.29 milivoltu.
Analogova hodnota kanalu 8 je : 325, tj. 1588.47 milivoltu.
Analogova hodnota kanalu 9 je : 314, tj. 1534.70 milivoltu.
Analogova hodnota kanalu 10 je : 259, tj. 1265.88 milivoltu.
Analogova hodnota kanalu 11 je : 214, tj. 1045.94 milivoltu.
Analogova hodnota kanalu 12 je : 191, tj. 933.53 milivoltu.
Analogova hodnota kanalu 13 je : 210, tj. 1026.39 milivoltu.
Analogova hodnota kanalu 14 je : 1023, tj. 5000.00 milivoltu.
Analogova hodnota kanalu 15 je : 0, tj. 0.00 milivoltu.

Analogový multiplexer CD74HC4067 je jednoduchý obvod, který může velmi dobře posloužit v zapojeních, kde potřebujeme načítat analogové či digitální hodnoty až z 16 zdrojů, ale nemáme k dispozici tolik vstupních pinů. Může se jednat například o větší množství připojených termočlánků, fotoodporů či třeba tlačítek na ovládací klávesnici.

 

Seznam použitých komponent:

http://dratek.cz/arduino/1223-arduino-analogovy-multiplexer-16-kanalu-cd74hc4067-1458246649.html

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/1227-7-ks-mini-nepajive-pole-25-kontaktu-1458405292.html

http://dratek.cz/arduino-kabelaz-propoje-rozsireni/1063-arduino-vodice-samec-samec-40-kusu.html

Další podobné články