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. Warum sollte ein Pullup- oder Pulldown-Widerstand kleiner als 10 kOhm sein?
  8. Welches Prinzip sollte man anwenden? Pullup- oder Pulldown-Widerstand?
  9. Sollte man die internen Pullup-/Pulldown-Widerstände eines GPIO-Eingangs verwenden?

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 geschlossene Schalter im Optimalfall 0 Ohm hat, fällt daran auch keine Spannung ab. Nun ist es aber so, dass ein Schalter nie ganz 0 Ohm hat. An dem geringen Übergangswiderstand der Schalterkontakte fällt immer auch eine Spannung ab, die kaum messbar ist und deshalb in der Regel vernachlässigt werden kann.

Aber, wenn der Übergangswiderstand der Schalterkontakte zu groß ist und Pullup- oder Pulldown-Widerstand zu klein ist, dann kann es sein, dass sich das Verhältnis der Teilspannungen an Widerstand und Schalter ungünstig verändert. Unter Umständen wird der Pegel für ein High oder ein Low nicht erreicht. Gerade bei kleinen Spannungen und Strömen sollte man berücksichtigen, dass so etwas vorkommen kann.

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

Generell wird für Pullup- und Pulldown-Widerstände ein Widerstandswert von mindestens 10 kOhm oder auch mehr empfohlen. Nun ist es so, dass bei größeren Pullup- oder Pulldown-Widerständen auch die Störanfälligkeit bei Schaltern steigt.

Der Grund ist, dass in rauhen Umgebungen mit Staubentwicklung, sich häufig verändernde Temperatur und hoher Luftfeuchtigkeit durch chemische Prozesse die Beschaffenheit von metallischen Oberflächen verändert. So kann sich durch Oxidation oder Korrosion der elektrische Widerstand von metallischen Kontakten und Übergängen erhöhen.

Das ist dann kein Problem, wenn wir es mit einer geschützten Umgebungen zu tun haben, in der der Raspberry Pi und seine äußere Beschaltung vor äußeren Einflüssen geschützt ist.

Trotzdem empfehlen manche Elektronik-Praktiker mit Pullup- und Pulldown-Widerständen unter 10 kOhm bis runter auf 1 kOhm zu arbeiten. Die Idee dabei ist, dass ein signifikater Strom über die Schaltkontakte die Ablagerungen durchbricht. Der Strom reinigt sozusagen die Kontakte. Bei zu kleinen Strömen bleiben die Ablagerungen an den Schaltkontakten zurück und führen zu einem höheren Übergangswiderstand und somit zu Fehlern bei Erkennung des Schalterzustands. Desweiteren kann ein Strom von wenigen mA viel eher Störimpulse von außen schlucken, als ein Strom von nur wenigen µA.

8. Welches Prinzip sollte man anwenden? 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?

Die kurze Antwort: 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. Und deshalb folgt jetzt die lange Antwort.

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.

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. Gehen wir mal von einem relativ kleinen Gerät aus, worin die gesamte Schaltung aus einer Taster- oder Schalterfunktion besteht. Zum Beispiel wenn man die GPIOs eines Raspberry Pi beschaltet. Hier ist von benachbarten Bauteilen oder Leiterbahnen kaum eine kritische Störung zu erwarten. 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 goldene 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.

9. Sollte man die internen Pullup-/Pulldown-Widerstände eines GPIO-Eingangs verwenden?

Alle GPIOs haben einen internen, softwareseitig zuschaltbaren Pullup- bzw. Pulldown-Widerstand von 50 bis 65 kOhm. Ausnahmen sind die Pins 3 und 5 (GPIO 2 und GPIO 3). Das sind die Pins für SDA und SCL des I2C-Busses. Die sind physikalisch mit 1,8 kOhm fest mit Pullup-Widerständen beschaltet, die sich auch nicht abschalten lassen.

In der Regel ist es sinnvoll, echte Widerstände in der Schaltung zu verbauen. Weil man die nicht vergisst softwareseitig zuzuschalten. Das Problem dabei ist, dass man nicht sicher sein kann, dass das immer und in jedem Fall funktioniert. Wenn eine Eingangsschaltung darauf angewiesen ist, dann kann es zu einer Fehlfunktion führen, wenn der Widerstand fehlt. Insofern ist es besser, externe Widerstände zu verwenden. Da sieht man auch das sie vorhanden sind.

Wenn man doch die internen Widerstände zuschalten will, dann muss man berücksichtigen, dass externe Widerstände, die parallel geschaltet sind, in der Summe zu einem anderen Gesamtwiderstand führen.
Bei der Parallelschaltung von Widerständen gilt folgende Regel: Der Gesamtwiderstand der Parallelschaltung ist kleiner als der kleinste Teilwiderstand. Das bedeutet, dass ein Parallelwiderstand in jedem Fall dazu führt, dass der Strom steigt. Desweiteren gilt, dass bei zwei identischen Teilwiderständen der Gesamtwiderstand der Hälfte eines Teilwiderstands entspricht.

Das bedeutet nicht, dass die Beschaltung fehlerhaft ist, sondern dass die Annahmen, die man getroffen hat, nicht zutreffend sind und zu einer Fehlfunktion führen können, wenn man die Beschaltung bereits am Rande des machbaren betreibt.

Weitere verwandte Themen:

Teilen:

Produktempfehlungen