Raspberry Pi GPIO Erklärung für Beginner + Programmierung (Teil 2)

20. April 2017
20 Comments

Eine der Besonderheiten des Raspberry Pi’s sind die programmierbaren Input-Output Pins. Diese sog. GPIOs können einfach über ein Programm geschaltet werden, was wir in diesem Tutorial durchgehen. Dafür schreiben wir ein Python Programm, womit wir einerseits Eingaben erfassen und andererseits die Raspberry Pi GPIO Pins schalten, um so andere Module und Sensoren schalten zu können. Darüber hinaus erkläre ich in diesem Tutorial die Funktionsweise eines Breadboards / Steckbrett.

Falls du den ersten Teil noch nicht gelesen und evtl. noch Probleme mit den Basics hast, würde ich raten das zunächst durchzugehen. Für alle, die bereits Programmiererfahrung haben, aber noch nicht mit den GPIOs gearbeitet haben, können auch direkt hiermit starten.

Übrigens: Für die weiteren Teile wäre es super, falls ihr Anregungen habt bzw. was euch vor allem interessiert. Ich werde versuchen, das mit einzubauen.

 

Zubehör

In diesem Tutorial werden wir ein paar Hardware Bausteine brauchen. Diese sind unter anderem:

Diese Bauteile werden übrigens immer wieder benötigt. Wenn du noch weitere Hardware-Projekte nachbauen willst, wirst du dieses Zubehör definitiv weiter benötigen.

 

Funktionsweise eines Breadboards / Steckbretts

Ein Breadboard (deutsch: Steckbrett) ist eine Hilfe um Schaltungen schnell aufbauen zu können, ohne diese jedes mal Löten zu müssen. Es bietet vor allem beim Testen und Konzipieren große Vorteile. Dabei gibt es Breadboard in verschiedenen Größen, wobei der Aufbau jedoch meist wie folgt ist:

Raspberry Pi GPIO Breadboard SteckbrettIn der schematischen Zeichnung sind unten die Verbindungen markiert. Die Linien zeigen dabei auf, welche der Löcher miteinander verbunden sind. Unten und oben sind zwei horizonale Leisten zu sehen, an die man normalerweise den Plus- und Minuspol eines Geräts hängt.

Bei den mittleren Pins sind die Verbindungen vertikal. Dabei kann z.B. eine LED in zwei Spalten nebeneinander gesteckt werden. Doch dazu gleich mehr.

 

Raspberry Pi GPIO Übersicht

Seit dem Model B+ haben die Raspberry Pi’s eine 40 Köpfige Pinleiste. Davon sind nicht alle auslesbar bzw. beschaltbar, da es auch einige Spannungs- und Masseanschlüsse gibt. In der folgenden Grafik sind die kompletten Pins inkl. Funktionen und Nummerierung aufgelistet. Die linke (grüne) Seite soll dabei die Platine des Raspberry Pi’s symbolisieren.

Raspberry Pi GPIO Pin Belegung

Raspberry Pi GPIO Pin Belegung

Alle Pins, welche „GPIO“ im Namen haben, können programmiert werden. Darüber hinaus gibt es noch „Ground“ (=Masseanschluss) und die Spannungspins (3.3V und 5V).

Wie du siehst, gibt es zwei Pin Belegungen: Einmal die aufsteigende Pin Belegung (oben links bei 1 beginnend) und dann noch die recht zufällig gewählte Nummerierung der GPIOs. Dies ist wichtig, da man über beide Nummern einen GPIO ansprechen kann.

So entspricht bspw. Pin 15 = GPIO 22. Achte immer darauf, ob von Pin oder GPIO gesprochen wird. In den meisten Tutorials wird jedoch nicht die Pin-Nummerierung, sondern die GPIO Nummer genutzt.

 

Vorbereitung

Wie zuvor auch öffnen wir die Python Konsole über das Startmenu > Programming.

In der geöffneten Python Konsole geben wir nun zunächst folgendes ein:

import RPi.GPIO as GPIO

Wir importieren damit eine Bibliothek, womit wir die Raspberry Pi GPIO Pins programmieren können. Diese Bibliothek hat alle benöigten Funktionen bereits enthalten, sodass wir keine zusätzlichen Funktionen dafür schreiben müssen.

