Arduino Tutorial: Das Schieberegister

Wir haben schon viele LEDs für ein Projekt gebraucht. Und unser Arduino Board hat nicht unendlich viele Pins. Es wird irgendwann mehr Pins benötigt als unser Arduino besitzt. Die Abhilfe schafft hier unser Schieberegister. Mit dem Schieberegister brauchst du anstatt 8 Pins nur 3 Pins. 

 

 

Was benötigst du?

  • 1 x Arduino Uno

 

  • 1 x USB Kabel

 

  • 1 x Steckbrett

 

  • 1 x Schieberegister (Typ 74HC595)

 

  • 8 x LED

 

  • 8 x Ohmscher Widerstand (220 Ohm)

 

  •  Jump Wire (Männlich)

 

Wie sieht die Schaltung aus?

Das Schieberegister hat oben eine Einkerbung in Form eines Halbkreises. So könnt ihr zwischen "oben" und "unten" unterscheiden.

 

 

 

 

 

Der Code

int sh = 8;                                      // SH_CP Pin

int st = 9;                                      // ST_CP Pin

int ds = 10;                                     // DS Pin

int daten[] = {1,0,1,0,1,0,1,0};                 // Variable für die LEDs ( 0 = LOW = aus,

                                                 // 1 = HIGH = an)

 

void setup() {

 

  pinMode(sh, OUTPUT);                           //

  pinMode(st, OUTPUT);                           // Pins für Schieberegister als

  pinMode(ds, OUTPUT);                           // Ausgang definieren

}

 

void loop() {

 

 

 

  for (int index = 0; index <= 7; index ++)      // Die Reihenfolge der leuchtenden LEDs

  {                                              // durch die for- Schleife einfügen

  

     digitalWrite(ds, 0);                        // DS Pin SH_CP Pin auf "0" (LOW) stellen

     digitalWrite(sh, 0);                        //

 

 

     digitalWrite(ds, daten[index]);             // In DS Pin schreiben, ob LED an oder aus

                                                 // (0 für LOW, also aus, und 1 für HIGH,

                                                 // also an)

     delay(20);                                  // 20 Millisekunden warten

     digitalWrite(sh, 1);                        // SH_CP Pin auf 1 setzen (HIGH) damit die

                                                 // Information am DS Pin gespeichert wird

     delay(20);                                  // 20 Millisekunden warten

 

 

 

  }

 

  digitalWrite(st, 1);                           // Wenn for- Schleife beendet wurde, ST_CP

                                                 // Pin auf 1 (HIGH) setzen damit 

                                                 // die gespeicherten Daten ausgegeben

                                                 // werden. (Erst dann leuchten die LEDs)

}

 

 

Den Sketch kannst du auch hier herunterladen.

 

Um deutlicher zu sehen was da passiert, kannst du den daten- Array verändern. Vertausche einfach paar Nullen und Einsen.

 

 

Code- Review

Jetzt schauen wir uns mal genauer an wie ein Schieberegister funktioniert. Dazu gucken wir uns erstmal an was die einzelnen Pins bedeuten.

  • Vcc               Spannungsversorgung
  • GND              Masse 0V
  • Qa-Qh           Parallele Ausgänge
  • Qi                Serieller Ausgang ( hier kann ein zweiter Register angeschlossen werden)
  • MR                Master Reset (LOW aktiv)
  • SH_CP           Schieberegister Takteingang (Shiftregister clock input)
  • ST_CP            Speicherregister Takteingang (Storageregister clock input)
  • OE                Ausgang aktivieren (Output enable / LOW aktiv)
  • DS                Serieller Eingang (Serial data input)

Jetzt können wir uns anschauen wie die Datenübertragung stattfindet. Wichtig sind die Pins DS, ST_CP und SH_CP.

Der Pegel bzw. die Information die immer gelesen wird, befindet sich am Pin DS.

 

 

Nach unserem daten- Array schreiben wir als erstes eine 1 an unserem DS Pin. Dies entspricht einen Pegel von 5 Volt (HIGH). 

 

 

 

 

Um die Information zu speichern, setzen wir den SH_CP Pin auf 1. Die Information im DS Pin wandert nun in den ersten Block des Registers.

 

 

 

 

