deutsch     english     français     Drucken

 

11.7 RASPBERRY PI

 

 

EINFÜHRUNG

 
TigerJython  kannst du auf dem Raspberry Pi verwenden, um die Programmiersprache Python zu erlernen oder auf das Soundsystem und den GPIO-Port zuzugreifen. TigerJython startet zwar etwas langsamer als das vorinstallierte Python mit IDLE, dafür steht dir eine ausgereifte grafische Entwicklungsumgebung mit vielen bereits integrierten Bibliotheksroutinen (Turtlegrafik, Robotik, Game-Entwicklung, usw.) zur Verfügung.
 

 

 

INSTALLATION

 

Am einfachsten lädst du von http://www.raspberrypi.org/downloads den Betriebssystem-Installer NOOS herunter, kopierst den Inhalt auf eine mindestens 8 GB grosse SD-Karte und wählst beim Start das Betriebssystem Raspbian (eine Linux Debian Variante). Da die Distribution bereits ein JRE enthält, brauchst du nur tigerjython2.jar in ein Verzeichnis, z.B. /home/pi/tigerjython zu kopieren und der Datei mit dem File Manager unter Dateieigenschaften Ausführungsrechte zu geben.

Um TigerJython zu starten, tippst du in einem Terminal (Console) folgenden Befehl ein:

java -jar /home/pi/tigerjython/tigerjython2.jar

Für die Verwendung des GPIO-Moduls benötigt TigerJython Administratorrechte. Darum startest du TigerJython am besten immer mit vorgestelltem sudo:

sudo java -jar /home/pi/tigerjython/tigerjython2.jar

Statt jedesmal diese Befehlszeile einzutippen, kannst du im File Manager angeben, dass für Dateien von Dateityp .jar immer dieser Befehl auszuführen ist oder ein Shell-Skript erstellen. Noch einfacher ist es, einen Desktop-Link zu machen, wobei du dabei wie folgt vorgehst:

  • Erstelle mit mit einem rechten Mausklick auf die Ikone IDLE durch Kopieren und Einfügen ein neues Link-Symbol auf dem Desktop.

  • Um das zughörige Link-Skript zu editieren, klickst du mit der rechten Maustaste auf dieses Symbol und wählst Leafpad. Du kannst nun die Einträge entsprechend anpassen und sogar ein TigerJython-Logo angeben (download). Hier ein Beispiel:

Nach dem Speichern kannst du TigerJython mit einem Klick auf die neue Ikone starten. Dabei brauchst du auf dem etwas schmalbrüstigen Raspberry Pi etwa 1 Minute Geduld, bis die IDE gestartet ist. Wie du feststellen wirst, ist aber Ausführung von Python-Programmen erstaunlich schnell. Empfehlenswert ist die Verwendung einer schnellen SD-Karte (Klasse 10) und des Raspberry Pi 2 Modell B.

 

 

DIGITALER INPUT-OUTPUT AM GPIO-PORT

 

Raspberry Pi stellt dir 17 digitale Input-Output-Kanäle zur Verfügung, die sich an einer 26-poligen Steckerleiste (die neue Version mit dem 40 poligen Stecker wird auch unterstützt) abgreifen lassen. Jeder Kanal kann als Ausgang oder als Eingang mit einem internen Pull-up-Widerstand, mit einem Pull-down-Widerstand oder ohne Widerstand definiert werden. Auf der Steckerleiste sind auch 5V, 3.3V und Ground-Pins vorhanden. Die Eingangsspannung darf in keinem Fall 3.3 V übersteigen, man darf also externe 5V-Logik-Ausgänge nicht direkt mit den Eingängen verbinden.

In TigerJython steht dir die Klasse GPIO aus dem Modul RPi_GPIO zur Verfügung, mit dem du die IO-Ports sehr einfach ansprechen kannst. Das Modul verwendet die Bibliothek Pi4J von Robert Savage, entspricht aber weitgehend dem Modul RPi.GPIO. Die zusätzlich benötigten Dateien kannst du von hier downloaden und in das Unterverzeichnis Lib kopieren, in dem sich tigerjython2.jar befindet..

