Aus Raspberry Pi Geek 06/2013

GPIO-Pins unter Scratch verwenden (Seite 2)

Listing 1

 

$ sudo wget https://dl.dropbox.com/s/oql4qzm8jlnsbeb/install_scratch_gpio2.sh -O /boot/install_scratch_gpio2.sh
$ sudo /boot/install_scratch_gpio2.sh

Das Resultat der Aktion ist eine neue Instanz von Scratch, die auf dem RasPi-Desktop als ScratchGPIO2 auftaucht. Die Scratch-Entwicklungsumgebung selbst hat sich nicht verändert, aber es liegen jetzt einige zusätzliche Python-Skripts in /home/pi, die den Remote Sensor Extensions (RSC) von Scratch ermöglichen, mit den GPIO-Pins zu kommunizieren. Starten Sie ScratchGPIO, dann erscheint als Erstes ein Dialog, der meldet, dass die Remote Sensor Extensions nun aktiviert sind. Dies quittieren Sie einfach per OK.

Vorab noch eine Warnung: Der Umgang mit den GPIO-Pins ist nicht ungefährlich – Sie können damit bei falscher Verkabelung ihren Raspberry Pi durchaus “grillen”.

Ein einfaches Pong-Spiel

Für dieses Projekt brauchen Sie ein Breadboard, drei 330-Ohm-Resistoren, je eine grüne und rote LED, einen Schalter und einige Kabel. Das Breadboard sorgt dafür, dass Ihnen das Löten erspart bleibt.

Um die Sache zu vereinfachen, verwenden wir als Grundlage ein bereits existierendes Spiel aus dem Beispiel-Fundus von Scratch. Sie öffnen das entsprechende Skript über File | Open | Examples | Games | Pong. Bevor Sie das Spiel für die Verwendung der GPIO-Pins modifizieren, werfen Sie erst einmal einen kurzen Blick auf die Skripts, welche die Sprites für Schläger (Abbildung 2) und Ball (Abbildung 3) steuern, damit Sie sehen, wie diese agieren.

Abbildung 2: Das Skript für das Schläger-Sprite im Scratch-Spiel Pong.

Abbildung 2: Das Skript für das Schläger-Sprite im Scratch-Spiel Pong.

Abbildung 3: Das Skript für das Ball-Sprite im Scratch-Spiel Pong.

Abbildung 3: Das Skript für das Ball-Sprite im Scratch-Spiel Pong.

Das Schläger-Skript zeigt ein in Scratch sehr häufig verwendetes Konzept, das der Koordinaten. Die Bühne bemisst sich auf 480 Pixel Breite und 360 Pixel Höhe. Die interne Variable mouse x übergibt die x-Koordinate des Mauszeigers an den Schläger, sodass dieser sich stets an die entsprechende Stelle bewegt.

Den Löwenanteil der Arbeit übernehmen das Ball-Sprite und das zugehörige Skript. Beim Start über das Anklicken der grünen Flagge rechts oberhalb der Bühne setzt die erste Anweisung, go to x: y:, den Ball auf seine Ausgangsposition. Scratch-typisch merkt es sich dabei die letzte verwendete Position. Soll ein Sprite also jedes Mal an einer bestimmten Koordinate starten, müssen Sie den entsprechenden Wert zu Beginn explizit setzen.

GPIO-Anbindung

Der Aufdruck des RasPi-Boards identifiziert die GPIO-Pins als Gruppe P1. Diese besteht aus zwei Reihen zu je 13 Stiften, die – halten Sie das Board so, dass Sie das “P1” lesen können – von links nach rechts durchnummeriert sind. Ungerade Zahlen (1 bis 13) bezeichnen die untere Pin-Reihe, gerade (2 bis 26) die obere (Abbildung 4).

Abbildung 4: Die GPIO-Gruppe P1 umfasst zwei Reihen mit je 13 Stiften, wobei die Pins mit geradzahligen Nummern oben liegen, die mit ungeradzahligen unten. Die Nummerierung beginnt linkerhand, die Pins 2 und 1 liegen also ganz links, 26 und 13 ganz rechts.

