08 Multiplexing
Multiplexing
Da das Arduino nur 6 analoge Eingänge bereithält kann es sehr schnell passieren, dass uns diese Pins ausgehen. In diesem Fall bietet das sog. Multiplexing eine Möglichkeit für weitere Eingänge zu sorgen. Ein Multiplexer arbeitet so ähnlich wie das schon besprochene ShiftRegister. Mit Hilfe von 3 Digitalen Pins werden die Eingänge des Multiplexers dabei so geschalten, dass immer nur einer mit dem gemeinsamen Output verbunden ist. So können wir mit nur einem einzigen analogen Eingang acht weitere einlesen. In diesem Tutorial verwenden wir dazu ein 8-Kanal analog Multiplexer von NXP (Typ: HEF4051).
8-Kanal Multiplexer HEF4051
Das Datenblatt gibt Aufschluss über die Pinbelegung des IC's ...
Datenblatt:
HEF4051
Vdd = 5V (Spannungsversorgung)
Vss = GND (Ground)
Vee = GND (Negative Spannungsversorgung)
E = GND (Enable Pin Aktiv == LOW)
Z = A0 (Gemeinsamer Output)
S1..S3 = D4..D6 (Input Auswahl)
Y0..Y7 = Inputs (Unabhängige Inputs)
Schaltung
Um den HEF4051 an das Arduino anzuschliessen verbinden wir zunächst die Spannungsversorgung (Vcc und Vss), danach die negative Spannungsversorgung (Vee) und den Enable-Pin (E). Dann verbinden wir den gemeinsamen Output (Z) mit einem der analogen Eingänge des Arduino (in diesem Fall A0). Zuletzt verbinden wir die Auswahl-Pins (S1..S3) mit drei digitalen Ausgängen des Arduino (D4..D6). Die linke Darstellung zeigt diese Schaltung. Auf der rechten Seite sieht man die unabhängigen Inputs...
Code
Um zu sehen, wie wir die Auswahl-Pins schalten müssen um die unabhängigen Inputs abzurufen hilft ein weiterer Blick in das Datenblatt...
Werden z.B. S1, S2 und S3 gleichzeitig auf LOW geschaltet, so ist der Eingang Y0 ausgewählt. Hingegen wählt man z.B. Eingang Y5 über die Kombination: S1 = HIGH, S2 = LOW, S3 = HIGH usw.
#define S1 6 // Auswahl-Pins
#define S2 5
#define S3 4
#define COMMON_OUTPUT A0 // Gemeinsamer Output an A0
int inputSelect[][] = // Dieses Array speichert die Schalt-Tabelle
{
{0,0,0},
{1,0,0},
{0,1,0},
{1,1,0},
{0,0,1},
{1,0,1},
{0,1,1},
{1,1,1},
};
int reading = 0; // Hier werden die Werte gespeichert
void setup()
{
pinMode(S1, OUTPUT); // Auswahl Pins als OUTPUT setzen
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
Serial.begin(9600); // Serielle Kommunikation starten
}
void loop()
{
for(int i=0; i<8; i++) // Alle Pins nacheinander lesen
{
digitalWrite(S1, inputSelect[i][0]); // Auswahl setzen
digitalWrite(S2, inputSelect[i][1]);
digitalWrite(S3, inputSelect[i][2]);
reading = analogRead(COMMON_OUTPUT); // Wert abholen und speichern
Serial.println(reading); // Wert über serielle Schnittstelle ausgeben
}
}
Weitere Informationen
HEF4051 auf dem
Arduino Playground