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: 0