Raspberry Pi: GPIO Schnittstelle – Teil 3
Arbeiten mit der Schnittstelle
Das Arbeiten mit der Schnittstelle ist dank unseres Linux Betriebssystem sehr einfach. Der Kernel unterstützt die GPIO Schnittstelle und somit kann man sowohl mit einer Programmiersprache als auch über eine einfache Shell die Schnittstelle verwenden. Alles was wir dafür benötigen ist das /sys Dateisystem von Linux. Bevor wir uns im Detail die Programmierung bzw. das Arbeiten mit der Schnittstelle brauchen wir eine Versuchsanordnung.
Vorbereitung
Als Basis dient uns das Setup, welches ich schon im 2. Teil dieser Artikelserie vorgestellt habe. Wieder verwenden wir folgende Komponenten:
- 1 Steckboard
- 2 Steckdrähte
- 1 Leuchtdiode
- 1 270 Ohm Widerstand
- und unseren Raspberry Pi
Hat das vorgestellte Setup mit der leuchtenden Diode funktioniert, so brauchen wir nur eine kleine Änderung an der Anordnung zu machen. Statt an einen Anschluss mit fixer Spannung schließen wir den Draht für die Energieversorgung an einen unserer frei konfigurierbaren GPIO Pins. Dafür ziehen wir wieder die Übersicht über die einzelnen Pins aus dem 1. Teil der Artikelserie zu rate.
Auf dem Bild ist es etwas schwer zu erkennen, ich habe den gelben Draht an den GPIO Pin mit der Nummer 17 angeschlossen (das ist der 6. auf der linken Seite). Das hat aber keinen speziellen Grund. Genau so gut hätte ich ihn an den GPIO 4 Pin oder GPIO 27 Pin oder einen anderen freien Pin anschließen können. Wichtig ist nur, dass man genau schaut und sich die Nummer merkt. Nichts ist frustrierender als den Fehler zu suchen warum das Programm nicht funktioniert um dann festzustellen, man hat den Draht am falschen Pin angesteckt.
Haben wir diese Anordnung aufgebaut, dann sollten wir feststellen, dass die Diode nicht leuchtet. Das liegt daran, dass der GPIO Pin noch nicht aktiviert wurde. Das müssen wir nun mit einem Skript auf dem laufenden Raspberry Pi Linux ändern. Für dieses Beispiel wollen wir ein kleines Shell Skript schreiben, welches den GPIO 17 Pin abwechselnd mit Strom versorgt und dann wieder nicht. Die Leuchtdiode sollte somit in periodischen Abständen leuchten.
GPIO Skript
Bevor ich hier näher auf die Theorie eingehe einfach mal das GPIO Skript abtippen und ausprobieren!
#!/bin/bash trap "echo \"17\" >/sys/class/gpio/unexport" EXIT echo "17" >/sys/class/gpio/export echo "out" >/sys/class/gpio/gpio17/direction while true do echo "1" >/sys/class/gpio/gpio17/value sleep 1 echo "0" >/sys/class/gpio/gpio17/value sleep 1 done
Wie bereits erwähnt kann man über das sys Dateisystem mit der GPIO Schnittstelle kommunizieren. Die ersten 3 Kommandos unseres Skripts benötigt man um die Schnittstelle zu konfigurieren. Dabei wird eine Leitung zum GPIO Pin reserviert. Es wird vom Kernel ein neues Verzeichnis mit der Nummer des reservierten Pins angelegt, bei GPIO Pin 17 also das Verzeichnis /sys/class/gpio/gpio17. In diesem Verzeichnis gibt es eine Datei direction in der wir festlegen, ob wir etwas Senden (out) oder Empfangen (in) wollen. In unseren Fall wollen wir auf den Pin schreiben, also eine Spannung senden. Das eigentliche senden unseres Signals ist sehr einfach. Wir schreiben einfach eine 1 für Spannung und eine 0 für keine Spannung mit dem echo Kommando in die /sys/class/gpio/gpio17/value Datei des Pins. Fertig!
Das GPIO Skript sollte mit root Rechten ausgeführt werden. Bei einem normalen User also mit sudo.
In diesem Beispiel GPIO Skript senden wir abwechselnd Spannung und keine Spannung in einer Endlosschleife und warten zwischenzeitlich immer eine Sekunde. Die Ausgabe mit der Leuchtdiode ist ein periodisches Ein- und Ausschalten.
Über das Dateisystem ist die Kommunikation mit der Schnittstelle möglich und zum Testen ideal, jedoch ist das sehr langsam. Will man wirklich sinnvoll Daten senden, so können wir auch mit einer Programmiersprache mit der Schnittstelle kommunizieren und Daten mehrere 100 Mal schneller senden. Wie das geht zeig ich im nächsten Teil.
Hey,
super Artikel für den Einstieg mit der GPIO Schnittstelle!
Wann dürfen wir uns denn auf den 4. Teil freuen?
Mich würde das brennend Interessieren 🙂
LG Dustin
danke für das Lob 😉 ein 4. Teil war eigentlich in nächster Zeit nicht geplant aber wenn die Nachfrage besteht werde ich gern in diese Richtung weiter schreiben.
Es besteht sogar großes Interesse. Würde mich freuen wenn das tutorial fortgesetzt wird
Da gehts weiter: GPIO in der Praxis: Messen mit dem Multimeter.
Ich würde gerne den Artikel über die Schnittstelle lesen 😉 Heute kam mein zweiter Raspberry und ich werde mal im Selbststudium die GPIO-Programmierung mir antun. Vielen Dank schon mal für deinen tollen Bericht!
Viele Grüße
Norman
Guten Abend,
führe ich diese Commands in dem LX Terminal (Raspian) durch oder geht ihr davon aus, dass gar keine GUI benutzt wird?
Komischerweise erreiche ich kein bisschen durch die Eingabe der oben angegebenen Kommandos – habe sie mehrmals abgeschrieben. In dem Ordner Sys wird leider auch kein Ordner Class erzeugt…
Kann mir da jemand helfen?
Vielen Dank!
das ist eigentlich egal ob mit oder ohne GUI. Komisch finde ich, dass der Ordner leer ist. Führst du das auch auf einem Raspberry Pi aus? Eventuell erkennt der die GPIO Schnittstelle gar nicht.
Ich hab das gleiche Problem…. 🙁
Ich bin zwar auch neu beim Programmieren auf dem Rasperry, aber ich glaube es kommt auf die Installation an. Mit dem ersten Programmpaket hat es hat bei mir auch nicht gleich geklappt. Ich habe jetzt wiringPi-27afc01.tar.gz genutzt und direkt unter Pi installiert. Es hat sogar mit ./built funktioniert. Allerdings meldet es sich als gpio version 2.08(hätte jetzt 2.7 vermutet). Es gab nur eine Meldung Variable b3(?) deklariert aber nicht genutzt. Bei dem Paketnamen wiringPi.tgz aus verschiedenen Quellen ev auch verschiedene Versionen gab es einige Symbolik-Fehler-Meldungen. Meine Raspian hat laut installed_os.json das Versionsdatum 2014-01-07 das Pi ist ein Rev.2 Board.
Ich mache es genau wie beschrieben. LED geht auch an und aus. Allerdings bin ich etwas verwirrt. Wenn ich den Value auf 1 setze geht die LED aus und wenn ich ihn auf 0 setze, geht die LED an.
Sollte es nicht eigentlich anders herum sein? Woran kann das liegen?
Vielen Dank.
gute Frage…kann ich leider auch nicht so schnell nach prüfen. Ich arbeite mittlerweile nur noch über Python mit der GPIO Schnittstelle und da wäre mir so ein Verhalten noch nicht aufgefallen.
Super Artikel bin bis zum Skript gekommen.
Sorry blutiger anfänger, wie starte ich das Skript im Terminal ?
Bekomme die Meldung keine Berechtigung.
Hallo, mach mal im Ordner in dem dein Skript liegt ein ls -la. Dann siehst du die Rechte für dein Skript. Die Datei benötigt Ausführungsrechte, also muss dort unter anderem ein x stehen wie zB -rwxr-xr-x. Sollte dem nicht so sein, dann kannst du mit chmod +x namedeinesskripts.sh die Ausführungsrechte vergeben.
das geht einfacher:
du musst einfach nur im lxterminal „nano NAMEVONDIR.python“ eingeben und dann später mit strg+x und enter speichern
Super,Danke geht,muss noch viel lernen
Eine blinkende LED am GPIO-Port ist ja mittlerweile ein Kinderspiel. Aber wie sieht das Bash-Script aus, wenn diese LED langsam zu blinken beginnt, immer schneller wird und ab einem bstimmten Takt wieder langsamer blinkt?
das ist relativ einfach. Anstatt sleep 1, also dem konstanten Wert 1 setzt man dort das Ergebnis einer Funktion ein. Ein Beispiel wäre die Sinusfunktion. Ich würde in der Schleife eine Zählvariable x immer um 1 erhöhen und das Ergebnis von sin(x) beim sleep einsetzen. Da negative Werte bei sleep vermutlich keinen Sinn machen müsste man davon den absoluten Wert nehmen. Die Sinusfunktion ist periodisch, wenn du dann etwas chaotischers benötigst muss du dir selber eine lustige Funktion ausdenken die eine entsprechend wirre Kurve ergibt.
Danke für die schnelle Antwort. Die Betonung liegt auf „relativ“ 🙂 Werde den Ansatz überdenken. Hatte es biaslang mit der for-Schleife auf- und abwärtszählend versucht…Hab wohl eher ein Problem mit der Syntax.
Klasse-Beitrag. Ich programmiere zwar schon lange und viel mit dem Raspberry Pi, aber GPIO und der Device Tree sind für mich Neuland. Wenn auch für meinen Pi (Raspberry Pi 2 Model B) vom Pin Layout her nicht mehr ganz relevant, so hat mir dieser Beitrag den richtigen Einstieg gegeben.
Übrigens: soweit ich bis jetzt getestet habe, kann ich mir sudo ersparen, wenn ich den User der Gruppe gpio zuweise.
danke für das Kommentar! Ich habe übrigens auch aktualisierte GPIO Artikel zum Raspberry Pi B oder wie man damit in der Praxis arbeitet. Hoffe du findest die auch gut und hilfreiche Informationen.