gpio digitalDer GPIO ist spätestens nach der Markteinführung des Raspberry Pi in aller Munde. Inzwischen gibt es viele weitere Geräte die mit GPIOs ausgestattet sind. Doch was ist ein GPIO eigentlich und wie kann man ihn nutzen. In diesem Tutorial will ich Euch die Anwendungsmöglichkeiten, aber auch die Herausforderungen, die die Nutzung von GPIOs mit sich bringen erläutern. Fachleute mögen mir verzeihen, dass ich hier manche Begriffe recht banal erkläre, aber Dank Raspberry Pi und Co gibt es inzwischen doch eine riesige Anwendergruppe und nicht jeder davon hat Elektrotechnik oder Elektronik studiert, was im übrigen auch überhaupt nicht notwendig ist, um sich mit den zahlreichen Möglichkeiten von GPIOs zu beschäftigen.

 

Was ist ein GPIO

Der Begriff GPIO ist die Abkürzung für General Purpose Input / Output, was frei übersetzt soviel heißt wie Eingang / Ausgang für allgemeine Zwecke. Diese GPIOs gibt es nicht erst seit dem Raspberry Pi. Die Chiphersteller wollten natürlich, dass ihre Entwicklungen möglichst breite Anwendungsspektren haben, was lag also näher, viele Pins der Schaltkreise so flexibel wie möglich zu gestalten und ihnen erst durch entsprechende Programmierung eine Funktion zuzuteilen. GPIOs gibt es also schon bedeuten länger, waren aber bisher nicht so gut zugänglich, um sie auch als "Normalo" zu nutzen. Im Allgemeinen können wir in solche Schaltkreise nicht ohne weiteres hineinschauen, müssen uns also darauf verlassen, was der Hersteller preisgibt und das ist oft nicht allzuviel. Aus diesem Grund nehmen wir so einen GPIO mal als einen Anschluss mit unbekanntem Innenleben hin.

gpio allgemein

Als Bauteil könnte man einen GPIO so wie im Bild darstellen. Wir haben eine Spannungsversorgung (V ist dasZeichen für Spannung, das untere Zeichen nennt man Masse oder auch Erde) und erst mal einen Anschluss, der ohne Programmierung gar nichts kann. Wir und der GPIO wissen noch nicht mal, ob da Strom rauskommt oder welcher rein soll. Was wir aber unbedingt bedenken sollten ist, dass in so einem Schaltkreis tausende Bauelemente ihrer Arbeit nachgehen sollen und dass alles ziemlich klein ist. Also viel Leistung dürfen wir dem GPIO nicht abverlangen. Wieviel das sein darf ist von Schaltkreis zu Schaltkreis unterschiedlich und wir müssen dann wohl oder übel in der Dokumentation des Gerätes oder im Datenblatt des Schaltkreises nachschauen, was unser GPIO vertragen kann.


GPIO und Pegelgpio pegel

Aber so ein GPIO soll Zustände ein- oder annehmen und nicht Räume heizen. Zustände ein- und annehmen bedeutet, dass entweder eine Spannung am GPIO ausgegeben werden soll, dass wäre dann ein Ausgang oder eine Spannung an den GPIO angelegt werden soll, dass wäre dann ein Eingang. Spannungen, die vorwiegend zu Steuerungszwecken angelegt oder abgegeben werden, nennt man auch Pegel. Normalerweise misst man einen Pegel immer gegen Gerätemasse.

Schön einfach wäre es, wenn nun ein Pegel genau definiert wäre, ist er aber nicht. Bei digitalen Anwendungen, wo es bekanntlich nur die Zustände "Ein" und "Aus" geben sollte, ist das noch überschaubar, wie wir gleich sehen werden. Ein GPIO ist aber nicht auf die digitale Welt beschränkt, sondern kann, wenn er so entworfen ist, auch analoge Signale verarbeiten. Auch dazu werden wir noch kommen.

 

Digitale Pegel

gpio digitalNehmen wir uns erst mal den digitalen Pegel vor, den man auch Logikpegel nennt. Hier nutz man, um die Zustände zu beschreiben Begriffe wie high, H oder 1 und low, L oder 0. Wer nun glaubt, man könnte diesen Logikpegeln eine konkrete Spannung zuordnen liegt leider falsch. Es gibt mehrere Logikpegel, die auf Grund der technischen Entwicklung entstanden sind. Dies hängt damit zusammen, dass die Geräte immer energiesparender und mobiler werden sollen und auch mit neuen leichteren Energiespeichern ausgerüstet werden, die dann nicht unbedingt hohe Spannungen liefern. Ich möchte Euch jetzt nicht verwirren, aber wir sollten kurz mal über folgende Tabelle sprechen.

 

  EingangAusgang
