Raspberry Pi: GPIO mit Pullup- oder Pulldown-Widerstand beschalten?

Raspberry Pi: GPIO - General Purpose Input Output

GPIOs kann man wahlweise als Eingänge und Ausgänge nutzen. Natürlich in Abhängigkeit ihrer Konfiguration. Es wird empfohlen, GPIO-Eingänge mit einem Pullup- oder Pulldown-Widerstand zu beschalten.

Hierzu klären wir mehrere Grundsatzfragen:

  1. Warum braucht ein GPIO-Eingang einen Pullup- oder Pulldown-Widerstand?
  2. Welches Verhalten hat ein GPIO-Eingang ohne Widerstand?
  3. Welches Verhalten hat ein GPIO-Eingang mit Pullup-Widerstand?
  4. Welches Verhalten hat ein GPIO-Eingang mit Pulldown-Widerstand?
  5. Welche Werte sollten Pullup- und Pulldown-Widerstände haben?
  6. Warum sollte ein Pullup- oder Pulldown-Widerstand nicht kleiner als 10 kOhm sein?
  7. Welches Prinzip wendet man an: Pullup- oder Pulldown-Widerstand?

1. Warum braucht ein GPIO-Eingang einen Pullup- oder Pulldown-Widerstand?

Wenn man einen GPIO als Eingang konfiguriert, dann hat der noch unbeschaltete GPIO-Eingang noch keinen festgelegten Zustand. Das heißt, er liegt nicht zwangsläufig bei "High" oder "Low". CMOS-Eingänge, wie GPIO-Eingänge, tendieren dazu, den Zustand "High" (1) zu haben. Darauf darf man sich aber nicht verlassen. GPIO-Eingänge neigen dazu zufällig in die eine oder andere Richtung zu schalten. Das heißt, sie haben mal den Zustand "Low" (0) und mal den Zustand "High" (1). Und zwar abhängig davon, was sich der jeweilige Pin oder Anschlusspunkt gerade einfängt. Das einflussnehmende Spektrum reicht von hochfrequenten Einstreuungen umliegender Bauteile und Pins, bis hin zu Überspannung. In der Regel sind das unerwünschte Effekte, die dazu führen, dass der Zustand eines GPIO-Eingangs völlig undefiniert zwischen "High" und "Low" hin- und herspringt. Das hat den Nachteil, dass wenn man einen GPIO-Eingang auswertet, nie sicher sein kann, welchen Zustand er wirklich hat.

Um dem entgegenzuwirken, verhilft man einem GPIO-Eingang zu einem definierten Grundzustand. In der Praxis versieht man den jeweiligen Pin mit einem Pullup- oder Pulldown-Widerstand. Abhängig davon, ob man standardmäßig den Zustand "High" oder "Low" erwartet.

"Pull" heißt "ziehen". Das bedeutet, der GPIO wird auf einen bestimmten Pegel (Spannungswert) "gezogen". Pullup bedeutet auf "High" rauf- und Pulldown auf "Low" runterziehen. Das Hinaufziehen erreicht man, in dem man den GPIO-Pin über einen Widerstand mit einem Pin verbindet, der dauerhaft einen High-Pegel führt. In der Regel wird dafür die Betriebsspannung +VCC verwendet. Das Hinunterziehen erreicht man, in dem man den GPIO-Pin über einen Widerstand mit dem Ground (GND) verbindet.

Hinweis: Der Raspberry Pi hat auch interne Pullup- bzw. Pulldown-Widerstände, die normalerweise deaktiviert sind. Besser ist es, man verwendet externe Widerstände. Die kann man sehen und weiß dann, dass die GPIOs richtig beschaltet sind.

Auch Ausgänge kann man mit Pullup- oder Pulldown-Widerständen beschalten. Allerdings ist deren Sinnhaftigkeit abhängig vom nachfolgenden Schaltungsteil. Dieser Schaltungsteil hat auch Eingänge, die im Grundzustand definierte Pegel haben sollten. Das heißt, dass auch zwischen unterschiedlichen Schaltungs- und Bauteilen weitere Pullup- oder Pulldown-Widerstände zu finden sind.

2. Welches Verhalten hat ein GPIO-Eingang ohne Widerstand?


GPIO-Eingang ohne Widerstände

Was passiert eigentlich, wenn wir ohne Pullup- und Pulldown-Widerstände arbeiten?

