← Kapitel 4: Ampelsteuerung | ↑ Übersicht | Kapitel 6: Treppenhauslicht →

Kapitel 5: Eingänge

Wie in Kapitel 2 beschrieben, können wir jeden I/O-Pin beliebig als Ein- oder Ausgang definieren.

In Wirklichkeit hat ein I/O-Pin aber nicht nur diese zwei Zustände, sondern drei.

Den ersten kennen wir schon, den Ausgang. Diesen Zustand erhalten wir so:

pinMode(PIN, OUTPUT);

Damit wird PIN als Ausgang definiert und wir können mit den zwei Funktionen

digitalWrite(PIN, HIGH);
digitalWrite(PIN, LOW);

einstellen ob der Pin Spannung ausgibt oder mit Massse verbunden ist.

Ganz ähnlich funktioniert nun der Eingang, zuerst müssen wir den Pin als Eingang definieren:

Theoretisch sind alle Pins beim Start als Eingang konfiguriert, in der Regel definiert man die Pins aber trotzdem!
pinMode(PIN, INPUT);

Nun können wir PIN verwenden um zu überprüfen, ob dort Spannung anliegt oder der Pin mit Masse verbunden ist. Dazu wird dieser Befehl verwendet:

digitalRead(PIN);

Diese Funktion hat einen so genannten Rückgabewert, dieser Wert lautet HIGH wenn Spannung anliegt und LOW, wenn der Pin mit Masse verbunden ist.

Der Widerstand des Eingang-Pins ist allerdings sehr Hochohmig, das bedeutet, dass die berühmte „Mücke die vorbeifliegt“ schon ausreicht, dass der Pin zwischen HIGH und LOW wechseln kann. Wir benötigen daher einen Widerstand, der den Pin definiert in eine Richtung zieht.

Wir modifizieren unsere Ampelschaltung und erweitern sie um einen Taster und einen Widerstand:

  • 10k-Ohm Widerstand: Linke Versorgungsspannungsschiene und B12
  • Taster: (wie im Bild zu sehen) E12, E14, F12, F14
  • Braunes Kabel von der Versorgungsspannungsschiene zu VCC.
  • Blaues Kabel von H14 zur Masseschiene.
  • Violettes Kabel von D12 zu Gscheiduino Pin7.

Der Aufbau sollte also so aussehen:

Bradboardaufbau Eingang

Somit erhalten wir folgende Schaltung:

Schaltung Eingang

Der Widerstand sorgt dafür, dass der Eingangs-Pin definiert auf 5V liegt, wird die Taste gedrückt, verbindet diese Pin7 mit Masse.

Wir sollten also folgendes Ergebnis erhalten:

  • Taste ungedrückt: Eingang HIGH
  • Taste gedrückt: Eingang LOW

Das testen wir mit unserem ersten Beispiel:

Wenn wir von digitalRead direkt den Wert HIGH oder LOW zurückbekommen, können wir diesen Wert sehr komfortabel an einen Ausgang weitergeben.

Unser Ziel ist es:

  • Die rote LED leuchtet, wenn die Taste nicht gedrückt ist
  • Wenn die Taste gedrückt ist, erlischt die rote LED

Dazu verwenden wir den Code aus Kapitel 2 und erweitern ihn:

kapitel05_eingang.ino
void setup()
{
  pinMode(13, OUTPUT);  // Pin13 als Ausgang definieren
  pinMode( 7, INPUT);   // Pin7 als Eingang definieren
}
 
void loop() 
{
  digitalWrite(13, digitalRead(7)); // Anstatt HIGH oder LOW fragen wir hier Pin7 ab
}

Wenn wir das Programm auf den Controller laden erhalten wir das gewünschte Ergebnis.

Was zuvor mit „vorbeifliegende Mücke“ gemeint war kann man nun sehr einfach testen:

Wir entfernen den 10k-Ohm Widerstand aus der Schaltung, nun hängt Pin7 über das violette Kabel hochohming in der Luft. Wenn wir nun das violette Kabel berühren und loslassen, fängt die rote LED an zu leuchten bzw. erlischt.

Ein hochohmiger Eingang ist in der Digitaltechnik instabil, es sollte immer ein Widerstand gegen VCC oder GND verwendet werden, um einen definierten Pegel zu erhalten!

Um uns diesen externen Widerstand zu sparen, können wir eine sehr geniale Funktion der AVR-Controller nutzen: Die internen Pullup-Widerstände.

Im Datenblatt ist dieser so dargestellt:

internet Pullupwiderstand

Jeder I/O-Pin besitzt so einen Pullup-Widerstand. Eingeschaltet wird dieser sehr einfach mit folgenden zwei Schritten:

  1. Pin als Eingang definieren
  2. Pin auf HIGH setzen

Pin auf HIGH-setzen geschieht wie wir es in Kapitel 2 gelernt haben. Der Code sieht also so aus:

pinMode(PIN, INPUT);
digitalWrite(PIN, HIGH);

Testen können wir das an unserem aktuellen Aufbau, bei dem wir den Widerstand entfernt haben. Wir erweitern den Code wie folgt:

kapitel05_eingang-pullup.ino
void setup()
{
  pinMode(13, OUTPUT);   // Pin13 als Ausgang definieren
  pinMode( 7, INPUT);    // Pin7 als Eingang definieren
  digitalWrite(7, HIGH); // Pullup an Pin7 einschalten
}
 
void loop() 
{
  digitalWrite(13, digitalRead(7)); // Anstatt HIGH oder LOW fragen wir hier Pin7 ab
}

Wenn wir diesen Code auf den Controller laden erhalten wir das selbe Ergebnis wie mit Widerstand, die LED erlischt erst, wenn wir die Taste drücken. Ein Berühren des violetten Kabels hat keine Auswirkungen.

Wir vertiefen unser Wissen wieder mit einem kleinen Beispiel: Kapitel 6: Treppenhauslicht