BezeichnungBetriebs
-spannung
low highlowhigh
TTL5V  ≤ 0,8  ≥ 2,0  ≤ 0,4  ≥ 2,4
CMOS5V  ≤ 1,5  ≥ 3,5  ≤ 0,5  ≥ 4,44
LVTTL / CMOS3,3V  ≤ 0,8  ≥ 2,0  ≤ 0,4  ≥ 2,4
CMOS2,5V  ≤ 0,7  ≥ 1,7  ≤ 0,2  ≥ 2,3
CMOS1,8V  ≤ 0,7  ≥ 1,17  ≤ 0,45  ≥ 1,2

 

Wie Ihr seht gibt es da mehrere Standards, wobei eben selbst im digitalen Bereich low nicht 0V und high nicht gleich der Betriebsspannung ist. Typische 5V Vertreter sind z.B. einige Arduinomodelle oder auch der USB-Anschluss. 3,3V kommt uns natürlich vom Raspberry Pi her bekannt vor. Auch Banana Pi und Arietta G25 nutzen den 3,3V Pegel. Inzwischen gibt es auch Mikroprozessoren die den 2,5V Pegel nutzen. Das scheint aber nur eine Zwischenstufe zu sein, denn immer häufiger findet man Geräte wie zum Beispiel den Intel® Edison mit einem 1,8V Pegel.

Warum erzähle ich Euch das nun? Der Grund ist folgender: Wir wollen mit den GPIOs schließlich mit der Aussenwelt in Verbindung treten. Passen nun die Teile, die wir anschließen möchten nicht zu den Pegeln, gibt es Probleme. Eine bekannte Herausforderung ist zum Beispiel der Anschluss einer Relaiskarte, die für den 5V-Pegel des Arduino entwickelt wurde, an den Raspberry Pi.

 

Analoge Signale

gpio analogIch erwähnte bereits, das es auch GPIOs gibt, die analoge Signale verarbeiten oder abgeben können. Analog bedeutet in unserem Fall, dass der GPIO in der Lage ist, in einem bestimmten Bereich einen kontinuierlichen Spannungsverlauf abzugeben oder aufzunehmen. Es gibt also keine Konstanten wie high und low. Irgendwo im Chip wird das Signal dann aber doch wieder in die digitale Welt gebracht. Die Schaltung die dafür verantwortlich ist, nennt man für den Eingang eines analogen Signals Analog-Digital-Wandler. Für den analogen Ausgang nutzt man, wie soll es auch anders sein, einen Digital Analog-Wandler. An dieser Stelle soll uns als Erkenntnis erst einmal ausreichen, dass es sowas gibt, den die Umwandlung von analogen in digitale Signale und umgekehrt ist schon wieder ein Thema für sich.


GPIO ansprechen

Egal ob analog oder digital, bisher wissen weder der GPIO noch wir, was er zu tun hat. Wir brauchen also eine Möglichkeit, dem GPIO mitzuteilen, was er ist. Unter Umständen müssen wir dem GPIO überhaupt erst sagen, dass er einer ist, was man auch als initialisieren bezeichnet. Da die meisten Boards mit Linux funktionieren werde ich mich darauf beziehen, konkret auf die recht häufig verwendete Distribution Debian. Der Raspberry Pi, der Banana Pi oder auch das Arietta G25 Board funktionieren zum Beispiel mit angepassten Debianversionen (Raspbian, Bananian, Embian). Im Übrigen baut zum Beispiel auch die weit verbreitete Distribution Ubuntu auf Debian auf.

Einer meiner Lieblingssprüche zu Linux ist die sehr zutreffende Bemerkung "Alles ist eine Datei". Tatsächlich ist es so, dass sich bei Linux, vorhandene Treiber vorausgesetzt, alles in Dateien finden lässt. Üblicherweise findet man die GPIOs im Verzeichnis /sys/class/gpio.

Egal, ob wir nun über die Eingabeaufforderung oder die grafische Oberfläche mit einem Dateimanager gehen, wir werden das Verzeichnis finden, aber es wir leer sein, es sei denn, unser System wurde bereits für die Nutzung bestimmter GPIOs vorbereitet. Eine Herausforderung werden wir bei der ganzen Geschichte jedoch immer haben, Verzeichnisse, die vom System angelegt werden, benötigen spezielle Zugriffsrechte. Der systemnaheste Nutzer bei Linux wird als "root" bezeichnet. Um solche Grundlagen müssen wir uns irgendwann kümmern, an dieser Stelle soll aber erst mal ausreichen, dass derjenige, der an oder in diesem Verzeichnis Änderungen vornehmen möchte, root sein bzw. root-Rechte besitzen muss oder aber wir ändern was an den Verzeichnisrechten. Da beginnen wir uns nun im Kreis zu drehen. Genau: Derjenige der Änderungen an Systemverzeichnissen vornehmen möchte, muss root sein. Ihr bemerkt, Rechte und Berechtigungen unter Linux sind ein eigenes Thema. Ich verrate hier schon mal, dass man sich mit dem Kommando "sudo" am Anfang einer Befehlszeile root-Rechte verschaffen kann. Diese Funktion gibt es auch auf der grafischen Oberfläche und wird dort oft als Schaltfläche oder Menüpunkt "Mit Administratorrechten ausführen" angeboten. Da wir uns an dieser Stelle vorwiegend mit der Hardware der GPIOs beschäftigen, soll es damit auch genug sein. An anderer Stelle werde ich genau darauf eingehen, wie GPIOs mittels Software eingestellt werden.


