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