Schieberegister – Am RaspberryPi anschließen

Schieberegister – Am RaspberryPi anschließen

Category : Raspberry Pi

Ausdrucken Ausdrucken

74hc595

Gehen uns die Ausgabepins an unserem Raspi aus, können wir einfach und preisgünstig mit einem oder mehreren Schieberegistern die Pinanzahl erhöhen.

Pro Schieberegister können wir 8 weitere Pins hinzufügen.

Zum Anschließen von weiteren 8 Pins werden lediglich einmalig 3 freie Pins am Raspi benötigt.

Wie eine Schieberegister funktioniert, könnt Ihr unter „Schieberegister – Was ist das?“ nachlesen.

In diesem Beitrag zeige ich Euch, wie Ihr ein Schieberegister über das SPI-Bussystem anschließen könnt und gehe auf den Schaltplan ein.
Danach erweitern wir noch unser Schieberegister um ein weiteres Register.

Zuerst einmal die Liste der Bauteile die wir benötigen:

Icon

Alle notwendigen Bauteile im Warenkorb Reichelt anzeigen:
https://www.reichelt.de/my/1273677

 

Dann sollten wir schauen, dass wir auf unserem Raspi Python-Dev und die GPIO-Library installiert haben.

In der Konsole geben wir folgende Befehle ein:

 

Beginnen wir mit dem Schaltplan:

74hc595_raspi

Fangen wir von hinten an. Pin QA – QH sind unsere 8 Ausgabepins, an die wir jeweils 8 Vorwiderstände und 8 LEDs anschließen.

Der Pin 9 „QH*“ ist in diesem Schaltplan nicht belegt. Dieser Pin leitet den seriellen Input an ein weiteres vorhandenes Schieberegister.

Der Pin 14 „SER“ (in einigen Datenblättern auch SI oder DS genannt) ist der serielle Input. An diesem Pin werden wir Bit für Bit den gewünschten Zustand in das Schieberegister übertragen.
Das Schieberegister verfügt über einen Zwischenspeicher und erst durch ein Freischalten werden alle Bits in einem Rutsch an die Ausgabepins weitergleitet.

Pin 11 „SCK“ (alias SHCP, SRCLK) ist der ShiftRegisterClock-Pin, der dafür sorgt, dass durch eine LH-Flanke (Ein Zustandswechsel von Low nach High wird als Flanke bezeichnet) alle Bits im Register um jeweils eine Stelle verschoben werden und das am PIN 14 „SER“ anliegende Bit in das Schieberegister aufgenommen werden kann. Das geschieht so lange, bis das oder die Register (bei mehreren) voll sind.

Die Flankenwechsel, so wie das Übertragen der einzelnen Bits werden wir von unserem Arduino aus übernehmen, genau so wie das Kopieren aller Bits des Zwischenspeichers an die Ausgabe, wofür ein weiterer LH-Flankenwechsel am Pin 12 „RCK“ (alias STCP (StoreClockPin), RCLK) Register Clock ausgeführt wird, damit dies geschieht.

Pin 13 „G“ (alias OE) Open enabled ist ein Low-Aktiver Pin. Dies erkennt man daran, dass im Datenblatt über dem G ein Strich ist. Low-Aktiv heißt, wenn wir die Ausgabepins des Bausteins nutzen wollen, müssen wir ihn aktivieren und somit den Pin mit GND verbinden.

Pin 10 „SCLR“ (alias SRCLK, MR) ist der StoreClockPin-Reset oder auch MasterReset-Pin genannt. Dieser Pin ist ebenfalls Low-Aktiv und resettet das gesamte Register. Das wollen wir nicht, also müssen wir den Pin mit +5V verbinden.

Pin 8 „GND“ und Pin 16 „VCC“ sollten klar sein.

So, jetzt setzen wir den Schaltplan auf unserem Breadboard um, das sollte dann in Etwa so aussehen:

74hc595_raspi_steckplatine

Beachtet, dass ich als Vorwiderstand 1kΩ gewählt habe. Der Grund ist, dass das Schieberegister auf allen Pins eigentlich nur insgesamt 70mA (8,75mA pro Pin) verträgt. Bei sehr vielen Seiten im Netz ignoriert man das.
Das Bauteil läuft auch wenn wir jede LED mit 18mA (insgesamt 144mA) pro Pin betreiben, aber damit liegen wir mit dem doppelten Wert weit drüber und auf Dauer ist das keine gute Idee.
Mit 1kΩ haben wir rund 6mA pro LED und bleiben im Rahmen.

Lösungen, um das Problem zu umgehen könnt Ihr auch unter „Schieberegister – Was ist das?“ nachlesen.
Es gibt beispielsweise preisgünstige Darlington-Arrays in IC-Form, um höhere Lasten ordnungsgemäß betreiben zu können.

Hier ist ein Pinbelegungsplan des Raspis. Wenn Ihr nicht wisst, auf welcher Seite der Pin 1 ist, dann schaut auf die Rückseite der Platine.
Pin 1 ist der einzige Pin, der auf einem viereckigen Lötpad angelötet ist und nicht auf einem runden Pad.