Um neue Daten zu speichern setzten wir die Pins wieder auf 0. Nach dem daten- Array soll nun die 0 abgespeichert werden. Der DS Pin wird auf 0 gesetzt, wenn es noch nicht geschehen ist.

 

 

 

 

Nun wird wieder der SH_CP auf HIGH gesetzt. Die erste Information, also die 1 wird in den zweiten Block geschoben und die "0" wird in den ersten Block geschoben.

 

 

 

 

Dies geschieht insgesamt 8 mal, bis unser Register voll ist.

 

 

 

 

Die Informationen wurden aber noch nicht an die LEDs ausgegeben. Sie leuchten deswegen noch nicht. Damit das geschieht setzen wir den ST_CP Pin auf HIGH.

 

 

 

 

Die LEDs werden nun leuchten.

Achte immer darauf, dass du alle Blöcke mit Daten besetzt. Auch wenn du nur 4 Ausgänge benötigst.

Ich hoffe, dass dir nun alles klar ist.

 

 

Jetzt bis du dran

Versuch nun mit dem Schieberegister...

a) ... ein Lauflicht zu erzeugen.

b) ... dein Lauflicht andersherum laufen zu lassen.

c) ... ein Lauflicht zu erzeugen, welches erst in die eine Richtung und dann in die andere Richtung läuft.

Dein Lauflicht soll sich in jeder halben Sekunde fortbewegen.

 

 Tipp: Erkundige dich wie mehrdimensionale Arrays in der Programmiersprache C initialisiert werden.

         Man kann mit dem Befehl "variable++" eine Variable um 1 erhöhen. Mit den Befehl "variable--" kann man eine

         Variable um 1 verringern.

 

Die Lösung findest du hier.

 

 

 

 

Wenn du hier irgendetwas vermisst, bessere Ansätze hast oder dir etwas nicht klar ist, zögere nicht einen Kommentar zu hinterlassen.

Kommentar schreiben

Kommentare: 4
  • #1

    Christian (Dienstag, 03 April 2018 01:52)

    Achte immer darauf, dass du alle Blöcke mit Daten besetzt. Auch wenn du nur 4 Ausgänge benötigst.

    Warum?

  • #2

    Thomas (Mittwoch, 04 April 2018 18:33)

    Christian (Dienstag, 03 April 2018 01:52)

    Achte immer darauf, dass du alle Blöcke mit Daten besetzt. Auch wenn du nur 4 Ausgänge benötigst.

    Warum?
    ----------------------------------------------------------------------------------------------
    Wenn nur die ersten 4 Ausgänge verschaltet sind,reicht es wenn man nur die ersten 4 Blöcke belegt, da die anderen 4 Ausgänge garnicht verschaltet sind. Wenn das Schieberegister aber wie oben verschaltet ist und trotzem nur die ersten 4 LEDs angesprochen werden sollen, würde ich trotzdem alle Blöcke belegen, damit nicht ungewollt die letzten 4 LEDs angesprochen werden.

    Gruß,

    Thomas

  • #3

    Christian (Montag, 04 Juni 2018)

    Wie sieht es mit der Ausgangsleistung des 74HC595 aus? In allein Beschreibungen werden ja immer nur poplige LEDs mit wenig verbrauch verwendet. Laut meinem Datenblatt kann der 74HC595 max. 8 mA gleichzeitig an allen 8 Ausgängen liefern. Da die LEDs welche ich benötige 20mA brauchen, muss also ein NPN davor geklemmt werden. Ich hoffe das die sich mit den 8 mA überhaupt gut schalten lassen.
    Gibts auch Schieberegister welche etwas mehr Leistung haben?

  • #4

    Thomas (Dienstag, 05 Juni 2018 17:50)

    Hallo Christian,

    für den 74HC595 gibt es einen Trick, wie du ihn mit 20mA pro LED trotzdem verwenden kannst. Der Trick wird in folgener URL erklärt.
    https://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

    In den Forum hier könntest du auch auf andere Schieberegister stoßen, die deine Anforderungen vielleicht erfüllen:
    https://www.mikrocontroller.net/topic/229130

    Liebe Grüße,

    Thomas