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.

gpio skript 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!

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.

Teil 1 | Teil 2

(Visited 21.772 times, 1 visits today)

Das könnte auch interessant sein...

20 Antworten

  1. Dustin sagt:

    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

  2. Norman sagt:

    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

  3. Benjamin sagt:

    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.

    • Alex sagt:

      Ich hab das gleiche Problem…. 🙁

      • Marko sagt:

        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.

  4. LuxOculus sagt:

    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.

  5. R.S sagt:

    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.

    • dinkeldirk sagt:

      das geht einfacher:
      du musst einfach nur im lxterminal „nano NAMEVONDIR.python“ eingeben und dann später mit strg+x und enter speichern

  6. R.S sagt:

    Super,Danke geht,muss noch viel lernen

  7. cosiphi sagt:

    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.

      • cosiphi sagt:

        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.

  8. Peter Gloor sagt:

    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.

Schreibe einen Kommentar

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