raspipins

So, jetzt brauchen wir nur noch ein kleines Python-Script, um unsere Schaltung ausprobieren zu können:

Wir setzen nun das Flag, um das Script ausführbar zu machen und starten es im nächsten Schritt. (Da wir Root-Rechte brauchen um auf die Pins zugreifen zu können, müssen wir das Script mit sudo starten.):

 

Mit einem anderen Script lassen wir eine ganz bestimmte LED-Kombination leuchten:

Besonderer Augenmerk auf die for-Schleife der Zeile 14. Da ein Schieberegister nach dem FIFO-Prinzip arbeitet – First in, first out, müssen wir unser out-Array (Tupel) herumgedreht in das Schieberegister reingeben, damit es auch genau so ausgegeben wird, wie wir es eingegeben haben. Daher verwenden wir die Funktion reversed().

 

Doch was machen wir, wenn wir mehr Pins brauchen? Ganz einfach, wir kaskadieren ein weiteres Schieberegister, oder auch zwei, drei, usw. und gehen fast genau so vor.

Einziger Unterschied ist, dass wir bei zwei Schieberegistern einen größeren Adressbereich haben. Bei einem Register waren das 8Bit (2^8 = 256 entsprechen dem Datentyp int), also 8Pins, bei zwei Registern haben wir schon 16Bit (2^16 = 65536 entsprechen dem Datentyp unsigned short).

Die Datentypen sind unter Python nicht von Relevanz, da int dort keine feste Länge hat wie beispielsweise unter C, aber wissen sollte man, das man mit 8Bit und dem Zahlenbereich von 0-255 alle Zeichen der erweiterten ASCII-Tabelle darstellen kann. So steht jede Zahl für einen Steuerbefehl oder einen Buchstabenwert (beispielsweise ist 67 die Zahl 7 und 122 der Buchstabe Z).
Die Dezimalzahl, beispielsweise 122 muss dann in eine binäre Zahl, bestehend aus 0en und 1en umgewandelt werden und wir erhalten eine 8stellige binäre Zahl („01111010“).
Bei 256 wäre die Binärzahl schon 9stellig („100000000“) und würde nicht mehr in ein einzelnes Schieberegister passen. Dafür brauchen wir dann schon ein 16Bit-Register und das können wir uns ja mit zwei 8Bit-Registern problemlos aufbauen und füllen.

Zuerst wieder der Schaltplan:

74hc595kaskadiert_raspi

Es hat sich nicht viel verändert. Lediglich benutzen wir nun den Pin 9 „QH*“ des ersten Schieberegisters, der den seriellen Input zum zweiten Register weiterschleift.

Das zweite Register ist zusätzlich mit PIN 11 SCK und Pin 12 RCK mit dem Raspi und dem ersten Register verbunden. Klar, denn auch hier muss ja der Arbeitstakt synchron sein mit dem ersten Register, wenn nun 16Bits durch alle Registerfelder durchgereicht werden müssen.
Dasselbe gilt für die Übergabe der Kopie des Registers an den Output, damit jedes Register seine 8Bit auf einmal ausgeben kann.

Und das Ganze wiederholt sich, je mehr Schieberegister wir in Serie aneinanderhängen.

74hc595kaskadiert_raspi_steckplatine

Für zwei Schieberegister nochmal die beiden oberen Sketches ein wenig abgeändert:

Wir setzen nun das Flag, um das Script ausführbar zu machen und starten es im nächsten Schritt. (Da wir Root-Rechte brauchen um auf die Pins zugreifen zu können, müssen wir das Script mit sudo starten.):

Unter Python muss man nicht viel ändern. Lediglich in Zeile 13 und 24 die for-Schleife von 8 auf 16 erweitern, da wir ja nun 16Bits haben, die durch zwei Schieberegister gereicht werden müssen.

 

Zum Schluss auch nochmal das andere Script:

Hier müssen wir lediglich unser out-Muster in Zeile 12 um 8 Stellen erweitern, damit es 16Bit lang wird.

 

Das war das Schieberegister 🙂


Andre

16. April 2017 at 11:16 am

