Benötigte Komponenten
- Arduino UNO R3 kompatibles Board
- Breadboard
- 14 Jumperkabel
- 74HC595 IC
- 8x 220 Ohm Widerstand
- 8x LED
Übersicht
In dieser Anleitung zeigen wir Ihnen, wie Sie mit Hilfe des 74HC595 acht LEDs mit weniger Pins steuern können. Während Sie die LEDs auch einzeln an den Arduino UNO anschließen könnten, würden Ihnen schnell die Pins für andere Komponenten wie Sensoren und Motoren ausgehen. Um dieses Problem zu umgehen, nutzen wir den 74HC595 Chip, einen Seriell-zu-Parallel-Logik-Wandler. Dieser Chip besitzt 8 Ausgänge, die Sie mit nur 3 Eingängen Bit für Bit ansteuern können. Das Ansteuern der LEDs mit dem 74HC595 IC geschieht etwas langsamer, ist aber mit über 500.000 Befehlen pro Sekunde statt 8.000.000 immer noch sehr schnell – schneller als das menschliche Auge eine Veränderung erkennen kann.
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
Anschlussplan
Da wir acht LEDs und acht Widerstände anschließen müssen, gibt es tatsächlich eine ganze Reihe von Verbindungen herzustellen.
Es ist am einfachsten, den 74HC595-Chip zuerst anzuschließen, da so ziemlich alles andere mit ihm verbunden ist. Setzen Sie ihn so ein, dass die kleine U-förmige Kerbe oben auf dem Breadboard liegt. Der Pin 1 des Chips befindet sich links von dieser Aussparung.
- Digital 12 von der UNO geht an Pin #14 des Schieberegisters
- Digital 11 von der UNO geht an Pin #12 des Schieberegisters
- Digital 9 vom UNO geht an Pin #11 des Schieberegisters
Alle Ausgänge des ICs bis auf einen befinden sich auf der linken Seite des Chips. Der Einfachheit halber befinden sich daher auch die LEDs dort.
Setzen Sie anschließend die Widerstände ein. Sie müssen darauf achten, dass sich die Leitungen der Widerstände nicht berühren. Das sollten Sie noch einmal überprüfen, bevor Sie den Strom an den Arduino UNO anschließen. Wenn Sie Schwierigkeiten haben, die Widerstände so anzuordnen, dass sich ihre Leitungen nicht berühren, können Sie die Drähte kürzen. Dadurch liegen Sie näher an der Oberfläche vom Breadboard.
Als Nächstes platzieren Sie die LEDs auf dem Breadboard. Die langen Beinchen der LEDs (positiv) müssen alle in Richtung des Chips zeigen, unabhängig davon auf welcher Seite des Breadboards sie sich befinden.
Bringen Sie die Jumperkabel wie oben gezeigt an. Vergessen Sie nicht die Brücke, die von Pin 8 des ICs zur GND-Spalte des Breadboards führt.
Laden Sie den Sketch hoch und probieren Sie ihn aus. Jede LED sollte der Reihe nach aufleuchten, bis alle LEDs an sind. Anschließend sollten sie alle wieder ausgehen und den Zyklus wiederholen.
Code
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);
}
voidsetup()
{
pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
}
voidloop()
{
leds = 0;
updateShiftRegister();
delay(tDelay);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(tDelay);
}
}
Als erstes definieren wir die drei Pins, die wir verwenden werden. Dies sind die digitalen UNO-Ausgänge, die mit den Latch-, Clock- und Daten-Pins des 74HC595 verbunden werden.
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.
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()
{
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'.
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
Wenn Sie eine der LEDs nicht ein-, sondern ausschalten wollten, würden Sie eine ähnliche Arduino-Funktion (bitClear) mit der Variablen "leds" aufrufen. Dadurch wird das Bit von "leds" auf 0 gesetzt und Sie müssten dann nur noch einen Aufruf von "updateShiftRegister" folgen lassen, um die tatsächlichen LEDs zu aktualisieren.