Schalter offen

Der GPIO-Eingang hat keine Verbindung zu irgendwas. Er hängt praktisch in der Luft. Die Leitung vom Pin zum Schalter wirkt wie eine Antenne. Und diese Antenne empfängt irgendetwas. Die Eingangs-Elektronik kann damit natürlich nichts anfangen und schwingt undefiniert zwischen "low" (0) und "high" (1) hin und her.

Schalter geschlossen

Der GPIO-Eingang wird auf VCC gezogen. Die Eingangs-Elektronik erkennt einwandfrei ein "high" (1).

Auswirkungen

In der Praxis bedeutet das, dass wenn der Zustand eines GPIO-Eingangs softwareseitig abgefragt wird und einen geschlossenen Schalter erkennt, dann kann der aber auch offen sein. Und genau diese Unsicherheit möchte man natürlich vermeiden. Und deshalb sind GPIO-Eingänge grundsätzlich mit einem Pullup- oder Pulldown-Widerstand zu beschalten.

3. Welches Verhalten hat ein GPIO-Eingang mit Pullup-Widerstand?

Pullup-Widerstand

In diesem Schaltbild ist der Widerstand von VCC auf einen GPIO-Eingang geschaltet und der geöffnete Schalter vom GPIO-Eingang auf GND.
Das Schaltbild aus Pullup-Widerstand und Schalter kann man sich auch als Reihenschaltung aus zwei Widerständen vorstellen. Es gilt entsprechend die Spannungs- und Stromverteilung. Wobei der Schalter im offenen Zustand ein unendlich hochohmiger und im geschlossenen Zustand ein niederohmiger Widerstand ist.

Schalter offen

Bei offenem Schalter zieht der Widerstand den GPIO-Eingang gegen VCC. Hier liegen definitiv z. B. +3,3 V, also "high", an. Und deshalb wird dieser Widerstand Pullup-Widerstand genannt. Weil der Widerstand den GPIO auf die Betriebsspannung raufzieht.

Schalter geschlossen

Wird der Schalter betätigt, dann wird der GND mit dem GPIO-Eingang verbunden. Das hat folgenden Effekt: Die Spannung fällt komplett am Pullup-Widerstand ab und dadurch liegt am GPIO-Eingang GND an und somit ein "low".

4. Welches Verhalten hat ein GPIO-Eingang mit Pulldown-Widerstand?

Pulldown-Widerstand

In diesem Schaltbild ist der geöffnete Schalter von VCC auf den GPIO-Eingang geschaltet und der Widerstand vom GPIO-Eingang auf GND.
Das Schaltbild aus Pulldown-Widerstand und Schalter kann man sich auch als Reihenschaltung aus zwei Widerständen vorstellen. Es gilt entsprechend die Spannungs- und Stromverteilung. Wobei der Schalter im offenen Zustand ein unendlich hochohmiger und im geschlossenen Zustand ein niederohmiger Widerstand ist.

Schalter offen

Bei offenem Schalter zieht der Widerstand den GPIO-Eingang gegen GND. Hier liegt definitiv 0 V, also "low", an. Und deshalb wird dieser Widerstand als Pulldown-Widerstand bezeichnet. Weil der Widerstand den GPIO auf 0 V runterzieht.

Schalter geschlossen

Wird der Schalter betätigt, dann wird VCC direkt an den GPIO-Eingang gelegt. Das hat folgenden Effekt: Die Spannung fällt komplett am Pulldown-Widerstand ab und dadurch liegt am GPIO-Eingang VCC an und somit ein "high".

5. Welche Werte sollten Pullup- und Pulldown-Widerstände haben?

Wie groß die Widerstände sein sollen kommt ganz auf die Anwendung an. Im Normalfall eignen sich Werte von 10 bis 100 kOhm. Man muss also nicht zwangsläufig die oft empfohlenen 10-kOhm-Widerstände nehmen. Es darf auch mehr sein. Das ist geschickt, wenn man gerade keine passenden Widerstände da hat.
Es spricht sogar viel dafür einen größeren Wert als 10 kOhm zu verwenden. Beispielsweise liegen die intern zuschaltbaren Pullup- und Pulldown-Widerstände zwischen 50 und 65 kOhm. Daran sollte man sich orientieren. Ein Widerstandswert von 10 kOhm ist also eher als unterer Wert zu verstehen.
Ein größerer Widerstand als 10 kOhm ist gerade dann notwendig, wenn der Raspberry Pi per Batterie, Akku oder Solar betrieben wird. Dann kommt es auf geringstmöglichen Stromverbrauch an und genau dann sollte man vielleicht größere Widerstandswerte als 10 kOhm verwenden. Wenn nämlich im Grundzustand Strom über einen zu kleinen Pullup- oder Pulldown-Widerstand fließt, dann geht das zu Lasten des Stromverbrauchs und vermindert die Laufzeit.

