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

Analogový multiplexer CD74HC4067

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.

Schéma zapojení analogového multiplexeru CD74HC4067

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

FB tw

Další podobné články