Hallo
Ich habe das Schieberegister nach der Vorlage nachgebaut und funktioniert.
Mich verwirrt nur, dass immer zwei LED miteinander leuchten und verschoben werden.
Was mache ich falsch?
Vielen Dank
Andre

    Ronin

    17. April 2017 at 1:01 am

    Hallo Andre,

    puh, das ist eine gute Frage. Da ich mal davon ausgehe, dass Du den Quellcode direkt hier herauskopiert hast, statt ihn abzutippen, können wir da eine Fehlerquelle ausschließen.
    Scheint, als wäre das Problem hardwareseitig zu suchen.

    Leider habe ich in den vielen Aufbauten mit einem Schieberegister niemals so ein Problem gehabt wie Du es schilderst, daher kann ich jetzt auch nur im Nebel stochern. Kann Dir daher als Tipp nur anbieten, dass Du Deine Schaltung nochmal Leitung für Leitung kontrollierst, ob richtig angeschlossen und/oder keine falsche Verbindung vorliegt. (Die Schaltung ist relativ einfach, dennoch macht es Sinn, wenn man sich den Schaltplan ausdruckt und jede kontrollierte korrekte Leitung auf dem Plan andersfarbig markiert.)

    Am besten trennst Du mal alle LEDS vom IC und testest erst mit zwei angeschlossenen LEDs, dann mit drei, usw. Korrekte Teile verwendet (74HC595 und kein anderes vielleicht), Kabel in Ordnung ??

    Die Fehlersuche ist manchmal richtig deprimierend, aber wie überall lernt man dabei eigentlich am Meisten. 🙂

    Ich verstehe es jetzt mal so, dass immer zwei untereinander liegende LEDS leuchten und nicht LED 1 von Schieberegister 1 und LED 1 von Schieberegister 2??

    Viel Erfolg und viele Grüße,
    Michael

Peter M.

30. Januar 2017 at 4:47 pm

Hallo Michael,

herzlichen Dank für deine Rückmeldung – werde das in den nächsten Tagen probieren.

Das Breadboard zu drehen traue ich mir noch zu, aber bei der Treppe sehe ich dann doch einige Probleme:-)

Viele Grüße,
Peter

    Ronin

    30. Januar 2017 at 6:56 pm

    Hallo Peter,

    :-))) Stmmt, Treppe drehen ist ne größere Herausforderung. Dann Plan B, wenn gar nix geht: Steck einfach die Kabel in umgekehrter Reihenfolge an die Schieberegister.
    Ich denke aber mal, das mit der umgedrehten Schleife reicht schon.

    Wäre toll, wenn Du nochmal ein Feedback gibst, wenns läuft.

    Viele Grüße,
    Michael

      Peter M.

      31. Januar 2017 at 1:49 pm

      Hallo Michael,

      das hat leider nicht funktioniert. Das Problem ist ja, dass ich bei „TreppAuf“ mit „x01, x02, x03, x07, xF…“ starte und bei „TreppAb“ mit „x10000, x18000, x1C000, 1E000 …“ beginne.
      Habe jetzt eine einfache Routine gestrickt (ne Weile im Netz gesucht:-):
      def run_down(p):
      n = 1
      n2 = 2
      s = STUFEN
      # erst mal MAX-Wert ermitteln
      while s > 0:
      n = n * 2
      s = s – 1

      # jetzt das Licht von oben nach unten einschalten
      n2 = n / 2
      s = STUFEN + 1
      while(s > 0):
      run_single(n, p)
      print n
      n = n + n2
      n2 = n2 / 2
      s = s – 1

      Funktioniert einwandfrei, sieht halt nicht so schön aufgeräumt aus wie dein Coding.

        Peter M.

        31. Januar 2017 at 2:01 pm

        Kleine Korrektur: Treppab geht es natürlich nicht mit x10000, x18000, x1C000, 1E000 …“, sondern mit „xFFFF, x7FFF, x3FFF, …“ los.

Kibarak

28. Januar 2017 at 9:18 am

Hallo,
könnte man nicht die schieberegister.py in C programmieren und auf einen ATtiny schieben um den rasberry zu entlasten? Die läuft ja in Dauerschleife.
MfG Kibarak

    Ronin

    28. Januar 2017 at 11:54 am

    Klar, das geht auch. Für einen festen Einsatz sogar die bessere Variante,da dafür locker ein Microcontroller reicht und kein ganzer Computerprozessor benötigt wird.

    Natürlich ist die Dauerschleife jetzt nicht sehr rechenintensiv, und solange man keine grafische Benutzeroberfläche auf dem Pi laufen lässt, schafft er das problemlos auch im Hintergrundbetrieb. 🙂

    Viele Grüße,
    Michael

Peter M.

27. Januar 2017 at 4:20 pm

Hallo,

super Idee für mein Treppenlauflicht. Der Code ist einfach, verständlich und übersichtlich.
Hat sofort funktioniert.
Allerdings habe ich nun keinerlei Ahnung wie der Code verändert werden müsste, damit das Licht nicht von unten nach oben läuft, sondern von oben nach unten (also 16tes Bit zuerst).

Hättest du hierfür auch solch ein wundervolles Beispiel?

Herzlichen Dank schon mal im voraus.
Peter

    Ronin

    27. Januar 2017 at 7:51 pm

    Hallo Peter,

    beachte, dass wie geschrieben, das First In, First Out Prinzip gilt.
    Untested, da ich gerade kein leeres Breadborad mehr habe :-), aber Du musst nur die Schleife rückwärts laufen lassen, sprich, statt „for y in range(16)“ -> „for y in reversed(range(0,16))“, oder Du musst den Input 0/1 für das Register von vorn herein gedanklich umdrehen. Ich denke, es ist aber einfacher, Programmtechnisch nur die Schleife zu drehen.

    Alternativ drehst Du einfach Dein Breadboard herum. 🙂

    Viel Erfolg und viele Güße,
    Michael

Schreibe einen Kommentar