Beispielrechnung: Bei einem VCC von 3,3 V und einem Pullup-Widerstand von 10 kOhm fließen im Grundzustand 0,33 mA über den Widerstand zum GPIO-Eingang. Das ist nicht viel. Aber mit einem höheren Widerstandswert kann man den Stromverbrauch noch weiter senken. Zum Beispiel mit 1 MOhm. Aber, dann muss man auch darauf achten, dass die Kontakte und Pins staubgeschützt sind, weil sonst der Kontaktwiderstand an den Pins dazu führt, dass es zu einem Spannungsteiler zwischen Pullup-/Pulldown-Widerstand und dem Kontaktwiderstand kommt. In so einem Fall kann man lange nach dem Fehler suchen.

6. Warum sollte ein Pullup- oder Pulldown-Widerstand nicht kleiner als 10 kOhm sein?

Geht man bei der Beschaltung eines GPIO-Eingangs von einer Schalter-Widerstands-Kombination aus, dann fließt im Grundzustand (offener Schalter) nur durch den Widerstand ein Strom. Wenn nun der Schalter betätigt wird, dann teilt sich die Spannung am Widerstand und am geschlossenen Schalter auf. Da der Schalter im Optimalfall 0 Ohm hat, weil geschlossen, fällt daran auch keine Spannung ab. Nun ist es aber so, dass ein Schalter nie ganz 0 Ohm hat. An einem Schalter fällt immer auch eine Spannung ab, die kaum messbar ist und deshalb vernachlässigt werden kann.
Das ist in der Regel auch kein Problem, weil wir es in der Regel mit geschützten Umgebungen zu tun haben, in denen der Raspberry Pi und seine äußere Beschaltung läuft. In rauhen Umgebungen mit Staubentwicklung, sich häufig veränderne Temperatur und hoher Luftfeuchtigkeit sieht es dagegen ganz anders aus. Durch chemische Prozesse verändert sich die Beschaffenheit von metallischen Oberflächen (z. B. Oxidation), wodurch sich der elektrische Widerstand von metallischen Kontakten und Übergängen verändert.
Wenn wir mit einem kleinen der Pullup- oder Pulldown-Widerstand arbeiten, dann kann es sein, dass sich das Verhältnis der Teilspannungen an Widerstand und Schalter ungünstig verändern. Gerade bei kleinen Spannungen und Strömen passiert das viel eher.
Deshalb ist ein Widerstandswert von mindestens 10 kOhm oder auch mehr zu empfehlen.

7. Pullup- oder Pulldown-Widerstand?

Die Fragestellung ist, wenn man die Wahl hat, ob man Pullup- oder Pulldown-Prinzip anwendet, also gegen Ground (GND) oder +VCC schaltet, welche Variante sollte man bevorzugen?

Eines gleich vorne weg. Von einem gewissen Standpunkt aus ist das ein philosophische Frage. Es spielt eigentlich keine Rolle. Allerdings birgt die praktische Elektronik und damit das Beschalten von GPIOs einige Tücken, weshalb es vielleicht doch eine Rolle spielt.

Wenn man die Wahl hat, ob man gegen GND oder VCC schaltet, dann ist das eine Frage der Störsicherheit. In der Praxis tendiert man dazu, GPIO-Eingänge mit einem Pullup-Widerstand mit +VCC zu verbinden und gegen Ground (GND) zu schalten.