GPIO als Eingang

640px 80486dx2 largeHaben wir unseren GPIO per Software als Eingang konfiguriert, hat er die Aufgabe die Pegel high und low eindeutig zu erkennen. Nun liegen ja in so einem Schaltkreis tausende von Bauteilen äußerst dicht zusammen und da ist es nicht unwahrscheinlich, das sich diese Bauteile gegenseitig beeinflussen. Ich habe mal zur Verdeutlichung das Bild (Quelle: Wikimedia) eines geöffneten Schaltkreises eingefügt. Man sieht sehr gut, wie dicht alles zusammenliegt und wie dünn die Drähtchen zu den äußeren Anschlüssen sind. Tatsächlich wird in der Praxis bei der Abfrage häufig an un- oder nicht korrekt beschalteten GPIOs ein wechselnder und damit undefinierbarer Pegel festgestellt. Um solchen unerwünschten Effekten entgegenzuwirken, kann man den GPIOs zu definierten Pegeln verhelfen. Die Methode nennt sich "pull" was aus dem englischen übersetzt "ziehen" heißt. Ziehen wir einen Pegel auf low ist es ein "Herunterziehen", im englischen "pulldown", auf high ein "Raufziehen" im englischen "pullup". Wie das technisch umgesetzt wird, schauen wir uns nun mal an.

 

Pullup und Pulldown

gpio low Garantiert auf low bekommen wir den GPIO, wenn wir ihn direkt mit der Masse (auch GND, "-", Erde, ...) verbinden. Der GPIO hat dann bei einer Abfrage mit einer beliebigen Software dauerhaft den Pegel low. Das kann in manchen Fällen gewünscht sein, häufig soll jedoch ein wechselnder Zustand des GPIOs erfasst werden.
 gpio schalter Basteln wir mal einen Schalter zwischen GPIO und Betriebsspannung.
gpio kurzer Ihr seht schon, irgendwas ist faul. Wäre der Schalter wie hier auf dem Bild geschlossen, fabrizieren wir einen klassischen Kurzschluss. Also ganz so rabiat geht es dann wohl nicht. Was können wir tun?
 gpio pulldown Probieren wir also die sanfte Methode. Tatsächlich reicht es auch, wenn wir einen Widerstand vom GPIO gegen Masse legen, um den GPIO auf low zu ziehen. In der Praxis haben sich dort Werte um die 10 kiloOhm (10k) bewährt. Es ließe sich auch bestimmt berechnen, welcher Wert optimal wäre, aber wie schon weiter vorn bemerkt, müsste man dazu die genaue interne Schaltung kennen. Ein Blick in das Datenblatt des Schaltkreises könnte auch weiterhelfen. Dort ist auch zu finden, ob interne Widerstände vorhanden sind, die sich per Software einstellen lassen. Beim Raspberry Pi ist das z.B. möglich. Ich nutze jedoch grundsätzlich externe Widerstände, da ich so komplett unabhängig vom Gerät bleibe und auch nicht in der Software dafür sorgen muss, dass diese Widerstände geschaltet werden. In diesem Fall nutze ich einen Pulldown-Widerstand.
 gpio pulldown schalter Jetzt können wir auch beruhigt einen Schalter benutzen. Der GPIO wird, solange der Schalter offen ist, sicher auf low gezogen. Wird der Schalter geschlossen gibt es ein high am GPIO, da der Widerstand zwischen GPIO und Betriebsspannung bedeutend geringer ist (beinahe 0) als der 10k Pulldown-Widerstand gegen Masse. Also können wir damit schon mal den Eingangspegel am GPIO umschalten.
 gpio pullup Das ganze geht natürlich auch umgekehrt. Mit einem Pullup-Widerstand vom GPIO gegen die Betriebsspannung ziehen wir den Pegel sicher auf high.
 gpio pullup schalter

Nun können wir mit dem Schalter den Pegel auf low ziehen. Welche Variante man wählt, hängt immer vom konkreten Anwendungsfall ab.

