Ein Pullup- bzw. Pulldown-Widerstand wird dazu benutzt, um am Eingangspin für ein eindeutig definiertes
Signal (LOW oder HIGH) zu sorgen. Ohne einen Pullup- oder Pulldown-Widerstand kann es durch Störungen an
einem offenen Eingangspin zu Verfälschungen kommen, sodass falsche Signale vom Mikrocontroller erkannt werden.
Am Beispiel einer Schaltung zum Einlesen des Zustands eines Mikrotasters werden hier die verschiedenen
Möglichkeiten für Pullup-Widerstände am Arduino gezeigt.
Würde man den 10kΩ-Widerstand entfernen, so gäbe es einen Kurzschluss zwischen VCC und GND. Außerdem könnten durch Störungen das Signal nicht mehr korrekt ermittelt werden. Der Pulldown-Widerstand sorgt dafür, dass das Signal (und damit auch etw. Störungen) auf GND "herunter gezogen" wird.
Will man einen Pullup verwenden, muss man die Verbindung am Mikro-Taster zum GND- und VCC-Pin tauschen. Dann muss aber natürlich die Prüf-Logik in der Programmierung des Mikrocontrollers vertauscht werden, d.h. also einen geschlossenen Schalter auf LOW prüfen und einen offenen auf HIGH.
Der folgende, simple Sketch liest den Wert eines Mikro-Tasters über einen analogen Eingang aus:
#define BUTTON_PIN A0
int buttonValue = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
buttonValue = analogRead(BUTTON_PIN);
Serial.println(buttonValue);
delay(250);
}
Ist ein digitaler Port als Eingang geschaltet, so kann man elegant interne Pullups setzen, denn der ATMega-Chip im Arduino besitzt intern verbaute Widerstände, die man per Software aktivieren kann. Auf den meisten AVR-basierten Boards sind Pullups zwischen 20kΩ und 50kΩ verbaut, doch sieht man sich am besten die Datenblätter an, um den korrekten Wert zu ermitteln.
Der folgende Sketch zeigt, wie man den internen Pullup aktiviert. Hinweis: Hier wird das Verhalten des Pins invertiert, d.h. bei HIGH ist der Taster "aus" und bei LOW "an", d.h. gedrückt:
#define BUTTON_PIN 2
void setup()
{
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
Hinweis: Pin 13 ist gegenüber den anderen Pins schwieriger als INPUT zu benutzen, denn an diesem Pin ist ja noch zusätzlich eine LED und ein Widerstand auf dem Board verlötet. Wenn man also nun den internen Pullup für Pin 13 aktiviert, so werden nur etwas 1,7V anstatt der 5V anliegen, d.h. es gilt sozusagen immer als LOW. Falls man also wirklich Pin 13 als digitalen Input benutzen will, sollte man einen externen Pulldown-Widerstand verwenden.
Für den Arduino vor der Version 1.0.1 kann man den internen Pullup nur in folgender Weise aktivieren:
pinMode(pin, INPUT); // set pin to input
digitalWrite(pin, HIGH); // turn on pullup resistors
zurück