Weiterhin importieren wir auch noch ein Bibliothek, mit welcher wir das Skript für kurze Zeit stoppen können. Dies wird im Anschluss noch interessant.

import time

Anschließend geben wir an, ob wir die GPIOs per Boardnummern (1-40) oder über ihre GPIO Nummer ansprechen wollen. Da wir letzteres wollen, lautet der Befehl dazu:

GPIO.setmode(GPIO.BCM)

 

 

Raspberry Pi GPIO Pins schalten – Ausgabe

Zunächst möchten wir ein paar einfache LEDs mittels der GPIOs schalten. Dazu bauen wir die LEDs entsprechend der nachfolgenden Grafik auf. Als Verbindung zwischen Raspberry Pi und dem Breadboard kannst du die Jumper Kabel nehmen und für alle anderen Verbindung einfachen Draht. Die Farben spielen keine Rolle und sind nur zur besseren Unterscheidung gedacht.

Raspberry Pi GPIO Output Steckplatine

Die LED hat zwei unterschiedlich lange Enden. Das längere Ende kommt an die positive 3.3 Volt Spannung des GPIO 23 (Pin 16). Der gewählte Widerstand ist 330Ω (Ohm).

Nun geht es zurück in die Python Konsole, in der wir unseren Code eingeben. Zunächst einmal müssen wir den Pin als Output definieren:

GPIO.setup(23, GPIO.OUT)

Damit stehen nun die Output-Funktionen für diesen Pin zur Verfügung. Mit den folgenden beiden Befehlen können wir die LED erst an- und anschließend wieder ausschalten:

GPIO.output(23, GPIO.HIGH)
GPIO.output(23, GPIO.LOW)

Mit diesem Befehl wird einfach gesagt, ob eine Spannung von 3.3V (HIGH) oder von 0V (LOW) angelegt werden soll.

 

Ist doch ziemlich einfach, oder? Wer eine kleine Blinkschaltung bauen möchte, kann dies z.B. folgendermaßen:

for i in range(5):
    GPIO.output(23, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(23, GPIO.LOW)
    time.sleep(0.5)

Damit wird die LED 5 Mal an- und wieder ausgeschaltet, wobei dazwischen jeweils eine halbe Sekunde gewartet wird, bevor der Status geändert wird.

 

 

Raspberry Pi GPIO Pins auslesen – Eingabe

Mit den GPIOs können aber nicht nur Ströme geschaltet werden, sondern auch ausgelesen werden. Daher erweitern wir nun unsere Schaltung um einen Taster. Der Status soll dazu ausgelesen werden und sobald der Taster gedrückt wird, soll die LED leuchten. Wird der Taster nicht mehr gedrückt, so soll die LED auch aufhören zu leuchten.

Zunächst erweitern wir die Schaltung. Neben dem Taster benötigen wir einen 10.000Ω Widerstand, welcher von einem Ende des Tasters an Ground verbunden wird. Dazwischen geht eine Verbindung zum GPIO 24 (Pin 18). Das andere Ende des Schalters wird an die 3.3 Volt Spannung angeschlossen:

Raspberry Pi GPIO Input SteckplatineWarum das ganze? Solange der Schalter nicht gedrückt ist, ist die Verbindung zwischen der 3.3V Spannung und dem GPIO geschlossen. Damit aber ein eindeutiger Zustand erkannt wird (entweder 0V oder 3.3V) ist die Verbindung über einen sehr großen Widerstand zum Masseanschluss.
Sobald der Taster gedrückt wird, schließt sich die Verbindung und am GPIO liegen 3.3V an.

Hinweis: Schließe niemals mehr als 3.3V an die GPIOs an, da sie sonst kaputt gehen können.

Kommen wir zum Code. Auch hier müssen wir zunächst den Status festlegen, jedoch wird diesmal der Pin als Input definiert:

GPIO.setup(24, GPIO.IN)

Nun können wir auch schon den Status abfragen:

GPIO.input(24)

Dies wird entweder 0 (wenn der Taster nicht gedrückt wurde) oder 1 (Taster gedrückt) ausgeben.

 

Im letzten Schritt erweitern wir das Programm nun noch folgendermaßen, sodass die LED immer dann an ist, wenn der Taster auch gedrückt wird.

# Endlosschleife
while True:
    if GPIO.input(24) == 0:
        # Ausschalten
        GPIO.output(23, GPIO.LOW)
    else:
        # Einschalten
        GPIO.output(23, GPIO.HIGH)

Abbrechen kannst du den Vorgang übrigens mit STRG+C.

 

Zusammenfassung

Zusammenfassend gibt es hier noch den Code des gesamten Skripts, falls jemand diesen in einer Datei speichern und als Ganzes aufrufen möchte.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.IN)

