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
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:
import RPi.GPIO as GPIO
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.
import RPi.GPIO as GPIO bounce_time = 200 PIN_A = 7 a_value = 0 GPIO.setmode(GPIO.BOARD) GPIO.setup(PIN_A, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.add_event_detect(PIN_A, GPIO.FALLING, callback=inputLow, bouncetime=bounce_time) def inputLow(channel): if channel == PIN_A: global a_ok a_value = 1
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.
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.
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!
hey, danke für den Import. Anfragen in Richtung Video sind interessant, denke ich werde das mal probieren und euch hier darüber informieren.
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.
Ein GPIO kann wahlweise als digitaler Ausgang oder als Eingang eingestellt werden. Das erreicht man durch ein entsprechendes Kommando (GPIO.OUT bzw. GPIO.IN). „Digital“ heißt AN oder AUS, STROM oder KEIN STROM, JA oder NEIN, usw. Beim Raspberry bedeutet das im Grunde nur +3,3 oder 0 (Null) Volt.
Als Ausgang kann man damit z.B. eine LED ein- oder ausschalten. Für größere Verbraucher, wie etwa Motoren, Relaisspulen oder Lampen, muss man unbedingt Treiber dazwischen schalten, d.h. Transistorschaltungen oder div. Schalt-IC´s. Anderenfalls könnte der Raspberry überlastet und zerstört werden! Diese Treiber benötigen stets eine eigene und richtig dimensionierte Stromversorgung.
Wird der GPIO als Eingang verwendet, legt man per Schalter (oder Transitor oder IC-Ausgang oder Relaiskontakt usw.) entweder +3,3 oder 0 Volt an. Jetzt muss man unterscheiden: es gibt nämlich die positive oder negative Logik („Logik“ im Sinne der Boole´schen Algebra – Wikipedia hilf!!!). Das hängt von der verwendeten Hardware ab. Hierbei kommt es darauf an, was konstruktiv festgelegt wurde: wird bei betätigtem Schalter entweder +3,3 V (= positive Logik) oder aber 0 V (= negative Logik) angelegt. Der GPIO kann beides, man muss es ihm nur vorher mitteilen. Der GPIO wird dabei intern über einen Vorwiderstand fest entweder an +3,3 V oder Masse = 0 V gelegt. Dazu dient der Befehl GPIO.IN, pull_up_down=GPIO.PUD_DOWN, hier werden von außen +3,3 V erwartet; bei …… PUD_UP erwartet er 0 V. Übrigens für Elektro-Laien: 0 Volt = GND (Ground, zu deutsch: Masseanschluss), in der Regel am Minuspol der Stromversorgung.
Die elektrischen Grundkenntnisse, wie z.B. das Ohmsche Gesetz, Halbleitertechnologie, elektronische Grundschaltungen, logische Verknüpfungen (s. Boole) usw. müsst ihr euch leider anderweitig aneignen, also etwa erhöhte Aufmerksamkeit im LK Physik, entsprechende Tutorials im Net, Wikipedia, schlaue Kumpels ö.ä.
Hallo,
ich möchte ein Hardware Projekt machen und dafür Python lernen.
Bitte empfehlt mir ein Buch.
Ich habe Programmierkenntnisse.
Ist beispielsweise das Buch vom Verlag Chemie (VCH Wiley) gut?
Ich würde mich auch über die Benennung von Programmierumgebungen für WIN und Linux freuen.
Danke bereits im Voraus und Grüße
Jan Alexander B., Dipl.-Ing. (Uni)
Mit Programmierkenntnissen kann man denke ich auch sehr einfach ohne Buch mit etwas Hilfe einer Suchmaschine und Stackoverflow schnell von Code Snippets lernen. Ich habe meine Kenntnisse fast ausschließlich von Python Dokumentation (https://www.python.org/doc/). Ganz wichtig ist die Entscheidung ob man Python 2 oder Python 3 entwickeln will. Da muss man bei der Verwendung von Codebeispielen aufpassen, die sind nicht sehr kompatibel.
IDEs gibt es viele. Geany ist am Raspberry Pi beispielsweise vorinstalliert (https://www.geany.org/) und für Linux, Mac und Windows verfügbar. Für den Anfang reicht aber jeder Texteditor und eine Kommandozeile.
Hallo, Werner,
ich danke Dir sehr herzlich für Deine Beratung!
Das wäre sicher nicht billig auf dem „normalen“ Weg. In Punkto Büchern bin ich aber altmodisch- einfach, weil man sonst sein Wissen nicht kostenlos hergibt (dass Du gerade das Gegenteil beweist, habe ich mitbekommen). Ich versuche, gebraucht welche zu finden- der Markt ist (Beispiel: booklooker.de) aber abgegrast beziehungsweise verkauft keiner PYTHON- Bücher.
Dass PYTHON 2 überhaupt noch in Frage kommt, wundert mich. Ich nahm an, dass PYTHON 2 (wie bei einem veralteten Betriebssystem) einfach nur überkommen ist. E-Commerce ist neben Big Data (also Datenauswertung) laut einem Darmstädter Professor übrigens zukunftsweisend als Ausbildungsgang, Programmieren soll dagegen ins Ausland abwandern und schließlich von AI (künstlicher Intelligenz) erledigt werden. So, dann mache ich mich mal ans Programmieren und hoffe auf eine Fortsetzung der Diskussion mit Ihnen darüber!
Apropos Dokumentation: bei meinem Neuerwerb, dem ORANGE PI PC2, gibt es ja kaum Dokumentation von Herstellern. Wie ich herausfand, ist das ganz schön sportlich- vor Jahrzehnten wurde alles von den Herstellern vorbildlich dokumentiert. Bei unserem SIEMENS Laptop SX486 waren die DOS-und WIN 3.11- Handbücher insgesamt schwerer als das Laptop selbst.
Mit kollegialem Dank auch für die Empfehlung der IDE (beziehungsweise der Instruktion diesbezüglich) verbleibe ich
mit freundlichem Gruß,
Jan A. Beckmann, Dipl.-Ing.
Das Internet und vorallem die blogs, sowie die inet-communities leben vom freiem Zugang der Informationen, ist auch super so.
Bekommt man doch kostenlos und schnell, Informationen zu aktuellen, und , alten Themen.
Natürlich lebt das auch vom ausgleichendem nehmen und geben, so das dann auch Erfahrungen, die andere machen, und hier darstellen, bestimmt sehr willkommen sind.
Hallo,
darf ich nachfragen, ob Sie damit meinen, dass es nicht ratsam ist, ein passendes Buch zu beschaffen.
Ich bin der gegenteiligen Meinung. Ich schätze die Möglichkeit, sich Wissen zu erarbeiten und dann dafür auch eine Entlohnung zu erbitten.
Damit meine ich: wenn man etwas wissen möchte, ist eine bezahlte Auskunft oder ein Buch weiterhin der Königsweg. Auch bei Betriebssystemen zahle ich lieber etwas und habe dafür Support, auch schon bei der Programmierung (Als Beispiel sei hier ungenant genannt: Cloudready- Chrome OS).
Wer die Expertise hat, sich Sachen kostenlos zu beschaffen, kann das tun. Aber bis man die hat, muss an leider für Wissen oft zahlen. Dass Leute, die viel wissen, sterben können, ist leider nicht zu ändern. Das ist sehr bedauerlich und man kann nur versuchen, zu Lebzeiten genug zu verdienen, um seine eigene Ausbildung wieder hereinzuholen.
…habe ich gelesen 🙂
Gruß
Beckmann
Freundliche Grüße und danke an unseren Host für die Moderation