ADVENTSKALENDER ADVENTSKALENDER FÜR FÜR RASPBERRY RASPBERRY ER RASPBERRY PI ERFÜR FÜR RASPBERRY PI ADVENT ADVENT CALENDAR CALENDAR FOR FOR RASPBERRY RASPBERRY P P R FOR AR FORRASPBERRY RASPBERRYPI PI 24 Experimente, die Spaß machen 24 thrilling experiments ADV
Alle Versuche im Überblick Raspberry-Pi-Adventskalender 2019. . . . . . . . . . . . . . . 3 1. Tag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Heute im Adventskalender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Raspberry Pi vorbereiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Raspberry-Pi-Adventskalender 2019 Dieser Adventskalender enthält für jeden Tag ein Hardwareexperiment mit dem Raspberry Pi. Die Experimente werden mit Scratch und Python programmiert. Beide Programmiersprachen sind auf dem Rasp berry Pi vorinstalliert. Alle Experimente funktionieren mit dem Raspberry Pi 3, Raspberry Pi 3 B+ und Raspberry Pi 4 mit der aktuellen Version des Raspbian Betriebssystems.
1. Tag 1. Tag Heute im Adventskalender • 1 Steckbrett • 1 LED rot • 1 Widerstand 220 Ohm • 2 GPIO-Verbindungskabel Den Raspberry Pi vorbereiten Achtung! Dieser Adventskalender basiert auf dem Raspberry Pi 3 bzw. Raspberry Pi 3+ und der bei Druckdatum aktuellen Software. Neuerungen bei Software oder Hardware ergeben sich aber bisweilen kurzfristig. Damit Sie auf jeden Fall Spaß mit Ihrem Adventskalender haben, finden Sie im Download-Paket unter www.buch.cd hierzu aktuelle Hinweise.
2. Wurde die SD-Karte bereits benutzt, mit SD-Formatter im PC neu formatieren: www. sdcard.org/downloads/formatter_4. Dabei Format Size Adjustment einschalten (die SDKarte muss mindestens 8 GB groß sein). 3. Alle Dateien und Unterverzeichnisse von NOOBS auf die SD-Karte kopieren. 4. SD-Karte aus dem PC nehmen, in den Raspberry Pi stecken und booten. Ganz unten Deutsch als Installationssprache wählen. Damit wird automatisch auch die deutsche Tastatur ausgewählt. 5.
LEDs LEDs (Deutsch: Leuchtdioden) leuchten, wenn Strom in Durchflussrichtung durch sie fließt. LEDs werden in Schaltungen mit einem pfeilförmigen Dreieckssymbol dargestellt, das die Flussrichtung vom Pluspol zum Minuspol oder zur Masseleitung angibt. Eine LED lässt in Durchflussrichtung nahezu beliebig viel Strom durch, sie hat nur einen sehr geringen Widerstand.
GPIO-Verbindungskabel Die farbigen Verbindungskabel haben alle auf einer Seite einen Stecker, auf der anderen Seite eine Steckbuchse, die auf einen GPIO-Pin des Raspberry Pi passt. Die LEDs werden ebenfalls direkt in diese Steckbuchsen gesteckt. Die Stecker werden in das Steckbrett gesteckt. Die programmierbaren GPIO-Pins auf dem Raspberry Pi haben Nummern, die Masse-Pins sind in der Abbildung mit GND gekennzeichnet. Belegung der GPIO-Pins. Dieses Bild ist bei den Downloads zum Adventskalender dabei.
Vorsichtsmaßnahmen Auf keinen Fall sollte man irgendwelche GPIO-Pins miteinander verbinden und abwarten ab, was passiert. Nicht alle GPIO-Pins lassen sich frei programmieren. Ein paar sind für die Stromversorgung und andere Zwecke fest eingerichtet. Einige GPIO-Pins sind direkt mit Anschlüssen des Prozessors verbunden, ein Kurzschluss kann den Raspberry Pi komplett zerstören.
2. Tag Heute im Adventskalender 2. Tag • 1 LED grün • 1 Widerstand 220 Ohm • 1 GPIO-Verbindungskabel Zwei LEDs blinken abwechselnd Das Experiment des 2. Tags lässt zwei LEDs abwechselnd rot und grün leuchten. Gesteuert wird das Ganze über eine Endlosschleife in Scratch.
Scratch 2 bietet eine Unterstützung für verschiedene Hardwarekomponenten am GPIO-Port, die über ein Zusatzmodul einmal aktiviert werden muss. Klicken Sie dazu auf der Blockpalette auf Weitere Blöcke und dann auf Erweiterung hinzufügen. Wählen Sie hier die Erweiterung Pi GPIO und installieren Sie sie per Doppelklick. Scratch 2 Pi-GPIO-Erweiterung installieren Das Programm In Scratch braucht man beim Programmieren keinen Programmcode zu tippen.
Um das Programm selbst zusammenzubauen, klicken Sie auf der Blockpalette im mittleren Bereich des Scratch-Fensters oben auf das gelbe Symbol Steuerung. Dann werden in der Blockpalette die Blöcke zur Steuerung angezeigt. Ziehen Sie die Blöcke, die Sie brauchen, einfach aus der Blockpalette in das Skriptfenster in der rechten Bildschirmhälfte von Scratch. Der Block Wenn (grüne Fahne) angeklickt dient dazu, ein Programm zu starten. Der Block ist oben rund, passt also unter keinen anderen Block.
3. Tag 3. Tag Heute im Adventskalender • 1 LED gelb • 1 Widerstand 220 Ohm • 1 GPIO-Verbindungskabel Ampelschaltung mit Python Eine Verkehrsampel mit ihrem typischen Leuchtzyklus von Grün über Gelb nach Rot und dann über eine Lichtkombination Rot-Gelb wieder zu Grün ist mit drei LEDs leicht aufzubauen und zeigt, wie man in der beliebten Programmiersprache Python die GPIO-Pins am Raspberry Pi steuert.
Der erste Start von Mu. Ausschnitt aus den Python-Flashcards Das Programm Anstatt uns mit Programmiertheorie, Algorithmen und Datentypen aufzuhalten, schreiben wir gleich das erste kleine Programm in Python. Tippen Sie im Hauptfenster von Mu den abgebildeten Programmcode ein. Bereits beim Tippen sehen Sie interaktive Hilfetexte. Mu erkennt die Wörter und Standardfunktionen der Programmiersprache Python und zeigt Tipps zur Verwendung an.
Starten Sie das Programm mit dem Symbol Ausführen. So funktioniert es Dass das Programm funktioniert, lässt sich einfach ausprobieren. Jetzt stellen sich natürlich einige Fragen: Was passiert im Hintergrund? Was bedeuten die einzelnen Programmzeilen? Dieses erste Projekt zeigt die grundlegenden Elemente von Python und der RPi.GPIO-Bibiothek. #!/usr/bin/python Python-Programme, die über die Kommandozeile gestartet werden, müssen am Anfang immer obige Zeile enthalten.
print("Strg+C beendet das Programm") Jetzt wird eine kurze Bedienungsanleitung auf dem Bildschirm ausgegeben. Das Programm läuft automatisch. Die Tastenkombination [Strg]+[C] soll es beenden. Um abzufragen, ob der Benutzer mit [Strg]+[C] das Programm beendet, verwenden wir eine try... except-Abfrage. Dabei wird der unter try: eingetragene Programmcode zunächst normal ausgeführt.
4. Tag 4. Tag Heute im Adventskalender • Sieben-Segment-Anzeige Der Adventskalender enthält heute eine vierstellige Sieben-Segment-Anzeige, mit der sich Ziffern und einfache Symbole darstellen lassen. Solche Sieben-Segment-Anzeigen werden häufig in Digitaluhren genutzt, früher auch in Taschenrechnern. Tankstellen verwenden diese Anzeigetechnologie im großen Format. Allerdings sind hier oft statt LEDs mechanische Anzeigeelemente im Einsatz.
Die folgende Tabelle zeigt, welche Pins der Sieben-Segment-Anzeige mit welchen GPIO-Pins verbunden sind. Die grau hinterlegten Pins werden in diesem Programm nicht verwendet. In diesem Programm werden nur die drei waagerechten Segmente A, G und D über Vorwiderstände an GPIO-Pins angeschlossen. Die Ziffer 1 ist mit GND verbunden, damit die Segmente der ersten Ziffer blinken. Das Programm Das Programm 04seg7.py lässt die drei LEDs der waagerechten Segmente A, G und D abwechselnd nacheinander blinken.
5. Tag 5. Tag Heute im Adventskalender • 1 GPIO-Verbindungskabel Lauflicht auf der Sieben-Segment-Anzeige Das Experiment des 5. Tags lässt das mittlere Segment aller vier Ziffern der Sieben-Segment-Anzeige als Lauflicht aufleuchten. Dazu werden die Kathoden der Ziffern vom Programm abwechselnd umgeschaltet, während die Anode für das Segment immer eingeschaltet bleibt.
6. Tag Heute im Adventskalender 6. Tag • 3 GPIO-Verbindungskabel Noch ein Lauflicht auf der Sieben-Segment-Anzeige Das Experiment des 6. Tags lässt alle Segmente der ersten Ziffer der Sieben-Segment-Anzeige als Lauflicht aufleuchten. Durch einen Schaltungstrick ist das mit nur einem Vorwiderstand möglich.
So funktioniert es Für die sieben Segmente der Anzeige wird eine Variable vom Typ dictionary, eine besondere Form der Liste, verwendet. In einem dictionary werden die einzelnen Elemente nicht über ihre Nummer ausgewählt, sondern über ein beliebiges Wort, den sogenannten Schlüssel, der auch aus einem einzigen Buchstaben bestehen kann. Im Gegensatz zu einer einfachen Liste steht ein dictionary in geschweiften Klammern. Es kann beliebig viele Paare aus Schlüssel und Wert enthalten.
7. Tag Heute im Adventskalender 7. Tag • 1 Widerstand 220 Ohm • Schaltdraht Schaltdraht Heute ist Schaltdraht im Adventskalender enthalten. Damit stellen Sie kurze Verbindungsbrücken her, mit denen Kontaktreihen auf der Steckplatine verbunden werden. Schneiden Sie den Draht mit einem kleinen Seitenschneider je nach Experiment auf die passenden Längen ab. Um die Drähte besser in die Steckplatine stecken zu können, empfiehlt es sich, sie leicht schräg abzuschneiden, sodass eine Art Keil entsteht.
Das Programm Das Programm 07seg7.py lässt auf allen vier Ziffern ein Lauflicht über die unteren vier Segmente (C, D, E, G) laufen. #!/usr/bin/python import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) seg={'a':21, 'b':8, 'c':11, 'd':26, 'e':19, 'f':20, 'g':13} for s in "abcdefg": GPIO.setup(seg[s], GPIO.OUT, initial=0) zif=16 GPIO.setup(zif, GPIO.OUT, initial=0) print("Strg+C beendet das Programm") try: while True: for s in "cdeg": GPIO.output(seg[s], 1) time.sleep(0.1) GPIO.
8. Tag Heute im Adventskalender 8. Tag • 3 Widerstände 220 Ohm Sieben-Segment-Anzeige mit Scratch steuern Das Programm des 8. Tags steuert die Segmente der Sieben-SegmentAnzeige interaktiv und einzeln mit Scratch. Dazu werden neue, bisher noch nicht beschriebene Programmiertechniken von Scratch vorgestellt.
Das erste Segment im Malprogramm von Scratch 2 Bearbeiten Sie das Kostüm ein mit dem Malprogramm. Füllen Sie die farbige Fläche mit dem Farbeimersymbol mit Rot, um die eingeschaltete LED darzustellen. Kostüm für eine ausgeschaltete LED im Malprogramm Die beiden Kostüme der ersten Figur. Benennen Sie die Figur in der Figurenpalette links unten in A um, da sie das A-Segment der SiebenSegment-Anzeige darstellt. Klicken Sie dazu auf das blaue Info-Symbol.
Drehen Sie die neue Figur um 90°, da sie das senkrechte Segment B darstellt. Drehen Sie dazu nicht die Kostüme, sondern die ganze Figur. Schalten Sie auf die Registerkarte Skripte um und tragen Sie dort auf der Blockpalette Bewegung im Block Drehe dich im Uhrzeigersinn um ... Grad die 90 ein. Sie brauchen den Block nicht in das Programm zu ziehen. Klicken sie einfach doppelt darauf, wird er ausgeführt und die Figur gedreht. Schieben Sie die Figur anschließend an die passende Stelle neben das Segment A.
9. Tag 9. Tag Heute im Adventskalender • 1 GPIO-Verbindungskabel Zahlen auf der Sieben-Segment-Anzeige Der eigentliche Sinn und Zweck einer Sieben-Segment-Anzeige ist in den meisten Fällen keine grafische Spielerei, sondern die Darstellung von Zahlen. Das Programm des 9. Tags zeigt, wie das funktioniert. Der Schaltungsaufbau ist der gleiche wie am 8. Tag, nur verwenden wir diesmal Python statt Scratch. Das Programm Das Programm 09zahl.
So funktioniert es Auch in diesem Programm werden die GPIO-Pins für die sieben Segmente über ein dictionary initialisiert. zahl=[ "abcdef", "bc", "abdeg", "abcdg", "bcfg", "acdfg", "acdefg", "abc", "abcdefg", "abcdfg", ] #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 Die Liste zahl legt die einzuschaltenden Segmente für die einzelnen Ziffern von 0 bis 9 fest. Es handelt sich um eine normale Liste, deren Elemente nur der Übersichtlichkeit halber untereinander geschrieben sind.
10. Tag 10. Tag Heute im Adventskalender • 1 GPIO-Verbindungskabel Mehrstellige Zahlen auf der Sieben-Segment-Anzeige Das vorige Experiment nutzte alle vier Ziffern der Sieben-SegmentAnzeige gleichzeitig. Wesentlich interessanter ist es, alle vier Ziffern eigenständig zu verwenden, um verschiedene Ziffern darzustellen.
zif=[16, 12, 7, 6] for z in zif: GPIO.setup(z, GPIO.OUT, initial=1) zahl=[ "abcdef", "bc", "abdeg", "abcdg", "bcfg", "acdfg", "acdefg", "abc", "abcdefg", "abcdfg", ] #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 print("Strg+C beendet das Programm") try: while True: for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[i+1]: GPIO.output(seg[s], 1) time.sleep(0.001) GPIO.output(zif[i], 1) except KeyboardInterrupt: GPIO.
11. Tag 11. Tag Heute im Adventskalender • 1 GPIO-Verbindungskabel Der Schaltungsaufbau ist der gleiche wie am 10. Tag. Beliebige Zahlen anzeigen Im letzten Programm war die Zahl 1234 fest im Programm eingetragen. Das nächste Programm bietet die Möglichkeit, beliebige Zahlen einzugeben und darzustellen. Dabei werden auch Möglichkeiten gezeigt, Fehler bei der Benutzereingabe zu korrigieren. Das Programm Das Programm 11zahl.
if s[i].isdigit(): z[i] = int(s[i]) else: z[i] = 0 sek = time.time() while time.time() <= sek + 2: za() except KeyboardInterrupt: GPIO.cleanup() So funktioniert es Große Teile des Programms sind vom 10. Tag bekannt. Alles, was die Initialisierung der GPIO-Ports und die Liste zur Darstellung der Ziffern auf den sieben Segmenten der Anzeige betrifft, ist aus dem letzten Programm übernommen. z = [0,0,0,0] Die Liste z[] enthält im Verlauf des Programms vier Ziffern, die angezeigt werden sollen.
s = s.zfill(4) Um das Problem abzufangen, dass der Benutzer möglicherweise weniger als vier Zeichen eingibt oder sogar einfach nur die [Enter]-Taste drückt, wird die Zeichenkette bis auf vier Stellen am Anfang mit Nullen aufgefüllt. Damit ist die Zeichenkette s immer mindestens vier Stellen lang. for i in range(4): Jetzt beginnt eine Schleife, die für jede der vier Stellen der Anzeige eine gültige Ziffer ermittelt und in die Liste z[] schreibt.
12. Tag Heute im Adventskalender 12. Tag • 1 GPIO-Verbindungskabel Der Schaltungsaufbau ist der gleiche wie an den letzten Tagen. Countdown bis Weihnachten Das Programm des 12. Tags zeigt auf der Sieben-Segment-Anzeige an, wie viele Tage es noch bis Weihnachten sind. Das Programm Das Programm 12countdown.py verwendet ein paar neue Python-Elemente zur Datumsberechnung. #!/usr/bin/python import RPi.GPIO as GPIO import time, datetime GPIO.setmode(GPIO.
13. Tag 13. Tag Heute im Adventskalender • 1 Taster • 1 Widerstand 10 kOhm Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den letzten Tagen. Taster an einem GPIO-Pin anschließen GPIO-Pins können nicht nur Daten ausgeben, zum Beispiel über LEDs, sondern auch zur Dateneingabe verwendet werden. Dazu müssen sie im Programm als Eingang definiert werden. Zur Eingabe verwenden wir im nächsten Projekt einen Taster, der direkt auf die Steckplatine gesteckt wird.
seg={'a':21, 'b':8, 'c':11, 'd':26, 'e':19, 'f':20, 'g':13} for s in "abcdefg": GPIO.setup(seg[s], GPIO.OUT, initial=0) zif=[16, 12, 7, 6] for z in zif: GPIO.setup(z, GPIO.OUT, initial=1) zahl=[ "abcdef", "bc", "abdeg", "abcdg", "bcfg", "acdfg", "acdefg", "abc", "abcdefg", "abcdfg", ] #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 taster=18 GPIO.setup(taster, GPIO.IN, GPIO.PUD_DOWN) z=[0,0,0,0] def za(): for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.
So funktioniert es Der Taster am Pin 18 wird als GPIO-Eingang definiert. Die Pin-Nummer wird in der Variable taster gespeichert. taster=18 GPIO.setup(taster, GPIO.IN, GPIO.PUD_DOWN) Das Programm verwendet wieder die aus einem früheren Programm bekannte Funktion za() zur Anzeige einer vierstelligen Zahl auf der Sieben-Segment-Anzeige. t=datetime.date(2019, 12, 24) - datetime.date.today() x=t.
14. Tag Heute im Adventskalender 14. Tag • 1 Taster Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den letzten Tagen. Taster ohne externe Pulldown-Widerstände anschließen Aktuelle Raspberry-Pi-Modelle verfügen über eingebaute PulldownWiderstände, die softwareseitig ein- und ausgeschaltet werden können. Damit spart man sich den externen Widerstand. Der Taster kann direkt zwischen +3,3V und dem GPIO-Pin angeschlossen werden, wie das Experiment des 14. Tags erklärt.
GPIO.setup(taste2, GPIO.IN, GPIO.PUD_DOWN) z=[0,0,0,0] def za(): for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.output(seg[s], 1) time.sleep(0.001) GPIO.output(zif[i], 1) print("Zum Start des Countdowns und zum Neustart Taste 1 drücken") print("Zum Beenden Taste 2 drücken") while True: t=datetime.date(2019, 12, 24) - datetime.date.today() x=t.days z[0]=int(x/1000) z[1]=int(x%1000/100) z[2]=int(x%100/10) z[3]=int(x%10) if GPIO.
So funktioniert es Die Initialisierung der GPIO-Pins und die Liste zur Darstellung der Ziffern auf den sieben Segmenten der Anzeige werden aus dem letzten Programm übernommen. taste1=18 GPIO.setup(taste1, GPIO.IN, GPIO.PUD_DOWN) taste2=4 GPIO.setup(taste2, GPIO.IN, GPIO.PUD_DOWN) Anschließend werden die GPIO-Pins der beiden Taster initialisiert. Der Parameter GPIO.PUD_DOWN bei der Initialisierung der GPIO-Pins für die Taster schaltet den eingebauten Pulldown-Widerstand ein.
15. Tag 15. Tag Heute im Adventskalender • 1 GPIO-Verbindungskabel Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den letzten Tagen. Zahlen mit Scratch auf der Sieben-Segment-Anzeige Das Programm des 15. Tags zeigt, wie sich mit Scratch Ziffern auf einer Sieben-Segment-Anzeige darstellen lassen. Scratch ist leider auch im Turbo-Modus nicht schnell genug, per Zeitmultiplex alle vier Ziffern der Anzeige zu steuern. Das Programm zeigt deshalb immer nur eine einzelne Ziffer an.
Zustand der GPIO-Pins, wenn der Benutzer eine 0 eingegeben hat. Ähnliche Abfragen folgen für alle weiteren Ziffern. Dabei werden immer alle sieben Segmente geschaltet, nicht nur die benötigten, damit keine der letzten dargestellten Ziffern übrigbleibt. Die Scratch-Katze fragt nach einer Zahl. Blöcke duplizieren Beim Bau eines Scratch-Programms brauchen Sie ähnliche Blockkombinationen nicht jedes Mal neu anzulegen. Klicken Sie mit der rechten Maustaste auf den ersten Block, der dupliziert werden soll.
16. Tag 16. Tag Heute im Adventskalender • 1 Widerstand 220 Ohm Digitaluhr Im Experiment des 16. Tags bauen wir eine funktionsfähige Digitaluhr, die die aktuelle Zeit auf der Sieben-Segment-Anzeige anzeigt. Die Digitaluhr kann automatisch auf dem Raspberry Pi laufen, ohne dass Monitor und Tastatur angeschlossen sind.
"bcfg", "acdfg", "acdefg", "abc", "abcdefg", "abcdfg", ] #4 #5 #6 #7 #8 #9 z = [0,0,0,0] print("Strg+C beendet das Programm") def za(): for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.output(seg[s], 1) if i == 1: GPIO.output(dp, 1) else: GPIO.output(dp, 0) time.sleep(0.001) GPIO.output(zif[i], 1) try: while True: zeit = time.localtime() h = zeit.tm_hour m = zeit.
try: while True: zeit = time.localtime() In jedem Durchlauf wird, unabhängig davon, wie lange er dauert, die aktuelle Zeit in das Objekt zeit geschrieben. Dazu wird die Funktion time.localtime() aus der time-Bibliothek verwendet. Das Ergebnis ist eine Datenstruktur, die aus verschiedenen Einzelwerten besteht. h = zeit.tm_hour m = zeit.tm_min Die beiden für die Digitaluhr relevanten Werte, Stunden und Minuten, werden aus der Struktur in die Variablen h und m geschrieben.
17. Tag Heute im Adventskalender 17. Tag • 1 GPIO-Verbindungskabel Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie am vorherigen Tag, obwohl die Ziffer ganz rechts nicht benutzt wird. IP-Adresse des Raspberry Pi anzeigen Wer einen Raspberry Pi ohne Tastatur und Monitor nur über das Netzwerk betreibt, braucht dessen IP-Adresse, um die SSH-Verbindung aufbauen zu können. Diese Adresse kann man mit Netzwerkscannersoftware herausfinden.
"acdefg", "abc", "abcdefg", "abcdfg", ] #6 #7 #8 #9 z = [0,0,0] ip = os.popen("hostname -I").readline()[:-2].split(".") print("Strg+C beendet das Programm") def za(): for i in range(3): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.output(seg[s], 1) time.sleep(0.001) GPIO.output(zif[i], 1) for s in "abcdefg": GPIO.output(seg[s], 0) for k in range(3): GPIO.output(zif[k], 0) GPIO.output(dp, 1) time.sleep(0.5) GPIO.
def blink(): for s in "abcdefg": GPIO.output(seg[s], 0) for k in range(3): GPIO.output(zif[k], 0) GPIO.output(dp, 1) time.sleep(0.5) GPIO.output(dp, 0) Zusätzlich wird eine Funktion blink() definiert, die die drei Dezimalpunkte der verwendeten Ziffern 0,5 Sekunden lang aufblinken lässt. Dazu werden zunächst alle sieben Segmente auf 0 gesetzt und damit ausgeschaltet. Danach werden die Kathoden der ersten drei Ziffern auf 0 und der Dezimalpunkt auf 1 gesetzt. Jetzt leuchten die drei Dezimalpunkte.
18. Tag 18. Tag Heute im Adventskalender • 1 Taster Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Stoppuhr Das Experiment des 18. Tags ist eine Stoppuhr mit drei Tasten. Die erste Taste startet die Stoppuhr, die zweite stoppt auf Zehntelsekunden genau und die dritte setzt die gemessene Zeit wieder auf 0 zurück.
def za(): for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.output(seg[s], 1) if i == 2: GPIO.output(dp, 1) else: GPIO.output(dp, 0) time.sleep(0.001) GPIO.output(zif[i], 1) try: while True: z = [0,0,0,0] while GPIO.input(t1)==0: za() start = time.time() while GPIO.input(t2)==0: zeit = time.time() - start z[0] = int(zeit % 1000 / 100) z[1] = int(zeit % 100 / 10) z[2] = int(zeit % 10) z[3] = int(zeit * 10 % 10) while int((time.
if i == 2: GPIO.output(dp, 1) else: GPIO.output(dp, 0) Diese Funktion ist etwas verändert. Immer wenn die dritte Ziffer leuchtet, wird zusätzlich der Dezimalpunkt eingeschaltet. Bei den anderen Ziffern bleibt er aus. start = time.time() Drückt der Benutzer die Taste 1, endet die erste while-Schleife. Die aktuelle Zeit in Sekunden wird in der Variable start gespeichert. Aus dieser Zeit wird jetzt immer die aktuelle Zeit der Stoppuhr errechnet, die durch Drücken der Taste 1 gestartet wurde.
19. Tag Heute im Adventskalender 19. Tag • 1 Widerstand 20 MOhm (rot-schwarz-blau) • 1 Knete Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Sensorkontakt aus Knete Ampeln, Türöffner, Lichtschalter und Automaten werden heute oft mit Sensorkontakten gesteuert, die man nur zu berühren braucht. Taster, die wirklich gedrückt werden müssen, werden immer seltener.
Das Programm Das Programm 19stoppuhr.py ähnelt dem Programm des 18. Tags, aber mit dem Unterschied, dass für Start, Stopp und Reset nur ein einziger Sensorkontakt verwendet wird. #!/usr/bin/python import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) seg={'a':21, 'b':8, 'c':11, 'd':26, 'e':19, 'f':20, 'g':13} for s in "abcdefg": GPIO.setup(seg[s], GPIO.OUT, initial=0) zif=[16, 12, 7, 6] for z in zif: GPIO.setup(z, GPIO.OUT, initial=1) dp = 5 GPIO.setup(dp, GPIO.OUT, initial=0) k1=4 GPIO.
z[1] = int(zeit % 100 / 10) z[2] = int(zeit % 10) z[3] = int(zeit * 10 % 10) while int((time.time() - start) * 10 % 10) == z[3]: za() while GPIO.input(k1)==0: pass while GPIO.input(k1)==1: za() while GPIO.input(k1)==0: pass except KeyboardInterrupt: GPIO.cleanup() So funktioniert es Das Programm basiert auf bereits bekannten Elementen, auch die Initialisierung der GPIO-Pins für die Sieben-Segment-Anzeige läuft wie an den vorherigen Tagen. k1=4 GPIO.setup(k1, GPIO.
20. Tag 20. Tag Heute im Adventskalender • 1 Widerstand 20 MOhm (rot-schwarz-blau) Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Zähler mit Sensorkontakten Das Experiment des 20. Tags ist ein einfacher Zähler auf der SiebenSegment-Anzeige, der mit zwei Sensorkontakten gesteuert wird. Der eine Sensorkontakt zählt den Zähler hoch, der andere herunter. Die Sensorkontakte sind an den GPIO-Pins 17 und 4 angeschlossen.
def za(n): z[0] = int(n / 1000) z[1] = int(n % 1000 / 100) z[2] = int(n % 100 / 10) z[3] = int(n % 10) for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.output(seg[s], 1) time.sleep(0.001) GPIO.output(zif[i], 1) try: while True: za(x) if GPIO.input(k1)==0 and x>0: x-=1 if GPIO.input(k2)==0 and x<9999: x+=1 except KeyboardInterrupt: GPIO.cleanup() So funktioniert es Auch dieses Programm basiert zu großen Teilen auf früheren Programmen.
try: while True: za(x) Die Hauptschleife des Programms zeigt in jedem Durchlauf über die Funktion za(x) den aktuellen Wert des Zählers x auf der Sieben-Segment-Anzeige an. if GPIO.input(k1)==0 and x>0: x-=1 Wird der Sensorkontakt k1 berührt und ist der Zähler noch größer als 0, wird er um 1 verringert. Auf diese Weise wird sichergestellt, dass der Zähler keine negativen Werte erreicht. if GPIO.
21. Tag Heute im Adventskalender 21. Tag • Downloadcode Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Der Raspberry Pi erzeugt Töne Der Raspberry Pi kann über einen HDMI-Monitor, einen externen Lautsprecher oder Kopfhörer an der analogen 3,5-mm-Klinkenbuchse Musik abspielen.
Die Programmblöcke starten nicht bei Klick auf das grüne Fähnchen, sondern jedes Mal, wenn die entsprechende Taste angeklickt wird. Markieren Sie in der Figurenliste die Taste C und ziehen Sie aus der Blockpalette Ereignisse den Block Wenn ich angeklickt werde ins Skriptfenster. Alle Blöcke darunter werden immer dann ausgeführt, wenn die Figur - hier die Taste C - angeklickt wird. Damit man deutlich sieht, dass eine Klaviertaste gedrückt wurde, soll sie kurz etwas abgedunkelt erscheinen.
Zeichnen Sie die erste schwarze Taste als ausgefülltes Rechteck und etwas kleiner als die weißen Tasten. Verwenden Sie auch hier den Modus Vektorgrafik. Schieben Sie diese Taste zwischen die ersten beiden weißen Tasten, sodass die oberen Kanten miteinander abschließen. Die Programmblöcke der schwarzen Tasten sind weitgehend gleich, wie bei den weißen Tasten. Die schwarzen Klaviertasten müssen beim Anklicken etwas heller und nicht dunkler werden, damit sie gut zu erkennen sind.
22. Tag 22. Tag Heute im Adventskalender • 2 Widerstände 220 Ohm Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Der Dezimalpunkt wird nicht verwendet. Ampel mit Countdown Das Experiment des 22. Tags simuliert eine Ampel mit drei LEDs. Während der Grünphase zeigt ein Countdown, wie viel Zeit man noch hat.
Eine Variable z wird in einer Countdownschleife heruntergezählt. Sie enthält in jedem Durchlauf die anzuzeigende Zahl. Variablen in Scratch Variablen sind kleine Speicherplätze, in denen sich ein Programm eine Zahl oder irgendetwas anderes merkt. Wenn das Programm beendet wird, werden diese Variablenspeicher automatisch geleert. Variablen müssen in Scratch erst einmal mit einem Klick auf Neue Variable auf der Blockpalette Daten angelegt werden, bevor man sie benutzen kann.
Der neue Block auf der Blockpalette Im Hauptprogramm wird, nachdem die grüne LED der Ampel eingeschaltet wurde, als erstes der Countdown-Zähler z auf 9 gesetzt. Danach startet eine Schleife, die so oft läuft, bis der Zähler z kleiner als 0 ist. In jedem Schleifendurchlauf wird der selbstgebaute Block ziffer ... mit der aktuellen Zahl z des Countdowns aufgerufen, damit diese Zahl angezeigt wird.
Das ganze Programm im Überblick
23. Tag 23. Tag Heute im Adventskalender • 3 GPIO-Verbindungskabel Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Der Dezimalpunkt wird auch verwendet. Zahlenraten mit drei Tasten Das ein einfaches Ratespiel, in dem eine vom Computer zufällig gewählte Zahl vom Spieler in möglichst wenigen Schritten erraten werden soll. Die LEDs sind an den GPIO-Pins 24 und 23 angeschlossen, die Taster an den GPIO-Pins 18, 17 und 4.
LED1=24 GPIO.setup(LED1, GPIO.OUT, initial=0) LED2=23 GPIO.setup(LED2, GPIO.OUT, initial=0) t1=18 t2=17 t3=4 GPIO.setup(t1, GPIO.IN, GPIO.PUD_DOWN) GPIO.setup(t2, GPIO.IN, GPIO.PUD_DOWN) GPIO.setup(t3, GPIO.IN, GPIO.
def za(n): z[0] = int(n / 1000) z[1] = int(n % 1000 / 100) z[2] = int(n % 100 / 10) z[3] = int(n % 10) for i in range(4): for s in "abcdefg": GPIO.output(seg[s], 0) GPIO.output(zif[i], 0) for s in zahl[z[i]]: GPIO.output(seg[s], 1) if i == 1: GPIO.output(dp, 1) else: GPIO.output(dp, 0) time.sleep(0.001) GPIO.output(zif[i], 1) Die Funktion za(n) zur Anzeige einer vierstelligen Zahl ist ähnlich aufgebaut wie im Programm des 20. Tags. Zusätzlich leuchtet der Dezimalpunkt hinter der zweiten Ziffer.
• Ist die gesuchte Zahl y kleiner als der abgegebene Tipp, leuchtet die linke von beiden LEDs eine halbe Sekunde lang. if y>x: GPIO.output(LED2, 1) time.sleep(0.5) GPIO.output(LED2, 0) • Ist die gesuchte Zahl y größer als der abgegebene Tipp, leuchtet die rechte von beiden LEDs eine halbe Sekunde lang. if y==x: for i in range(5): GPIO.output(LED1, 1) GPIO.output(LED2, 1) for j in range(100): za(x * 100 + t) GPIO.output(LED1, 0) GPIO.
24. Tag 24. Tag Heute im Adventskalender • 1 Taster • Downloadcode Das Anschlussschema der Sieben-Segment-Anzeige ist das gleiche wie an den vorherigen Tagen. Der Dezimalpunkt wird nicht verwendet. Weihnachtslieder auf dem Raspberry Pi Das Experiment des 24. Tags spielt beim Drücken einer Taste ein Weihnachtslied. Vier verschiedene Lieder stehen zur Auswahl. Über den Downloadcode im Adventskalender heute können Sie sich Weihnachtslieder im mp3-Format herunterladen.
t4=17 GPIO.setup(t1, GPIO.setup(t2, GPIO.setup(t3, GPIO.setup(t4, zahl=[ "abcdef", "bc", "abdeg", "abcdg", "bcfg", "acdfg", "acdefg", "abc", "abcdefg", "abcdfg", ] GPIO.IN, GPIO.IN, GPIO.IN, GPIO.IN, GPIO.PUD_DOWN) GPIO.PUD_DOWN) GPIO.PUD_DOWN) GPIO.PUD_DOWN) #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 print("Strg+C beendet das Programm") def za(n): for s in "abcdefg": GPIO.output(seg[s], 0) for i in range(4): GPIO.output(zif[i], 1) if n!=0: for s in zahl[n]: GPIO.output(seg[s], 1) GPIO.
So funktioniert es Zusätzlich zu den bereits bekannten Bibliotheken wird die Bibliothek subprocess importiert. Damit ist es möglich, Linux-Komandozeilenprogramme aus einem Python-Programm heraus zu starten. def za(n): for s in "abcdefg": GPIO.output(seg[s], 0) for i in range(4): GPIO.output(zif[i], 1) if n!=0: for s in zahl[n]: GPIO.output(seg[s], 1) GPIO.output(zif[n-1], 0) Die Sieben-Segment-Amzeige soll die Nummer des Liedes anzeigen.
Vorsichtsmaßnahmen Auf keinen Fall irgendwelche GPIO-Pins miteinander verbinden und abwarten, was passiert. Nicht alle GPIO-Pins lassen sich frei programmieren. Einige sind für die Stromversorgung und andere Zwecke fest eingerichtet. Einige GPIO-Pins sind direkt mit Anschlüssen des Prozessors verbunden, ein Kurzschluss kann den Raspberry Pi komplett zerstören. Verbindet man über einen Schalter oder eine LED zwei Pins miteinander, muss immer ein Schutzwiderstand dazwischengeschaltet werden.