Raspberry Pi: GPIO Ein- und Ausgänge schalten

Wie schaltet man die GPIO Ein- und Ausgänge des Raspberry Pi ?

Zunächst einmal sollte man wissen, dass die GPIO-Files unter /sys/class/gpio liegen.
Die “normale” Variante zum Schalten eines Pins funktioniert wie folgt:

Zuerst begeben wir uns in den o.g. Ordner

$ cd /sys/class/gpio

Dies muss als root geschehen, daher noch mal sichergehen, dass wir als root angemeldet sind

$ su root

Nun machen wir z.B. GPIO 17 (Pin 11) zugänglich

echo “17” > export

Dann bestimmen wir ob der Pin ein Eingang oder ein Ausgang werden soll. In meinem Fall ein Ausgang, daher “out”. Eingang wäre demnach “in”

$ echo "out" > gpio17/direction

Der Pin ist nun freigeschaltet und als Ausgang definiert, aber noch aus. Dies kann man mit einem Multimeter prüfen, Pin 11 gegen Pin 6 z.B.

Mit dem folgenden shell-Befehl schalten wir den Pin auf high

$ echo "1" > gpio17/value

Jetzt sollte das Multimeter 3,3V anzeigen. Der Ausgang ist also gesetzt.

Zum Verständnis, was gerade passiert, kann man mal einen Blick in die Dateistruktur werfen. Unter /sys/class/gpio ist nach dem “export”-Befehl ein neuer Ordner entstanden: gpio17.

Wenn wir uns den Inhalt ansehen, sind dort u.a. die zwei Dateien “direction” und “value”.  Diese enthalten, wenn man die Dateien mit einem Texteditor öffnet, die Werte, die wir vorweg hineingeschrieben haben: direction -> out , value -> 1.

Inhalt gpio17/direction

Diese Methode ist allerdings sehr umständlich und muss nach jedem Neustart wiederholt werden. Ich habe ein Programm namens “WiringPi” entdeckt. Dieses vereinfacht den Umgang mit den GPIO Pins ungemein.
Eine Anleitung zum Installieren von WiringPi gibt es hier.
Nicht durcheinander kommen mit der Nummerierung der Pins.
GPIO 17 = Pin11 =WiringPi Pin 0
Dies ist aber auf der Projektseite von WiringPi gut erläutert.

Nach der Installation kann GPIO 17 wie folgt als Ausgang deklariert werden (dies muss nach jedem Neustart ebenfalls wiederholt werden. Darum habe ich mir eine .sh-Datei geschrieben, welche dies direkt beim Systemstart für alle meine benötigten Pins erledigt).

$ gpio -g mode 17 out

Das “-g” bedeutet, dass wir die ursprüngliche Bezeichung von GPIO17 nutzen wollen. Wer mit der WiringPi-Nummerierung besser zurecht kommt, der lässt das “-g” weg und nutzt “0” statt “17”

Mit

$ gpio -g write 17 1

schalten wir den Ausgang ein. Fertig!

Es entfällt das ganze Freischalten der Pins. Zudem kann WiringPi auch als “Nicht-Root” genutzt werden.

Über folgenden Befehl können wir nun auch den aktuellen Status von GPIO 17 einsehen

$ gpio -g read 17

WiringPi nutzen

Schalten der Pins via Web ist hier nachzulesen.

