MINT lernen

Übungen: Arduino

Ein Chip, zwei Funktionen, ein paar Pins — hier lässt du LEDs blinken und Taster zählen, ganz ohne Lötkolben.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zu Mikrocontrollern, Arduino-Sketchen, Blinkfrequenzen und Tastern — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.

A1
Was steckt im Mikrocontroller?
AFB I

Ordne jedem Bestandteil bzw. jeder Funktion des Arduino Uno die passende Aufgabe zu.

Ansatz: Frage bei jedem Speicher: Bleibt der Inhalt nach dem Ausschalten erhalten?
Weiter: Die beiden Funktionen unterscheiden sich darin, wie oft sie laufen.
A2
Stimmt’s? — Arduino-Grundlagen
AFB I

Nenne zu jeder Aussage, ob sie stimmt.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Die Pull-up-Aussage ist die unbequemste: „Gedrückt = LOW“ wirkt verkehrt herum, ist aber bei INPUT_PULLUP immer so. Wer das vergisst, bekommt eine LED, die genau dann leuchtet, wenn man nicht drückt.
Ansatz: Denk an den Weg des Sketches: Wo wird übersetzt, wo wird ausgeführt?
Weiter: Bei INPUT_PULLUP liegt der Pin ohne Tastendruck auf HIGH.
A3
Lückensketch: LED an Pin 9
AFB I

Eine LED an Pin 9 soll immer wieder 0,3 s leuchten und 0,7 s dunkel sein. Gib für jede Lücke den passenden Eintrag an.

Wähle in jedem Menü den passenden Eintrag und prüfe dann alle auf einmal.
Arduino · blink9.ino
void setup() {
  pinMode(9, );
}

void () {
  digitalWrite(9, );
  delay();
  digitalWrite(9, LOW);
  delay();
}
delay erwartet Millisekunden: 0,3 s = 300 ms. Typischer Fehler: delay(0.3) — das wäre praktisch keine Pause. Und main schreibt man beim Arduino nicht selbst; die Arduino-Umgebung ruft setup und loop auf.
Ansatz: Ein Pin, der eine LED ansteuert, muss vorher als Ausgang eingestellt werden.
Weiter: 1 s = 1000 ms.
A4
Periode und Frequenz
AFB II
Arduino · loop
void loop() {
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  delay(300);
}

Berechne Schritt für Schritt, wie schnell die LED blinkt (die Befehle außer delay dauern nur Mikrosekunden).

Arbeite die Kette Schritt für Schritt ab: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Periodendauer \(T = t_{an} + t_{aus}\) ms
  2. Frequenz \(f = 1/T\) Hz
  3. Anzahl der Blinks in 10 s
  4. Gesamte Leuchtdauer in diesen 10 s s
T = 200 ms + 300 ms = 500 ms = 0,5 s, also f = 1 / 0,5 s = 2 Hz. In 10 s: 10 s · 2 Hz = 20 Blinks, jeder 0,2 s lang: 20 · 0,2 s = 4 s. Typischer Fehler: f = 1/500 = 0,002 rechnen — die Periodendauer muss erst in Sekunden umgerechnet werden, damit Hertz herauskommt.
Ansatz: Eine Periode ist einmal an plus einmal aus.
Weiter: Rechne T in Sekunden um: 500 ms = 0,5 s. Hertz heißt „pro Sekunde“.
A5
Tastendrücke zählen
AFB II
Arduino · zaehler.ino
int zaehler = 0;

void setup() {
  pinMode(2, INPUT_PULLUP);    // Taster gegen GND
  pinMode(13, OUTPUT);
}

void loop() {
  if (digitalRead(2) == LOW) {
    zaehler++;
    delay(300);                // Entprellen
  }
  if (zaehler % 3 == 0) {
    digitalWrite(13, HIGH);
  } else {
    digitalWrite(13, LOW);
  }
}

Analysiere fünf loop-Durchläufe. Die Spalte „Taster“ gibt an, ob er während des Durchlaufs gedrückt ist. Trage HIGH/LOW, den Zählerstand am Ende und an/aus ein.

Fülle alle Felder aus und prüfe dann. Enter in einem Feld prüft ebenfalls.
DurchlaufTasterdigitalRead(2)zaehlerLED
1los
2gedrückt
3gedrückt
4los
5gedrückt
Im ersten Durchlauf ist zaehler 0, und 0 % 3 ist 0 — die LED leuchtet also schon vor dem ersten Druck. Typischer Fehler: gedrückt mit HIGH gleichsetzen. Bei INPUT_PULLUP gilt: gedrückt = LOW. Beim dritten Druck ist zaehler 3, und die LED geht wieder an.
Ansatz: Erst digitalRead bestimmen (gedrückt = LOW), dann entscheiden, ob gezählt wird, dann zaehler % 3 prüfen.
Weiter: Die LED leuchtet bei den Zählerständen 0, 3, 6, …
A6
Dreifachblitz
AFB II Mix

Die for-Schleife aus 2.1.3 funktioniert im Sketch genauso wie in C.

Arduino · loop
void loop() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
  }
  delay(1400);
}

