Raspberry Pi – GPIO in der Praxis: Python

Python ist eine sehr beliebte Sprache und meiner Meinung nach sehr gut geeignet um am Raspberry Pi mit der GPIO Schnittstelle zu arbeiten. Für ein Projekt musste ich mich selbst mit Python erst anfreunden, aber mit etwas Einarbeitungszeit und bereits vorhandener Programmiererfahrung beherrscht man diese Sprache in kürzester Zeit. Auf jeden Fall erzielt man mit der eigenen GPIO Bibliothek sehr schnell erste Erfolge. Mir hat dieses Buch sehr weitergeholfen: Beginning Game Development with Python and Pygame

gpio-python

Python und GPIO

Wie man die GPIO Schnittstelle ansteuern kann habe ich bereits in einer Artikelserie zur GPIO Schnittstelle erläutert. Das ist relativ einfach und unkompliziert. Genau das kann man auch in Python erreichen. Bei Python hat man wie bei fast jeder Programmiersprache den Vorteil, dass es eine fertige Programmbibliothek gibt. Bei Python heißt diese RPi.GPIO. Diese kann man im Python Programm folgendermaßen einbinden:

GPIO Port einlesen

Im Folgenden zeige ich wie man einen Bestimmten GPIO Pin einlesen kann. Dieses Code Snippet zeigt die korrekte Verwendung der GPIO Bibliothek für Python. Es wird der GPIO Port 7 eingelesen.

Zuerst wird die Bibliothek mit eingebunden. In Python funktioniert das mit einem import. Diese Bibliothek ist beim Raspberry Pi und Raspbian Linux bereits installiert. Im nächsten Schritt werden zwei Variablen definiert. bounce_time ist ein wichtiger Werte für den GPIO Event. Gerne könnt ihr hier eigene Werte definieren, diese beiden Werte haben sich nach längerem Testen für mein Projekt als optimal herausgestellt.

Mit PIN_A definieren wir die Nummer jenes GPIO Pins, welchen wir einlesen möchten. Das ist in diesem Fall der Pin mit der Nummer 7. Danach habe ich noch eine Variable a_value definiert, welche den ausgelesenen Wert des Pins für eine weitere Verwendung im Programm speichert.

Mit der Funktion setmode initialisieren wir unsere GPIO Schnittstelle. Als Argument geben wir GPIO.BOARD ein. Alternativ kann man auch GPIO.BCM verwenden, das ändert die Nummerierung der Pins. GPIO.BOARD verwendet die in meiner Grafik bereits gezeigte Pin Nummerierung. Mit setup legen wir nun fest, ob wir von dem Pin lesen oder ob wir auf den Pin schreiben wollen. In diesem Fall wollen wir nur lesen (GPIO.IN). GPIO.PUD_DOWN sollte unbedingt gesetzt werden, damit wird ein Widerstand zugeschaltet. Wird das nicht gemacht ist der Zustand des Pins unvorhersagbar (liefert zufällige Werte).

Zuletzt erstellen wir noch einen Event Listener, der auf die Schnittstelle hört und eine Funktion immer dann aufruft, wenn es eine Änderung am Pin gibt. Einen Listener definieren wir mit add_event_detect. Als Parameter übergeben wir die Pin Nummer, worauf gehört werden soll (GPIO.FALLING für fallende Spannung), eine Callback Funktion und die bereits erwähnte bounce_time. Wenn nun die Spannung auf Pin 7 fällt, dann wird die Funktion inputLow aufgerufen. bounce_time von 200 Millisekunden verhindert, dass dieses Event die Funktion mehrmals aufruft. In der inputLow Funktion kann man nun den Wert des Pins für die weitere Bearbeitung speichern.

Praktisches Beispiel

Meine Raspberry Pi ist mit einem Touchpanel verbunden, welches 5 Felder hat. Berührt man eines dieser Felder wird ein Signal geschickt. Das Panel habe ich mit 2 5V Pins zur Stromversorgung verbunden und jeweils einen Pin pro Feld. Immer wenn man nun eines der Felder berührt kommt auf dem GPIO Pin eine Spannungspitze an. Das obige Script hört beispielsweise auf Pin 7. Das ist das erste Feld. Wenn ich also dieses berühre wird im Programm a_value auf 1 gesetzt. In der Programm Hauptschleife frage ich nun diesen Wert ab und reagiere darauf. Danach setze ich a_value wieder auf 0. Somit ist es möglich die Felder des Touchpanels als Buttons zu verwenden.

Teil 1

(Visited 19.145 times, 1 visits today)

Das könnte auch interessant sein...

5 Antworten

  1. Jan sagt:

    Hallo!

    Du schreibst „[…] GPIO.PUD_DOWN sollte unbedingt gesetzt werden, damit wird ein Widerstand zugeschaltet. Wird das nicht gemacht ist der Zustand des Pins unvorhersagbar (liefert zufällige Werte). […]“

    OK. Soweit ich das verstehe ist das der interne „Pull-Up“. (Der sich mir immer noch nicht ganz erschließt…)

    Nun meine Frage: Hast du eine Übersicht darüber:

    a) welche GPIOs einen solchen Pull-widerstand haben
    b) wann man diesen auf Up oder Down stellt
    c) ob das überhaupt so beliebig geht
    d) man diese schon „per default“ bei booten „aktivieren“ kann

    Wäre klasse wenn du da etwas Licht ins Dunkel bringen könntest.
    LG
    Jan

    • leider weiß ich darüber auch nicht viel mehr. Meine Ergebnisse habe ich fast ausschließlich über mein Praxisprojekt gelernt mit probieren. Wäre aber sicher nicht schlecht in diese Richtung nähere Nachforschungen zu machen.

  2. josche sagt:

    Mhm… ich wollte mich ein wenig mit der GPIO-Steuerung beschäftigen, u.a. um einen Lüfter nach Temperatur per PWM zu steuern.
    Großen Problem: Bin recht neu auf dem Linux-Gebiet (mein Raspberry ist mein erster „Linux“).

    Daher scheitert es an kleinen Dingen die für einen Linux nutzer selbstverständlich erscheinen… leider.

    Es gibt ein haufe GPIO-Videos auf Youtube, nur keins auf Deutsch. Ich finde Videos immer noch am Besten, denn wenn man die Profis bei der Arbeit sieht, lernt man gleich am meisten (weil die Selbstverständlichkeiten eben auch gezeigt werden :-P).

    Willst du nicht auch mal eine Step-By-Step Anleitung schreiben und/oder ein kleines Video für uns machen? Ich schätze ich wäre nicht der einzige den das interessieren würde 🙂

    Vielen Dank schon mal für deine Mühen und mach weiter so!

  3. Daniel sagt:

    Ist zwar schon etwas her. Vielleicht interessiert es doch noch jemanden:

    Der Eingang kann durch Signale in der Luft auf einen Wert zwischen 0 und 3.3V messen. Dann ist um vornherein unklar, ob der RasPi das als EIN oder als AUS erkennt. Mit dem Pull Up bzw Pull Down Widerständen wird dem Eingang ein klarer Wert gegeben.

    z.B.: Wenn ich einen Schliesser gegen Masse (0V) anschliesse werde ich den Eingang mit einem Widerstand auf 3.3V stellen. Wenn dann der Taster gedrückt wird, wird der Eingang dann auf 0V geschaltet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.