Een multiplexer (ook wel "mux" genoemd) is een elektronische module waarmee je met een paar pinnen van de Arduino veel apparaten kunt aansturen of uitlezen.
Er zijn verschillende soorten multiplexers. In de loop van de tijd zal ik steeds beschrijvingen toevoegen.
16 kanaals analoge multiplexer (CD74HC4067)
Je kunt deze muliplexer als chip kopen, maar handiger is het printplaatje met chip, waarbij alle aansluitingen precies op een breadboard passen (zie het filmpje verderop).
Met deze multiplexer kun je zestien verschillende apparaten aansturen OF zestien verschillende sensoren uitlezen. Dat gaat niet gelijktijdig, maar na elkaar. Je gebruikt hiervoor maar vier pinnen van de Arduino. Als je de muliplexer gebruikt om signalen in te lezen dan noemt dit dat multiplexen, anders demultiplexen, maar dit wordt soms ook andersom gedfefinieerd. Je hoeft niet op te geven of je de module als multiplexer of demultiplexer gebruikt, dat volgt vanzelf uit hoe de stromen lopen.
Een multiplexer is heel handig als je - bijvoorbeeld - op veel plaatsen de temperatuur wilt bijhouden. Je leest dan na elke 10 minuten alle thermometers na elkaar uit. Uiteraard is het mogelijk meerdere (de)multiplexers gelijktijdig te gebruiken.
Een simpele test: gebruik als uitvoer
De multiplexer in werking
Je kunt deze module gemakkelijk digitaal gebruiken (waaronder ook de "analoge" output van de Arduino valt), maar ook analoog. Je zet de analoge of digitale spanning op de "SIG" ingang. Ik laat hier een eenvoudig testprogramma zien waarmee je de module goed kunt testen. Sluit de lange poot van 16 ledjes aan op de uitgangen C0 t/m C15 van de module. Sluit de korte pootjes aan op de aardstrip van het breadboard en verbind die strip met GND van de Arduino. Sluit GND en VCC van de Arduino aan op GND en VCC van de module en verbindt VCC ook via een weerstand met de SIG ingang. Je ziet nu het voordeel van een analoge multiplexer: je hebt nu maar één weerstand nodig voor alle ledjes. Sluit de vier ingangen S0 t/m S3 aan op naast elkaar gelegen pinnen van de Arduino. Ik gebruik de pinnen D6 t/m D9; als je andere pinnen gebruikt moet je de constante boven in het programma veranderen. Op deze pinnen zet je een binair getal dat corespondeert met het nummer van de uitgang die je wilt gebruiken. Als je het onderstaande programma runt dan zal steeds een volgend ledje gedurende een halve seconde aangaan.
#define S0 6 // De eerste van de vier Arduino pinnen die naar S0 t/m S3 gaanvoidsetup() {
for (int p = 0; p < 4; p++) pinMode(p + S0,OUTPUT);
}
voidloop() {
for (int i = 0; i <= 15; i++) {
for (int p = 0; p < 4; p++) digitalWrite(p + S0,bitRead(i, p));
delay(500);
}
}
8 kanaals analoge multiplexer (74HC4051)
Deze multiplexer werkt hetzelfde als de hierboven beschreven multiplexer, alleen gebruik je nu maar drie pinnen om het kanaal te selecteren. De pin E met een streepje erboven kun je gebruiken om de multiplexer uit te zetten (je moet het signaal daarop dan instellen op HIGH), maar als je dat niet nodig hebt hoef je deze pin niet aan te sluiten, of kun je hem verbinden met GND. In het voorbeeldprogramma hieronder laat ik zien dat je ook een PWM signaal kunt doorgeven. De multiplexer is daar snel genoeg voor. Sluit pin 9 (via een weerstand van een paar honderd Ω) aan op de signaal ingang van de multiplexer, dat is de pin met de letter Z erbij. Je kunt 8 ledjes aansluiten op de pinnen P0 t/m P7. Je ziet het licht van links naar rechts gaan, een keer fel en een keer zwak. Mijn ledjes blijven nog veel licht geven bij een lage "analoge" spanning. Daarom heb ik de lage waarde ingesteld op 8, maar bij andere ledjes kan dat te laag zijn. Het maximum dat je mag instellen is 255.
#define S0 3 // De eerste van de drie Arduino pinnen die naar S0 t/m S2 gaanvoidsetup() {
for (int p = 0; p < 3; p++) pinMode(p + S0,OUTPUT);
pinMode(9,OUTPUT); // sluit pin 9 aan op de Z-ingang van de demultiplexer
}
boolean Even =false;
voidloop() {
if (Even) analogWrite(9, 8); // maak 8 eventueel hogerelseanalogWrite(9, 255); // bij de meeste Arduino's kun je voor PWM pin 9 gebruiken
Even =!Even;
for (int i = 0; i <= 7; i++) {
for (int p = 0; p < 3; p++) digitalWrite(p + S0,bitRead(i, p));
delay(500);
}
}