Werte den Sketch aus und markiere alle zutreffenden Aussagen.

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Ein Durchlauf: 3 · (100 + 100) ms + 1400 ms = 2000 ms. In 60 s sind das 30 Durchläufe mit je 3 Blinks = 90. Leuchtdauer pro Durchlauf 300 ms von 2000 ms = 15 %. Typischer Fehler: i < 3 als „bis einschließlich 3“ lesen — i nimmt nur 0, 1, 2 an. Und weil loop neu startet, beginnt auch die for-Schleife jedes Mal neu.
Ansatz: Rechne zuerst die Dauer eines Durchlaufs aus: drei Blinks plus Pause.
Weiter: 60 s : 2 s = 30 Durchläufe.
A7
Warum blinkt sie nicht?
AFB II Trick
Arduino · loop
void loop() {
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
}

Bestimme, wie oft man die LED in 10 s ausgehen sieht.

Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
Nach digitalWrite(13, LOW); fehlt eine Pause: loop beginnt sofort neu und schaltet die LED nach wenigen Mikrosekunden wieder an. Das Auge sieht ein Dauerleuchten — also 0. Typischer Fehler: 20 (wie bei T = 500 ms) — dabei zählt nur das, was man wirklich sieht.
Ansatz: Überlege, was direkt nach der letzten Zeile von loop passiert.
Weiter: Wie lange ist die LED pro Durchlauf aus? Kann man das sehen?
A8
Fehlersuche: LED per Taster
AFB III

Solange der Taster an Pin 4 (gegen GND) gedrückt ist, soll die LED an Pin 12 leuchten, sonst nicht. Überprüfe den Sketch — drei Zeilen sind fehlerhaft.

In diesem Code stecken Fehler. Klicke genau die fehlerhaften Zeilen an — die richtigen musst du stehen lassen.
Nur der Fehler in Zeile 7 ist ein reiner Logikfehler (die LED wäre genau falsch herum). Zeile 12 ist heimtückisch: Der Sketch scheint kurz zu laufen und hängt sich dann auf. Zeile 3 ist richtig — der Taster braucht den Pull-up.
Ansatz: Prüfe jeden pinMode: Eingang oder Ausgang? Und was liefert ein gedrückter Taster mit Pull-up?
Weiter: Eine Zeile ist überflüssig und sogar gefährlich, weil sie sich selbst immer wieder aufruft.
A9
Schneller oder langsamer?
AFB III

Ausgangssketch: LED an Pin 13, delay(400) an, delay(600) aus — also 1 Hz. Schätze für jede Änderung ab, wie sich die Blinkfrequenz ändert — ohne genau zu rechnen.

Wähle für jede Zeile eine Stufe: 1 = deutlich kleiner (höchstens halb so groß), 2 = etwas kleiner, 3 = gleich, 4 = etwas größer, 5 = deutlich größer (mindestens doppelt so groß). Mit der Tastatur: Tab zur Zeile, ←/→ zwischen den Stufen, Enter setzt.
1 = deutlich kleiner (höchstens halb so groß)5 = deutlich größer (mindestens doppelt so groß)
beide Pausen halbiert: 200 / 300
Pausen vertauscht: 600 an / 400 aus
nur die Aus-Pause verlängert: 400 / 800
beide Pausen verdreifacht: 1200 / 1800
nur die An-Pause verkürzt: 200 / 600
LED an Pin 8 statt 13 (Pins in beiden Befehlen angepasst)
Die Frequenz hängt nur von der Summe T = tan + taus ab: Halbe Summe heißt doppelte Frequenz, dreifache Summe ein Drittel. Vertauschen ändert T nicht — nur, wie lange die LED davon leuchtet. Typischer Fehler: beim Vertauschen „langsamer“ wählen, weil die LED länger an ist. Der Pin hat mit dem Takt gar nichts zu tun.
Ansatz: Berechne nur grob die neue Summe T und vergleiche sie mit 1000 ms.
Weiter: Größere Summe → kleinere Frequenz. 800 ms ist „etwas“, 500 ms ist „halb“.
A10
Fünfmal blinken — und Schluss
AFB III

Nach dem Einschalten soll die LED an Pin 10 genau fünfmal blinken (je 100 ms an, 400 ms aus) und danach dunkel bleiben. Entwirf den Sketch, indem du die Zeilen ordnest.

Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1void setup() {
2 pinMode(10, OUTPUT);
3 for (int i = 0; i < 5; i++) {
4 digitalWrite(10, HIGH);
5 delay(100);
6 digitalWrite(10, LOW);
7 delay(400);
8 }
9}
10void loop() { } // bleibt leer
Der Kern der Aufgabe: Etwas, das nur einmal passieren soll, gehört in setup. Stünde die Schleife in loop, würde die LED endlos weiterblinken. loop muss trotzdem vorhanden sein, auch wenn es leer ist. Häufig verrutscht: pinMode nach der Schleife — dann blinkt am Anfang nichts.
Ansatz: Überlege zuerst, ob der Blinkteil in setup oder in loop gehört.
Weiter: Im Schleifenrumpf: an, warten, aus, warten.