Die Begründung: Beim Pullup-Prinzip, das heißt Widerstand gegen VCC, sind alle Schaltungsteile auf GND bezogen. Man hat also das niedrigste Impedanzniveau, dass die Schaltung bekommen kann. Wenn dieser GND eine Leiterbahn oder eine Fläche (Plane) auf einer Platine ist, dann hat das unter anderem auch den Vorteil, dass sich bei der äußeren Beschaltung mit der Platine kaum noch unerwünschte Stromschleifen bilden können. Ausgenommen, man arbeitet mit sehr hohen Frequenzen.
Fängt sich ein GND ein Störsignal ein, dann hat das auf den Rest der Schaltung (fast) keinen Einfluss. Zusätzliche Keramik-Kondensatoren zwischen VCC und GND sorgen für das selbe Potential.
Beim Pullup-Prinzip darf man sich also ganz blöd anstellen. Zum Beispiel auch eine ungünstige Leitungsführung vom Schalter zum GPIO-Pin.

Beim Pulldown-Prinzip ist das anders. Hier herrscht ein deutlich höheres Risiko, weil ein externes Störsignal auf den VCC Einfluss nehmen kann und für VCC unterschiedliche Leiterbahnen existieren. Das heißt, ein VCC kann sich eher eine Störung einfangen als ein GND. Erschwerend kommt hinzu, dass man im Störungsfall nicht erkennen kann, was da abläuft.
Wenn man mit Kondensatoren zwischen VCC und GND, sowie parallel zum Schalter arbeitet, dann kann man die Empfindlichkeit von VCC durch kurzzeitige Störimpulse niedrig halten. Trotzdem, wenn man auf Nummer sicher gehen will, dann ist das Pullup-Prinzip zu empfehlen.

Und jetzt kommen wir zur Alltags-Klein-Elektronik-Realität. Wenn man zum Beispiel die GPIOs eines Raspberry Pi beschaltet.
Gehen wir mal von einem relativ kleinen Gerät aus, worin die gesamte Schaltung aus einer Taster- oder Schalterfunktion besteht und von benachbarten Bauteilen oder Leiterbahnen kaum eine kritische Störung zu erwarten ist. Weil die bspw. nicht beschaltet sind. In so einem Fall ist es völlig irrelevant, ob das Pullup- oder Pulldown-Prinzip angewendet wird.

Ein Problem bekommt man nur dann, wenn man mit längeren Leitung zwischen Schalter und GPIO-Pin arbeitet. Und dann kommt es noch darauf an, wo diese Leitungen hinführen. Wenn z. B. ein 230-VAC-Kabel in der Nähe ist und am Kabelende eine Lampe ein- und ausgeschaltet wird, dann entstehen beim Schalten steile Spannungsflanken in diesem Kabel. Die streuen sich als kurze Nadelimpulse in die Zuleitung vom Taster oder Schalter zum GPIO ein. Bei einem offenen Kontakt kann es zur Fehltriggerung kommen, weil dieser Impuls am Ausgang der GPIO-Eingangsstufe weitergeleitet wird.

Man kann das vermeiden, indem man einen Keramik-Kondensator (Kerko) parallel zum Schalter oder Taster mit einem Wert von 100 nF einsetzen. In Kombination mit einem Pullup-Widerstand von 10 kOhm ergibt das eine Zeitkonstante von 1 ms. Das reicht, um feine Nadelimpulse abzublocken, die im Bereich von µs und darunter liegen.
Kondensator und Widerstand sollten möglichst nahe am GPIO liegen. Vor allem der Kondensator. Am Schalter oder Taster bringt der Kondensator nichts. Schon gar nicht bei einer langen Leitung.

Es gilt also folgende Raspberry-Pi-GPIO-Regel: Wenn wir nur einen einfachen Schalter am Raspberry-Pi-GPIO anschließen, um intern den Zustand zwischen "High" und "Low" zu wechseln (ein Programm wertet diesen Zustand aus). Dann nimmt man einen Pullup-Widerstand und schaltet nach GND.
Da der Grundzustand des GPIO-Eingangs dann in der Regel "High" bzw. "1" ist, wird mit "Low" bzw. "0" geschaltet. Dann muss man das im auswertenden Programm oder Quellcode negieren, wenn der Grundzustand "Low" oder "0" sein soll.

Weitere verwandte Themen:

Teilen:

Praxishandbuch Raspberry Pi

Das Raspberry Pi Praxishandbuch

  • Installation, Konfiguration und erste Schritte
  • Hardware, Software und Projekte
  • Schritt für Schritt zum Profiwissen

Mehr Informationen zum Praxishandbuch

Weitere Bücher zum Raspberry Pi