16 Gedanken zu “Raspberry Pi: GPIO Ein- und Ausgänge schalten

  1. Hallo Christoph,
    ich gratuliere zu diesem aufschlussreichen Blog! Ich möchte ähnlich wie du die GPIO's meines PI's über mein iphone steuern. Daher habe ich ein besonderes Interesse daran wie du die Pin's über das web schaltest. Über Tipps oder eine Ergänzung dieses Tutorials wäre ich dir sehr dankbar.

    Beste Grüße aus Oldenburg!

    • Hey, danke für das Lob.
      Momentan arbeite ich recht wenig an dem Projekt weiter, aber ich werde in den kommenden Tagen die GPIO-Web Ansteuerung hier erklären.
      Ich hoffe du hast noch soviel Zeit 😉

      Wenn du spezielle Fragen hast, kann ich versuchen dir die vorab schon einmal per Mail zu beantworten.

      Gruß Christoph

    • <?php
      if(isset($_POST["4"]) && isset($_POST["set"]))
      {
      $val = shell_exec('gpio -g read 4');
      if($val == 1)
      shell_exec('gpio -g write 4 0');
      else
      shell_exec('gpio -g write 4 1');
      }
      echo "";
      $val = shell_exec('gpio -g read 4');
      if($val == 1)
      echo "GPIO 4 ";
      else
      echo "GPIO 4 ";
      echo "";
      echo "";
      ?>

  2. Danke erstmal für dein Tutorial :D.
    Ich hätte da aber noch eine frage, wäre es möglich ein Taster als Eingang zu schalten der z.B. von dem Pin 1 3,3v an sagen wir mal GPIO 17 schickt und dadurch GPIO 25 steruert? Ich hoffe du hast verstanden was ich meine^^.

    • Hey.
      Ja das ist natürlich möglich.
      Du kannst mit Pull-Up oder Pull-Down Widerständen arbeiten.
      Also entweder schaltest du deinen "Eingangspin" gegen Masse, oder 3,3V.
      Ob der nun von 0 auf 1 oder von 1 auf 0 wechselt ist egal. Das kannst du dann später in deinem Programm nutzen.
      Ich mache es mir mal einfach und leite dich auf diesen Link.
      Hier sind beide Varianten einfach erklärt.
      http://www.cl.cam.ac.uk/projects/raspberrypi/tuto

      Christoph

  3. Gutes Tutorial! Hat mich aber eine Stunde gekostet, bis ich verstanden habe, dass du nicht einfach jeden Pin nehmen kannst… also GPIO 17 entspricht Pin 11, aber GPIO 7 entspricht nicht Pin 1…

  4. Hallo schöne beschreibung

    hab da mal ne Frage kann man den Wert eines GPIO z.B. 17

    /sys/class/gpio/gpio17

    echo “17″ > export

    echo “out” > gpio17/direction

    echo “1″ > gpio17/value

    auch permanent setzt so das er bei jedem bootforgang aktiv | out | ein

    eingestellt ist dann könnte man mit einem taster den Pi einschalten, und mit jedem shutdown ob per taster oder softwahre den Pi wieder ausschalten und komplett vom Strom nehmen.

    gruß Alex

    • Hey,
      du kannst zB die Befehle am Ende in deine rc.local schreiben.
      Dann setzt er die Ausgänge direkt beim Booten.
      Aber ich verstehe nicht genau was du vorhast.
      Denn wenn der Pi aus ist, ist er aus.
      Was du machen kannst ist ihn über einen Schalter an Pin 2 mit 5V zu versorgen. Dann sollte er ebenfalls hochfahren. Allerdings ist er dort soweit ich weiss nicht abgesichert.
      Gruß
      Christoph

      • Hi Christoph,

        Die Idee meines Vorhabens ist isch schlate den Pi per Taster "nicht Schalter" ein in dem Moment wenn ich den Taster betätige übernimmt einen kleine Schaltung die Selbsthaltung den Taster versorgt so den Pi mit Spannung und sobald ein GPIO frei wählbar z.B. GPIO17 auf Aktive | On | high steht merkt das die Schaltung und der Pi übernimmt die Selbsthaltung damit er an bleibt. Dann bei einem Shutdown ob ausgelöst über einen weitern Taster oder per Putty oder direkt im terminal –> Pi fährt herunter die Schaltung merkt das übernimmt die Selbsthaltung und da kurz nach dem ausschalten der GPIO immer noch zugriff aus der SD stattfindet wirft die Schaltung erst nach 15 sec. ab und trennt der Pi vom Strom.

        daher mein Gedanke ob man nicht einen GPIO fest einbrenne kann das dieser bei jedem boot Vorgang automatisch auf Aktiv | on | high gesetzt wird. Im Zweifelsfall geht es auch per Script. Nur scheint mir dafür die local.rc als ungeeignet ich würde das ganze gerne früher beim boot Vorgang machen.

        Gruß Alex

  5. Nur, falls jemand anders das jetzt hier noch liest:
    Verbindet NIE einen der GPIO-Ports mit 5V!
    Sie sind ohne Schutz vor Überspannung für 3,3V ausgelegt, sehr wahrscheinlich würdet ihr euch damit euren Raspberry Pi zerstören.

  6. Ich benötige noch Hilfe um über dir gpio s einen Touchscreen anzurufen steuern momentan bekomme ich nur ein weißes bild kann mir irgendwer helfen wie mann das bei dem pi 2 macht oder ein Buch empfehlen

    Danke im voraus

  7. Hallo alle zusammen,
    vielleicht ein Tipp, dass man sich den GPIO nicht zerschiesst.
    Sowohl für die Sende als auch für die Empfangsrichtung Optokoppler verwenden mit einem 270 Ohm Vorwiderstand.

  8. Bei mir wird die GPIO Datei nicht angelegt. Es kommt aber auch keinerlei Fehlermeldung. Habe jetzt Raspi3 mit Jessieversion vom Mai2016. Mit dem Raspi1 und der Vorgänger jessie Version ging es noch Problemlos.

Kommentar verfassen