Acht LEDs mit 74HC595 steuern
In dieser Anleitung zeigen wir Ihnen, wie Sie mit Hilfe des 74HC595 Schieberegisters acht LEDs mit weniger Arduino-Pins steuern können.
Übersicht
In dieser Anleitung wird gezeigt, wie sich mit Hilfe des 74HC595 acht LEDs mit weniger Pins steuern lassen. Zwar könnten die LEDs auch einzeln an den Arduino UNO angeschlossen werden, jedoch würden die verfügbaren Pins schnell für weitere Komponenten wie Sensoren oder Motoren knapp werden. Um dieses Problem zu umgehen, kommt der 74HC595 zum Einsatz – ein Seriell-zu-Parallel-Logik-Wandler. Dieser Chip verfügt über 8 Ausgänge, die sich mit nur 3 Eingängen Bit für Bit ansteuern lassen. Das Ansteuern der LEDs mit dem 74HC595 IC erfolgt etwas langsamer, ist mit über 500.000 Befehlen pro Sekunde anstelle von 8.000.000 jedoch weiterhin sehr schnell – schneller, als das menschliche Auge eine Veränderung wahrnehmen kann.
Benötigte Komponenten
- Arduino UNO R3 kompatibles Board
- Breadboard
- 14 Jumperkabel
- 74HC595 IC
- 8x 220 Ohm Widerstand
- 8x LED
Funktionsweise
Der 74HC595 Chip arbeitet mit einem Schieberegister (shift register), welches 8 Speicherplätze mit entweder 0 oder 1 füllen kann. Um jeden dieser Werte ein- oder auszuschalten, werden die Daten über die Pins "Data" und "Clock" des Chips eingespeist.
Der Clock-Pin muss acht Impulse empfangen. Bei jedem Impuls wird, wenn der Daten-Pin „high“ ist, eine 1 in das Schieberegister geschoben, andernfalls eine 0 („low“). Wenn alle acht Impulse empfangen wurden, kopiert das Aktivieren des 'Latch'-Pins diese acht Werte in das Latch-Register. Dies ist notwendig, da sonst die falschen LEDs flackern würden, während die Daten in das Schieberegister geladen werden.
Der Chip verfügt auch über einen Output-Enable-Pin (OE), mit dem die Ausgänge auf einmal aktiviert oder deaktiviert werden können. Man könnte diesen Pin mit einem PWM-fähigen UNO-Pin verbinden und 'analogWrite' verwenden, um die Helligkeit der LEDs zu steuern. Dieser Pin ist active low, also verbinden wir ihn mit GND.
Schaltplan
Da acht LEDs und acht Widerstände angeschlossen werden müssen, sind entsprechend viele Verbindungen herzustellen.
Am einfachsten ist es, zunächst den 74HC595-Chip einzusetzen, da nahezu alle weiteren Komponenten mit ihm verbunden werden. Der Chip wird so platziert, dass sich die kleine U-förmige Kerbe oben auf dem Breadboard befindet. Pin 1 des Chips liegt links neben dieser Aussparung.
- Digital 12 des Arduino UNO wird mit Pin 14 des Schieberegisters verbunden.
- Digital 11 des Arduino UNO wird mit Pin 12 des Schieberegisters verbunden.
- Digital 9 des Arduino UNO wird mit Pin 11 des Schieberegisters verbunden.
Alle Ausgänge des ICs bis auf einen befinden sich auf der linken Seite des Chips. Aus Gründen der Übersichtlichkeit werden daher auch die LEDs auf dieser Seite platziert.
Anschließend werden die Widerstände eingesetzt. Dabei ist darauf zu achten, dass sich deren Anschlussdrähte nicht berühren. Vor dem Anschließen der Stromversorgung sollte dies sorgfältig überprüft werden. Falls sich die Widerstände nur schwer ohne Berührung der Drähte anordnen lassen, können die Anschlussdrähte gekürzt werden. Dadurch liegen die Widerstände näher an der Oberfläche des Breadboards an.
Als Nächstes werden die LEDs auf dem Breadboard platziert. Die langen Anschlussbeinchen der LEDs (Anode/Pluspol) müssen dabei stets in Richtung des Chips zeigen – unabhängig davon, auf welcher Seite des Breadboards sie sich befinden.
Danach werden die Jumperkabel wie oben gezeigt angeschlossen. Dabei darf die Brücke von Pin 8 des ICs zur GND-Schiene des Breadboards nicht vergessen werden.
Abschließend wird der Sketch auf den Arduino UNO hochgeladen. Anschließend sollte jede LED nacheinander aufleuchten, bis alle LEDs eingeschaltet sind. Danach schalten sie sich wieder gemeinsam aus und der Ablauf beginnt von vorn.
Code für Arduino
Schieberegister anzeigen / einklappen
int tDelay = 100;
int latchPin = 11; // (11) ST_CP [RCK] on 74HC595
int clockPin = 9; // (9) SH_CP [SCK] on 74HC595
int dataPin = 12; // (12) DS [S1] on 74HC595
byte leds = 0;
void updateShiftRegister() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop() {
leds = 0;
updateShiftRegister();
delay(tDelay);
for (int i = 0; i < 8; i++) {
bitSet(leds, i);
updateShiftRegister();
delay(tDelay);
}
}
Zu Beginn werden die drei verwendeten Pins definiert. Dabei handelt es sich um die digitalen Ausgänge des Arduino UNO, die mit den Latch-, Clock- und Daten-Pins des 74HC595 verbunden sind.
Pinbelegung anzeigen / einklappen
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
Als nächstes wird eine Variable namens "leds" definiert. Diese wird verwendet, um das Muster der LEDs zu speichern, die gerade ein- oder ausgeschaltet sind. Daten des Typs "Byte" stellen Zahlen mit acht Bits dar. Jedes Bit kann entweder ein- oder ausgeschaltet sein, so dass diese Variable perfekt geeignet ist, um folgende Werte zu speichern welche unserer acht LEDs ein- oder ausgeschaltet sind.
byte leds = 0;
Die Setup-Funktion deklariert die drei Pins als digitale Ausgänge.
Setup-Funktion anzeigen / einklappen
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
Die Funktion "loop" schaltet zunächst alle LEDs aus, indem sie der Variable "leds" den Wert 0 gibt. Dann ruft sie 'updateShiftRegister' auf, dass das 'leds'-Muster an das Schieberegister sendet, so dass alle LEDs ausgeschaltet werden. Wie 'updateShiftRegister' funktioniert, wird im Anschluss erklärt.
Die Schleifenfunktion hält eine halbe Sekunde lang an und beginnt dann, mit Hilfe der 'for'-Schleife und der Variablen 'i' von 0 bis 7 zu zählen. Jedes Mal wird die Arduino-Funktion 'bitSet' verwendet, um das Bit zu setzen, das die LED in der Variablen 'leds' steuert.
Anschließend wird die Funktion "updateShiftRegister" aufgerufen, damit die LEDs aktualisiert werden, um den Wert in der Variablen "leds" wiederzugeben. Es gibt dann eine halbe Sekunde Verzögerung, bevor 'i' inkrementiert wird und die nächste LED aufleuchtet.
Loop-Funktion anzeigen / einklappen
void loop() {
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) {
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}
Erklärung
Die Funktion 'updateShiftRegister' setzt zunächst den latchPin auf low und ruft dann die UNO-Funktion 'shiftOut' auf, bevor sie den 'latchPin' wieder auf high setzt.
Diese Funktion benötigt vier Parameter, die ersten beiden sind die Pins, die für Data bzw. Clock verwendet werden sollen.
Der dritte Parameter gibt an, an welchem Ende der Daten man beginnen möchte. Wir beginnen mit dem rechten Bit, das als 'Least Significant Bit' (LSB) bezeichnet wird.
Der letzte Parameter sind die eigentlichen Daten, die in das Schieberegister geschoben werden sollen, in diesem Fall also 'leds'.
updateShiftRegister-Funktion anzeigen / einklappen
void updateShiftRegister() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
Soll eine der LEDs ausgeschaltet werden, kann dafür die Arduino-Funktion bitClear mit der Variablenleds verwendet werden. Dadurch wird das entsprechende Bit in leds auf 0 gesetzt. Anschließend genügt ein Aufruf der Funktion updateShiftRegister, um den neuen Zustand auf die LEDs zu übertragen.