Abbildung 4: Die GPIO-Gruppe P1 umfasst zwei Reihen mit je 13 Stiften, wobei die Pins mit geradzahligen Nummern oben liegen, die mit ungeradzahligen unten. Die Nummerierung beginnt linkerhand, die Pins 2 und 1 liegen also ganz links, 26 und 13 ganz rechts.

Über die GPIO-Anbindung wollen wir nun erreichen, dass bei jedem Game Over eine rote LED aufleuchtet, bei jedem Ballkontakt des Schlägers dagegen eine grüne. Abbildung 5 zeigt die beiden dazu notwendigen Stromkreise auf dem Breadboard. Die rote LED ist mir Pin 12 verbunden, die grüne mit Pin 11. Den Pin 6 verbinden Sie mit auf dem Breadboard mit Erde. Für jede LED sorgen zwischengeschaltete Resistoren dafür, dass sie nicht durchbrennt.

Abbildung 5: Das Breadboard samt LEDs und Verkabelung. Die grüne LED steckt in Reihe 8 und ist mit dem GPIO-Pin 11 über ein Kabel nach J8 verbunden. Die rote LED in Reihe 24 hängt via J24 an Pin 12 des RasPi. Das ganz rechts unten am Breadboard angeschlossene Kabel erdet den Schaltkreis und hängt am GPIO-Pin 6.

Abbildung 5: Das Breadboard samt LEDs und Verkabelung. Die grüne LED steckt in Reihe 8 und ist mit dem GPIO-Pin 11 über ein Kabel nach J8 verbunden. Die rote LED in Reihe 24 hängt via J24 an Pin 12 des RasPi. Das ganz rechts unten am Breadboard angeschlossene Kabel erdet den Schaltkreis und hängt am GPIO-Pin 6.

Zum Ansteuern der LEDs benötigen Sie den Code-Block broadcast aus der Palette Control. Ziehen Sie den Block nach innen ins mittlere Feld des Scratch-Fensters, und lassen Sie ihn dort unten an der Schleife forever if touching paddle? einschnappen. Um den Broadcast zu verwenden, gilt es, noch eine Nachricht zu erstellen, indem Sie auf den nach unten weisenden Pfeil im Block klicken und new anwählen. In der nun erscheinenden Dialogbox geben Sie als Nachrichtenname pin11on ein und bestätigen mit OK.

Wenn Sie nun durch Anklicken der grünen Flagge ein Spielchen wagen und dabei mit dem Schläger den Ball treffen, dann leuchtet die grüne LED hoffentlich auf. Zwar geht sie nicht mehr aus, aber darum kümmern wir uns gleich. Unangenehmer ist, wenn sie gar nicht erst aufleuchtet: Dann ist Troubleshooting angesagt, einige Hinweise dazu liefert der Kasten “Kleine Widrigkeiten”.

Kleine Widrigkeiten

Leuchtet die LED nicht auf, prüfen Sie als Erstes, ob alle Kabelverbindungen sitzen und der Schaltkreis auch geerdet ist. Testen Sie die LED, indem Sie sie versuchsweise mit Pin 1 statt mit Pin*11 verbinden. Leuchtet Sie auf und bleibt an, passt der Schaltkreis. Bleibt sie dunkel, drehen Sie die Diode auf dem Breadboard um 180 Grad: Sie hat ein längeres und ein kürzeres Bein, das kurze muss geerdet sein.

ScratchGPIO2 bringt zum Debugging das Skript blink11.py mit, das Sie unter /home/pi/blink11.py finden. Wechseln Sie also dorthin, und rufen Sie das Skript mit sudo python blink11.py auf. Stimmt alles, sollte die LED nun blinken.

Als letzte Fehlerquelle kommt noch der Aufruf im Programm infrage: Prüfen Sie hier, dass die Broadcast-Nachricht auch wirklich pin11on lautet – ohne Leerzeichen.

Jetzt blinkt’s

Nun ändern Sie das Skript so ab, dass die LED blinkt, statt hell zu bleiben. Dazu ziehen Sie einen wait-Block ins Skript, gefolgt von einem zweiten broadcast-Block mit der Nachricht pin11off. Den entsprechend modifizierten Code zeigt Abbildung 6. Durch Ändern des Werts im wait-Block beeinflussen Sie, wie lange die grüne LED an bleibt.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben