Im letzten Beitrag Schieberegister 74HC164D: Programmierung und Einsatz am Arduino Nano habe ich dir gezeigt, wie einfach es ist, das Schieberegister 74HC164D am Arduino Nano zu programmieren. Hier soll es nun darum gehen, wie du das Schieberegister 74HC164D in MicroPython programmierst.
Du kannst dieses Beispiel mit dem Pi Pico 2 und natürlich auch mit dem Vorgängermodell, dem Pi Pico, mit und ohne WiFi Support nachbauen. Beide Mikrocontroller sind baugleich und somit voll kompatibel.
Inhaltsverzeichnis
- Bezug des Schieberegisters 74HC164D / CJMCU-164
- Aufbau der Schaltung – Raspberry Pi Pico mit Schieberegister 74HC164D
- Programmieren des Schieberegisters 74HC164D in MicroPython
Bezug des Schieberegisters 74HC164D / CJMCU-164
Du bekommst dieses Schieberegister als einfachen Baustein oder auf einer Platine mit Pinbeschriftungen. Die zuletzt genannte Variante habe ich mir von aliexpress.com für günstige 0,96 € besorgt. Die Versandkosten betrugen jedoch knapp 3,6 € somit war dieses vermeintliche Schnäppchen nicht viel günstiger als wenn man es bei einem deutschen Händler kauft.
ebay.de | aliexpress.com | androegg.de |
---|---|---|
4,87 €* | 0,96 € (3,62 €) | 2,87 € (1,64 €) |
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Lieferumfang
Zum Lieferumfang des CJMCU-164 gehört neben der Platine lediglich noch zwei Stiftleisten, welche du noch anlöten musst.
Aufbau der Schaltung – Raspberry Pi Pico mit Schieberegister 74HC164D
Der Aufbau ist im Grunde dieselbe wie beim Arduino Nano, du benötigst eine Spannungsversorgung von 3.3V oder 5V und zwei digitale Pins.
Anschluss des Schieberegisters an den Pi Pico
Das Schieberegister arbeitet mit einer Spannung zwischen 2V und 6V, der Pi Pico liefert dir an dem Pin “VBUS” 5V und der Pin “3V3(OUT)” liefert 3,3V.
Pin | Raspberry Pi Pico |
---|---|
VCC | VBUS (Pin 40) |
GND | GND (Pin 23) |
A | GP16 (Pin 21) |
B | VBUS (Pin 40) |
CLK | GP17 (Pin 22) |
CLR | VBUS (Pin 40) |
Anschluss der 7 Segmentanzeige an das Schieberegister
Die 7 Segmentanzeige bekommst du in zwei Varianten, zum einen mit einer gemeinsamen Kathode und gemeinsame Anode. Das bedeutet, dass du am Pin 8 entweder VCC oder GND anschließen musst. In meinem Fall habe ich eines mit gemeinsamer Kathode und schließe dort GND über einen 220 Ohm Vorwiderstand an.
Programmieren des Schieberegisters 74HC164D in MicroPython
Das kleine Arduino Programm lässt sich sehr einfach nach MicroPython portieren. Statt eines mehrdimensionalen Arrays nutze ich hier ein mehrdimensionales Tupel, ansonsten gibt es auch hier nicht viel Besonderes.
In dem inneren 8-stelligen Tupel sind die LEDs jeweils über die Indexe belegt.
Über die Matrix links kannst du dir Zahlen und Buchstaben (begrenzt) aufbauen und hinterlegen.
Im nachfolgenden Code werden die Zahlen von 0 bis 9 und die Buchstaben A, C und E auf der 7 Segmentanzeige angezeigt.
#Module zum ansteuern der GPIOs, sowie import machine #zum einlegen einer kleinen Pause import time #DataPin am GPIO16 als Ausgang angeschlossen dataPin = machine.Pin(16, machine.Pin.OUT) #ClockPin am GPIO17 als Ausgang angeschlossen clockPin = machine.Pin(17, machine.Pin.OUT) #Tupel mit mehreren Tupeln #Jede Stelle in dem inneren Tupel #repräsentiert den Zustand einer LED #auf der 7 Segmentanzeige digits = ( (1, 1, 1, 1, 1, 1, 0, 0), #Zahl 0 (0, 1, 1, 0, 0, 0, 0, 0 ), #Zahl 1 (1, 1, 0, 1, 1, 0, 1, 0 ), #Zahl 2 (1, 1, 1, 1, 0, 0, 1, 0 ), #Zahl 3 (0, 1, 1, 0, 0, 1, 1, 0 ), #Zahl 4 (1, 0, 1, 1, 0, 1, 1, 0 ), #Zahl 5 (0, 0, 1, 1, 1, 1, 1, 0 ), #Zahl 6 (1, 1, 1, 0, 0, 0, 0, 0 ), #Zahl 7 (1, 1, 1, 1, 1, 1, 1, 0 ), #Zahl 8 (1, 1, 1, 0, 0, 1, 1, 0 ), #Zahl 9 (1, 1, 1, 0, 1, 1, 1, 0 ), #Buchstabe A (1, 0, 0, 1, 1, 1, 0, 0 ), #Buchstabe C (1, 0, 0, 1, 1, 1, 1, 0 ) #Buchstabe E ) #Funktion zum anzeigen einer Zahl #Als Parameter wird ein Tupel mit #den Zuständen der LEDs erwartet. def displayValue(tpl): #Für jede Stelle im Tupel mache... #Die Liste wird Rückwärts durchlaufen! for idx in reversed(tpl): #den ClockPin deaktivieren clockPin.value(0) #den DataPin aktivieren/deaktivieren, #je nach Status dataPin.value(idx) #aktivieren des ClockPins clockPin.value(1) #eine Pause von 100 Millisekunden time.sleep(0.1) #Starten der Endlosschleife while True: #Für jedes Tupel mache... for idx in digits: #Aufrufen der funktion zum anzeigen einer Zahl displayValue(idx) #eine kleine Pause von 800 Millisekunden time.sleep(0.8)
LED-Lauflicht programmieren
Statt einer 7 Segmentanzeige kannst du auch recht einfach ein LED-Lauflicht programmieren, dazu ersetzen wir lediglich die Anzeige durch die LEDs, welche wir nacheinander aktivieren. Die Kathode (der Minuspol) der LED wird dazu an den GND Pin auf der Seite der Q0 bis Q7 Pins angeschlossen!
Der Code für ein Lauflicht wiederholt sich zum Beispiel zuvor sehr stark, denn wir müssen lediglich die Tupel mit den Zuständen der LEDs anpassen. In meinem Fall lasse ich die LEDs von rechts nach links und zurück aufleuchten.
sdrgtsdfg
#Module zum ansteuern der GPIOs, sowie import machine #zum einlegen einer kleinen Pause import time #DataPin am GPIO16 als Ausgang angeschlossen dataPin = machine.Pin(16, machine.Pin.OUT) #ClockPin am GPIO17 als Ausgang angeschlossen clockPin = machine.Pin(17, machine.Pin.OUT) #Tupel mit mehreren Tupeln #Jede Stelle in dem inneren Tupel #repräsentiert den Zustand einer LED digits = ( (1, 0, 0, 0, 0, 0, 0, 0), (0, 1, 0, 0, 0, 0, 0, 0 ), (0, 0, 1, 0, 0, 0, 0, 0 ), (0, 0, 0, 1, 0, 0, 0, 0 ), (0, 0, 0, 0, 1, 0, 0, 0 ), (0, 0, 0, 0, 0, 1, 0, 0 ), (0, 0, 0, 0, 0, 0, 1, 0 ), (0, 0, 0, 0, 0, 0, 0, 1 ), (0, 0, 0, 0, 0, 0, 1, 0 ), (0, 0, 0, 0, 0, 1, 0, 0 ), (0, 0, 0, 0, 1, 0, 0, 0 ), (0, 0, 0, 1, 0, 0, 0, 0 ), (0, 0, 1, 0, 0, 0, 0, 0 ), (0, 1, 0, 0, 0, 0, 0, 0 ) ) #Funktion zum anzeigen einer Zahl #Als Parameter wird ein Tupel mit #den Zuständen der LEDs erwartet. def displayValue(tpl): #Für jede Stelle im Tupel mache... #Die Liste wird Rückwärts durchlaufen! for idx in reversed(tpl): #den ClockPin deaktivieren clockPin.value(0) #den DataPin aktivieren/deaktivieren, #je nach Status dataPin.value(idx) #aktivieren des ClockPins clockPin.value(1) #Starten der Endlosschleife while True: #Für jedes Tupel mache... for idx in digits: #Aufrufen der funktion zum anzeigen einer Zahl displayValue(idx) #eine kleine Pause von 800 Millisekunden time.sleep(0.2)