Der IC 74HC4067 mit seinen 24 Pins ist ein analoger 16-kanaliger Multiplexer/Demultiplexer,
der in diesem Fall der Bequemlichkeit auf eine kleine Platine aufgebracht wurde, damit man ihn
leichter ins 2,54mm-Raster (z.B. für Breadboards) adaptieren kann.
Man kann ihn mit 2V bis zu 10V betreiben und somit ist er sowohl für ESP32/Raspberry Pi (3,3V)
als auch für Arduino-Derivate (5V) gut geeignet, ohne dass besondere Vorkehrungen getroffen
werden müssen.
Pin | Nummer | Funktion |
---|---|---|
Z (auch: COM oder SIG) | 1 | Gemeinsamer Eingang/Ausgang |
Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0, Y15, Y14, Y13, Y12, Y11, Y10, Y9, Y8 | 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23 | Getrennte Eingänge/Ausgänge |
S0, S1, S2, S3 | 10, 11, 14, 13 | Adress-Eingänge |
GND | 12 | Ground/0V |
E (active LOW) | 15 | "Enable"-Eingang |
VCC | 24 | Spannungsversorgung |
In dem folgenden Schaltplan sind die 16 Ausgänge mit jeweils einer LED verbunden, um das
Demultiplexing mit dem 74HC4067 zu veranschaulichen. Da immer nur an einem Ausgang gleichzeitig
ein HIGH
-Signal anliegen kann und damit immer nur eine der 16 LEDs leuchten wird, reicht hier
ein einziger Vorwiderstand, den sich alle LED teilen.
Durch das Demultiplexing können die vier digitalen Eingänge S0
, S1
,
S2
und S3
auf die 16 Ausgangskanäle geschaltet werden. Dazu muss jedoch
zusätzlich der Pin #1 (Z
) auf VCC des Arduino gezogen werden, damit später an den Ausgängen
die entsprechenden Signale anliegen.
Je nachdem, welche Signale an den vier Adress-Eingängen nun anliegen, wird jeweils einer der 16 Ausgänge
geschaltet, wie folgende Wahrheitstabelle zeigt:
1 = Signal "HIGH"
0 = Signal "LOW"
? = beliebiges Signal
Eingänge | Kanal | ||||
---|---|---|---|---|---|
E | S3 | S2 | S1 | S0 | |
1 | ? | ? | ? | ? | - |
0 | 0 | 0 | 0 | 0 | Y0 |
0 | 0 | 0 | 0 | 1 | Y1 |
0 | 0 | 0 | 1 | 0 | Y2 |
0 | 0 | 0 | 1 | 1 | Y3 |
0 | 0 | 1 | 0 | 0 | Y4 |
0 | 0 | 1 | 0 | 1 | Y5 |
0 | 0 | 1 | 1 | 0 | Y6 |
0 | 0 | 1 | 1 | 1 | Y7 |
0 | 1 | 0 | 0 | 0 | Y8 |
0 | 1 | 0 | 0 | 1 | Y9 |
0 | 1 | 0 | 1 | 0 | Y10 |
0 | 1 | 0 | 1 | 1 | Y11 |
0 | 1 | 1 | 0 | 0 | Y12 |
0 | 1 | 1 | 0 | 1 | Y13 |
0 | 1 | 1 | 1 | 0 | Y14 |
0 | 1 | 1 | 1 | 1 | Y15 |
Der folgende Sketch lässt nacheinander an jedem Ausgang für kurze Zeit ein HIGH
-Signal anliegen
und dabei leuchtet die entsprechende LED.
byte controlPins[] = {
B00000000, B10000000, B01000000, B11000000,
B00100000, B10100000, B01100000, B11100000,
B00010000, B10010000, B01010000, B11010000,
B00110000, B10110000, B01110000, B11110000
};
void setup()
{
// set digital pin 4 to 7 as outputs
DDRD = DDRD | B11110000;
}
void setOutput(byte index)
{
PORTD = controlPins[index];
}
void loop()
{
for (byte i = 0; i < 16; i++) {
setOutput(i);
delay(100);
}
}
Der Aufbau ähnelt dem ersten Schaltplan, nur dass hier an jeden Ausgang (hier als Eingang genutzt) ein
Schalter angeschlossen wird. Der Bequemlichkeit halber verwende ich hier sogannante DIP-Schalter, die sich
auf engstem Raum auf dem Breadboard verstauen lassen. Außerdem wird Pin #1 (Z
) mit einem
analogen Eingang (hier A0
) des Arduino Uno verbunden.
Der folgende Sketch liest alle 5000ms jeden Kanal ein, wobei hier wieder S0-S3
richtig adressiert
werden müssen. Ist der Schalter an dem jeweiligen Kanal geschlossen (LOW
), so wird an dem
Eingang A0
des Arduino ebenfalls ein LOW
gelesen. Ist der Schalter offen, so wird
ein Wert weit über 100 ausgelesen.
const byte PIN_SIG = A0;
const byte CHANNEL[] = {
B00000000, B10000000, B01000000, B11000000,
B00100000, B10100000, B01100000, B11100000,
B00010000, B10010000, B01010000, B11010000,
B00110000, B10110000, B01110000, B11110000
};
void setup()
{
// set digital pin 4 to 7 as outputs
DDRD = DDRD | B11110000;
Serial.begin(9600);
}
void loop()
{
for (byte channel = 0; channel < 16; channel++) {
Serial.print("Channel #" + String(channel) + ":\t");
Serial.println(getSignal(channel));
}
Serial.println("");
delay(5000);
}
int getSignal(byte channel)
{
PORTD = CHANNEL[channel];
return analogRead(PIN_SIG);
}
zurück