Bei der Schaltung kam bei mir die Frage auf, was passiert eigentlich, wenn ich ausversehen den GPIO als Ausgang schalte und der Schalter geschlossen ist? Hat der Schaltkreis keinen internen Schutz und der Ausgang ist über die Software auf high gestellt, liegt dort ja Betriebsspannung an. Bei geschlossenem Schalter würde ich den GPIO mit der Masse kurz schließen. Es ist also zu bedenken, ob und wie der GPIO davor geschützt wird.

 gpio schutz Einfach und wirkungsvoll ist ein Widerstand zwischen Schalter, Masse und GPIO. Mit dem Widerstand, der natürlich bedeuten kleiner sein muss als der Pullup begrenzen wir den Strom auf ein für den GPIO erträgliches Maß. 1 kiloOhm (1k) haben sich in der Praxis bewährt. Bei 5V würde ein Strom von 5mA fließen, dass sollte bei den meisten Schaltkreisen keinen Schaden anrichten, reicht aber dicke aus, um den GPIO sicher auf low zu bringen.
gpio digital

Es muss nicht unbedingt ein Schalter sein, der am GPIO den Pegel vorgiebt. Eine Spannung zwischen GPIO und Masse wird natürlich auch als Pegel erkannt. Ihr erinnert Euch an die Tabelle mit den verschiedenen Pegeln weiter vorn. Also eine Spannung annähernd der Betriebsspannung wird als high erkannt, eine Spannung nahe 0V als low. Je nach Schaltkreis kann der Wechsel zwischen high und low verschieden schnell erfolgen und bis in den 20er kiloHertz-Bereich (1kHz = 1000 Wechsel in der Sekunde) reichen.

Ganz wichtig!

Die Spannung, welche zwischen GPIO und Masse angelegt wird, darf nie die maximal zulässige Spannung, die im Datenblatt für den GPIO angegeben ist überschreiten!

Es fließt dann ein zu hoher Strom! Damit wird der Schaltkreis zerstört. Kein Wunder, wenn wir uns das Bild mit den dünnen Drähtchen beim aufgeschnittenen Schaltkreis nochmal vor Augen führen.


Der GPIO als Ausgang

Ein GPIO ist keine Leistungsstufe und erreicht schon bei wenigen Milliampere (1 mA = 1/1000 A) seine Grenzen. Bei den meisten Schaltkreisen sind die GPIOs nur in der Lage zwischen low und high zu wechseln, das aber wie beim Eingang auch verdammt schnell. Das kann man sich zu nutze machen, um trotzdem Helligkeit von Leuchtmitteln oder Drehzahl von Motoren z.B. über die Pulsweitenmodulation (PWM) analogähnlich zu steuern oder mit GPIOs verschiedene Schnittstellen und Bussysteme zu betreiben. Dazu aber an anderer Stelle mehr.

ledMotoren, Relais pder leistungsstarke Leuchtmittel kann man also nicht direkt anschließen. Selbst eine LED mit 20 mA Stromfluss kann einen GPIO oder den ganzen Schaltkreis bereits schädigen. Auch hier ist es also ganz wichtig vorher ins Datenblatt zu schauen oder Anleitungen genau zu befolgen. Zum Ausprobieren sollte man also maximal eine low current LED (low current = Niedrigstrom) benutzen. Die funktioniert schon ab ca. 2 mA. Nutzt man z.B. den Raspberry Pi mit einer Spannung von 3,5 V am GPIO, liegt man mit Vorwiderständen zwischen 600 und 800 Ohm genau richtig. Setzt man nun einen GPIO mit der Software auf high, sollte die LED Leuchten.

 

transistorstufeBesser ist, von vornherein eine Schaltung vorzusehen, die den GPIO entlastet. Da bietet sich z.B. eine Transistorstufe an. Je nach Transistor und Stromversorgung kann so schon eine Leistung von einigen Watt geschaltet werden. Es gibt noch weitere Möglichkeiten wie Optokoppler oder Transistorarrays (mehrere Transistorstufen in einem Schaltkreis) um die GPIOs zu entlasten. Viele Erweiterungen wie z.B. spezielle Relaiskarten, Motorsteuerungen oder LED-Treiberstufen haben einen entsprechenden Schutz bereits eingebaut, so dass sie direkt an den GPIOs betrieben werden können. Teilweise sind solche Erweiterungen so aufgebaut, dass sie auf die Stiftleiste des jeweiligen Gerätes aufgesteckt werden können. So wird es z.B. beim Arduino, beim Raspberry Pi oder auch beim Banana Pi gemacht. Je nach Anwendungsfall muss man sich dann entscheiden, welche Variante man wählt.

 

relaiskarterelaisraspiSC13523 30 grande