Mail to Code: Tutorial

Lernt, wie man den Code für Rechenknechte schreibt.

English version English Version

GPIOs als digitale Eingänge

PC versus microcontroller
Abbildung 1:
Für die Programmierbeispiele in diesem Kapitel werden ein Schalter und eine LED, sowie drei 1kΩ Widerstände benötigt.
Achtung: wie bei LEDs dürfen Schalter nicht direkt an einen GPIO angeschlossen werden! Es muss immer ein Reihenwiderstand von etwa 1kΩ verwendet werden!
Die LED wird mit dem Reihenwiderstand an GPIO 3 angeschlossen, der Schalter mit dem Reihenwiderstand an GPIO 9. GPIO 9 wird außerdem über einen weiteren 1kΩ Widerstand mit dem +5V Pin verbunden. Achtung! wird ein anderer Mikrocontroller als ein Arduino UNO oder ein MEGA verwendet, muss der 3.3V Pin verwendet werden!

Signale einlesen

Der Befehl zum Einlesen einer Spannung an einem GPIO lautet digitalWrite(). Dabei wird nicht die aktuell anliegende Spannung als Wert an das Programm zurückgegeben, sondern lediglich, ob diese momentan ober- oder unterhalb eines gegebenen Schwellwertes liegt. Ist die Spannung aktuell über dieser Grenze, so wird eine "1" zurückgegeben, andernfalls eine "0". Dieser Schwellwert liegt in etwa bei der halben Logikspannung des verwendeten Mikrocontrollers. Beim ATmega328 (UNO) und ATmega2560 (MEGA) beträgt die Logikspannung 5V, der Schwellwert liegt bei etwa 2.5V.
Im Modus als digitaler Eingang lässt sich feststellen, ob an einem GPIO gerade eine logische "1" (+5V oder +3.3V, je nach verwendeten Mikrocontroller) oder eine logische "0" (0V) anliegen.

Schalter einlesen und Zustand an LED ausgeben

1
2
3
4
5
6
7
8
9
10
11
12
// Define a variable to hold the switch state
int input_state = 0;
 
void setup() {
  pinMode(3, OUTPUT);  // This is where the LED is connected
  pinMode(9, INPUT); // This is where the switch is vonnected
}
 
void loop() {
  input_state = digitalRead(9);
  digitalWrite(3, input_state);
}
    
Wird dieses Beispiel ausgeführt, so leuchtet die LED an Pin 3 nur, wenn der Schalter geöffnet ist. Wird der Schalter geschlossen, so erlischt die LED

1
2
3
4
5
6
7
8
void setup() {
  pinMode(3, OUTPUT);  // This is where the LED is connected
  pinMode(9, INPUT); // This is where the switch is connected
}
 
void loop() {
  digitalWrite(3, digitalRead(9));
}
    
Das Beispiel funktioniert auch ohne den Umweg über die variable input_status, indem der Wert von digitalRead() direkt an digitalWrite() übergeben wird.

Pull-Up Widerstand

Wenn ihr das obige Programmbeispiel geladen habt, dann entfernt den Schalter und die Widerstände von GPIO 9. Wenn ihr nun die Lötstelle von GPIO 9 auf der Rückseite der Platine mit dem Finger berührt oder darüber streicht, so blinkt die LED unregelmäßig. Ist ein GPIO als Eingang geschaltet und keinerlei Peripherie mit dem Pin verbunden, so genügen bereits kleinste Ladungsänderungen, um die Spannung an dem Pin zwischen HIGH und LOW hin und her springen zu lassen. So ein wenig Ladung wird beim Berühren der Lötstelle mit dem Finger immer übertragen, was den Zustand des GPIOs ändert.
Wird ein 1kΩ Widerstand zwischen GPIO und +3.3V Pin geschaltet, so leuchtet die LED. Die Spannung an GPIO 9 ist 3.3V, was deutlich über dem Schwellwert liegt. Somit wird eine logische "1" an das Programm zurückgegeben und die Zeile:
digitalWrite(3, digitalRead(9));
schaltet die LED ein. Wird nun die Lötstelle von Pin 9 mit dem Finger berührt, so ändert sich der Schaltzustand nicht. Die sehr geringe Ladungsmenge, die von dem Finger auf den Pin übergeht, wird sofort über den Widerstand zum +3.3V Pin abgeführt.
Für das nächste Experiment wird der Widerstand zwischen GPIO 9 und dem +3.3V Pin wieder entfernt und anschließend der Schalter mit dem 1kΩ Reihenwiderstand zwischen GPIO 9 und Masse angeschlossen. Ist der Schalter geöffnet und wird die Lötstelle von GPIO 9 mit dem Finger berührt, so beginnt die LED wieder, unkontrolliert zu blinken. Erst wenn der zweite 1kΩ Widerstand wieder zwischen GPIO 9 und den +5V (oder dem +3.3V) Pin geschaltet wird, hat das Berühren der Lötstelle keinen Einfluss mehr auf den eingelesenen Schaltzustand. Die LED leuchtet, wenn der Schalter geöffnet ist und die LED erlischt, wenn der Schalter geschlossen wird.
Der Widerstand zwischen Pin 9 un dem +5V Pin wird als Pull-Up Widerstand bezeichnet, da dieser die Spannung an dem Pin bei offenem Schaltkreis auf die Logikspannung von +5V hochzieht (Englisch: to pull up).

Interner Pull-Up Widerstand

Mikrocontroller besitzen oftmals einen eingebauten, internen Pull-Up Widerstand, der allerdings standardmäßig deaktiviert ist. Der ATmega328 und der ATmega2560 bilden diesbezüglich keine Ausnahme. Aktiviert wird dieser Widerstand für einen GPIO mit dem Befehl:
pinMode(9, INPUT_PULLUP);
Damit können wir auf den zweiten Widerstand an dem Schalter verzichten:
1
2
3
4
5
6
7
8
9
void setup() {
  pinMode(3, OUTPUT);  // This is where the LED is connected
  // Use Pin 9 as input with activated, internal pull-up resistor.
  pinMode(9, INPUT_PULLUP); // This is where the switch is connected
}
 
void loop() {
  digitalWrite(3, digitalRead(9));
}
    
Nun kann auch bei geöffnetem Schalter die Lötstelle von Pin 9 mit dem Finger berührt werden, ohne dass sich der Schaltzustand der LED ändert.





Du findest diese Seite klasse?

Gummibärchen als Nervennahrung beim Programmieren und der Betrieb dieses Servers verschlingen mein Geld.
Helft mit einer Motivationsspritze, dieses Projekt am Laufen zu halten.

Klick hier oder scan den QR Code, um eine Spende zu überweisen.



Vielen Dank!

Fragen? Anregungen? Fehler gefunden?
Kontakt per E-mail: question@h1i1.de