Standardmässig werden die Pins des GPIO-Ports mit den Pinnummern 1..26 (neues Board: 1..40) angesprochen. Jeder Pin kann mit GPIO.setup() als Ein- oder Ausgangskanal (channel) definiert werden. Mit GPIO.output(channel, state) wird ein Ausgabewert gesetzt und  mit GPIO.input(channel) der aktuelle Eingabewert gelesen und zurückgegeben. Du findest die ausführliche Dokumentation unter der Menüoption Hilfe > APLU Dokumentation.

Zum Testen schliesst du am einfachsten eine LED mit einem Seriewiderstand zwischen Pin 6 (Ground) und Pin 12  an, wobei du die Polarität der LED ausprobieren musst (sie wird durch eine falsche Polarität nicht zerstört). Hast du einen Tastenschalter zur Verfügung, so schliesst du ihn zwischen Pin 6 (Ground) und Pin 26 an.

In deinem Programm definierst du zuerst Channel 12 als Ausgang und lässt die LED 10 mal pro Sekunde blinken:

from RPi_GPIO import GPIO 

GPIO.setup(12, GPIO.OUT)
  
while True:
    GPIO.output(12, 1)
    GPIO.delay(100)
    GPIO.output(12, 0)
    GPIO.delay(100)
 

Zur Demonstration eines Eingangsports schliesst du einen Tastenschalter wie im Schema gezeigt an Pin 26 an und brauchst dann typisch einige Flags, damit du durch Drücken des Tasters das Blinken einschalten und durch nochmaliges Drücken das Blinken wieder ausschalten kannst.

Programmcode markieren
(Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

In der Schleife holst du zuerst den aktuellen Zustand des Tastenschalters (du "pollst" ihn). Beim gedrückten Zustand verbindet er GND mit dem Eingang auf Pin 26 und input(26) liefert GPIO.LOW oder 0. Lässt du  die Taste los, so bewirkt der interne Pull-up-Widerstand, dass der Eingang auf logisch HIGH (3.3V) gesetzt wird, ohne dass du diese Spannung von Aussen anlegen musst.

Die Verwendung des  Tastenschalters als Ein-/Ausschalter ist etwas trickreich, da du trotz dem ständigen Pollen das Ein-/Ausschalten in ein Ereignis umwandeln musst, das nur dann auftritt, wenn die Taste runter geht. Du verwendest dazu ein Flag buttonPressed, das du beim ersten Tastendruck auf True setzt. Nachfolgend durchläufst du den entsprechenden Codeteil nicht mehr, bist du die Taste wieder losgelassen hast und erneut drückst.

Da die Schleife auch für das Blinken verantwortlich ist, verwendest du ein flag blinking, dass sozusagen den Ein-/Ausschaltzustand repräsentiert. Schliesslich muss du dir noch mit dem Flag ledOn merken, ob bei einem Schleifendurchlauf die LED ein- oder ausgeschaltet werden soll.

Im Moment des Abschaltens bist du nicht sicher, ob die LED gerade leuchtet oder nicht, daher schaltest du sie im letzten else aus. Als kleine Unschönheit wird aber dieser Code nachfolgend immer wieder durchlaufen.

Die Elektroniker wissen, dass eine Taste beim Drücken meist nicht sofort definitiv Kontakt macht (sie "prellt"). Da aber die Schleife wegen des delay(100) erst nach 100 ms wieder durchlaufen wird, ist anzunehmen, dass das "Prellen" dann zu Ende ist.

 

 

ELEGANT MIT DEM EVENTMODELL PROGRAMMIEREN

 

Viel einfacher ist es, das Eventmodell zu verwenden. Dabei wird das Drücken bzw. Loslassen der Taste als ein Ereignis aufgefasst, wobei automatisch eine Funktion onButtonPressed() aufrufen wird. Dort brauchst du nur das Flag blinking umzukehren.

Programmcode markieren
(Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Um Events zu verwenden, muss du zuerst mit der Methode add_event_detect() angeben, ob du auf eine steigende oder fallende Flanke oder auf beide reagieren willst, also beim Übergang von LOW auf HIGH oder umgekehrt. Nachfolgend registrierst du mit add_event_callback() die Funktion, die beim Auftreten des Ereignisses aufgerufen werden soll.