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