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.