for i in range(5):
    GPIO.output(23, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(23, GPIO.LOW)
    time.sleep(0.5)

# Endlosschleife
while True:
    if GPIO.input(24) == 0:
        # Ausschalten
        GPIO.output(23, GPIO.LOW)
    else:
        # Einschalten
        GPIO.output(23, GPIO.HIGH)

Falls dir diese Einleitung Spaß gemacht hat, kann ich dir nur das Mini Projekt einer Ampelschaltung empfehlen. Gegliedert in zwei Teile wird darin ein funktionierendes Ampelsystem, bestehend aus Auto- und Fußgängerampel, gebaut.

Weitere Informationen zu diesem Aufbau findest du z.B. hier.

Mit dem hier vermittelten Wissen kannst du bereits erste kleine Projekte starten. Hier ist ein kleiner Vorgeschmack:

Im nächsten Teil schreiben wir unsere erste GUI (Graphisches User Interface), womit wir die GPIOs auch per Oberfläche steuern können.

20 Kommentare

  1. Hallo,
    mir dieser Serie verstehe ich es sogar, Danke!!
    Muss es hier
    „Die LED hat zwei unterschiedlich lange Enden. Das längere Ende kommt an die positive 3.3 Volt Spannung des GPIO 23 (Pin 12). Der gewählte Widerstand ist 330Ω (Ohm).“
    nicht Pin 16 heissen?

    Antworten
  2. bestens,
    auch dieses tut abgearbeitet
    nur ist mir dabei aufgefallen wenn er auf tastendrückwartet mit der cpu last auf 100 % ist und die temp ganz schön nach oben schnellt. irgentwo habe ich da was mit interruppt oder event entdeckt was ich mit meinem py kenntnissen noch nicht einarbeiten kann.

    mit dir und deiner hp macht es auch echt spass alles umzusetzen und zu lernen
    glaube dadurch habe ich so einige pis das leben gerettet ..(habe einen auf dem gewissen dank motorshild, meine py und elktro kentnissen :))

    Antworten
    • Das ist richtig, aber ich habe es bewusst weggelassen. Die meisten, die das Tutorial lesen, haben kaum / keine Erfahrung mit den GPIOs und Interrupts etc. helfen dabei meiner Meinung nach nicht beim Verständnis. Vielleicht baue ich das in einem der folgenden Teile ein.

      Antworten
      • ja das wäre klasse wenn du da auch noch bischen drauf eingehst, in deinen späteren tuts wird bestimmt mal ein eckchen frei sein

    • Ich fand es wichtiger, dass man erst einmal ein „Aha-Erlebnis“ bekommt und sieht, dass das Ansteuerung doch Einfacher als vielleicht gedacht ist. Die Wahl der Bibliothek ist dabei zweitrangig. Wer ein bißchen Erfahrung gesammelt hat, kann die Bibliothek ja immer noch wechseln.

      Antworten
  3. Hallo,
    erstmal vielen Dank für die tolle Seite !!! Habe jetzt mal 2 Fragen:
    1. (wahrscheinlich ganz dumme Frage) : bei der aller ersten Schaltung versteh ich das rote Jumper-Kabel nicht. Vom Pi aus Pin1 an das Board +, aber dann? Wie schließt sich der Kreislauf?
    2. Frage: Wenn ich neue Sachen am Board umstecke, muss ich davor immer den Pi herunterfahren, oder kann ich gleich neue Schaltungen ausprobieren?

    Antworten
    • Hallo Leo,
      richtig, in der ersten Schaltung wird das rote Kabel (noch) nicht gebraucht. Allerdings in der nächsten Schaltung. Außerdem wollte ich schon auf die Verwendung der seitlichen Breadbordleiste hinweisen (für VCC/GND).
      2. Solange du dir deiner Schaltung sicher bist, brauchst du ohn nicht auszuschalten / vom Strom trennen. Du solltest aber auf keinen Fall einen Kurzschluss (VCC direkt an GND) verursachen, da das den Pi grillen könnte.

      Antworten
      • Vielen Dank für die rasche Antwort! Etwas habe ich noch nicht ganz verstanden bei dem Beispiel mit dem Schalter. Könntest du das vielleicht noch etwas genauer erklären bzw. kann ich wo anderst nachlesen?

        Habe ich das richtig so verstanden: Die LED hat einen eigenen „Kreislauf“ und der Schalter hat einen eigenen „Kreislauf“. Wenn der Schalter gedrückt wird, dann wird über das Programm mitgeteilt, dass PIN 16 Strom durchlassen soll -> somit leuchtet die LED?

        Frage: wenn der Schalter nicht gedrückt ist, dann fließt doch kein Strom, oder? Warum brauche ich dann den 10k-OHM Widerstand? Warum befindet sich der Widerstand erst nach dem gelbem Jumperkabel?

      • Am besten du ignorierst die VCC Verbindung im ersten Schaltbild komplett. Deine Annahme ist soweit richtig. Der Input Pin mit Schalter dran, erkennt wann er gedrückt wurde (da Strom fließt) und wir sagen daraufhin dem anderen Pin, dass dieser Strom für die LED schalten soll.
        Bzgl. der Frage: Es gibt nur zwei Zustände: 0V Spannung oder 3.3V Spannung. Wenn nun keine Spannung anliegt, haben wir keinen eindeutigen Zustand. Daher schließen wir den Pin über einen sehr großen Widerstand (10k) an GND an. Daraus folgt, dass wenn der Schalter nicht gedrückt wird, definitiv 0V anliegen. Wenn der Schalter gedrückt ist, fließt ein winziger Teil der Spannung über den Widerstand (daher grpßer Widerstand), allerdings macht dies nichts aus, denn der größte Teil kommt an unseren Pin an und wir haben wieder einen eindeutigen Zustand (HIGH). Weiterführende Literatur: Pull-Up/Down Widerstand.

  4. Hallo,
    jetzt muss ich doch nachfragen.
    In dem Teil:
    „Die LED hat zwei unterschiedlich lange Enden. Das längere Ende kommt an die positive 3.3 Volt Spannung des GPIO 23 (Pin 16). Der gewählte Widerstand ist 330Ω (Ohm).“

    Woher weiss ich denn das GPIO23 positive Spannung hat?

    Antworten
  5. Hallo,

    die LED leuchtet ja nur, wenn der Taster gedrückt ist! Wie könnte man es programmieren, damit der Taster als Ein- und Ausschalter für die LED funktioniert?

    Alex

    Antworten
    • Hallo,

      kleiner Nachtrag: Es funktioniert nur dann nicht so wie gewünscht, wenn man die LED in einer Schleife blinken lassen möchte, aber zudem noch mittels GPIO.add_event_detect() triggern möchte.

      Alex

      Antworten
  6. Hab da mal eine kleine Verständnisfrage: Bei dem Bild (Aufgabe)
    „Raspberry Pi GPIO Pins schalten – Ausgabe“
    geht eine Steckverbindung vom Pin 3V3 auf das Board! Aber das war es dann auch schon, oder?
    Die Verbindung ist doch Sinn- und Zwecklos. Ich bin kein Elektriker, will aber dabei was lernen, und dieses Kabel erscheint mir unnötig! In der nächsten Aufgabe benutzt man ja dann die auf Reihe „+“ anliegenden 3,3V. Aber bei dem ersten Bild…… klärt mich auf! Cheers Joey

    Antworten
  7. Eine Sache habe ich hier dann doch zu kritisieren: die Überschrift! 😉
    Ich habe eine ganze Weile nach Teil 1 der GPIO Erklärung für Beginner gesucht, bis ich anhand des Inhalts darauf gekommen bin, dass sich das „Teil 2“ nur auf die Programmierung bezieht…

    Ich würde vorschlagen, die Überschrift bei Tut-Serien nach einem festen Schema aufzubauen. Dann hieße dieses Kapitel also:
    Programmieren lernen am Raspberry Pi – Teil 2: GPIO Erklärung für Beginner

    Zwar wird hier auch ein wenig HW erklärt, aber das widerspricht ja nicht dem „Programmieren lernen“.

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.