Aufgabe Vorschlag B - Aufgabe 2.2–2.3 · Abitur Hessen Elektrotechnik LK 2021

Thema: Mikrocontroller programmieren (Arduino) · Aus der Prüfung LK (2021)

Aufgabenstellung

Eine Lehrmittelfirma entwickelt einen Versuchsaufbau, mit dem im Physikunterricht die gleichmäßig beschleunigte Bewegung auf einer schiefen Ebene untersucht werden soll. Die schiefe Ebene ist in Material 4 dargestellt.

Wird der Elektromagnet stromlos geschaltet, so beginnt der Wagen zu rollen und unterbricht nach einer bestimmten Zeit die Lichtschranke. Alle Sensoren und Aktoren sind mit einem Mikrocontroller verbunden, eine entsprechende Schaltung zeigt Material 5. Wird der Taster (Pin 8) betätigt, so erhält der Elektromagnet (Pin 10) ein LOW-Signal und wird damit stromlos geschaltet. Die Lichtschranke (Pin 7) liefert bei Unterbrechung ein LOW- und ansonsten ein HIGH-Signal.

Für die Ausgabe von Informationen und Messwerten wird ein LCD-Baustein verwendet, welcher in Material 6 dargestellt ist. Die konkrete Verbindung des Bausteins mit dem Mikrocontroller ist in Material 5 nicht dargestellt, sie spielt für die Lösung der folgenden Aufgaben keine Rolle. Für den LCD-Baustein muss eine zusätzliche Bibliothek verwendet werden. Entsprechende Hinweise enthält Material 7.

Material 4: Schiefe Ebene mit Wagen, Lichtschranke und Elektromagnet

Material 5: Mikrocontroller mit Sensoren und Aktoren

Material 6: LCD-Baustein

Material 7: Informationen zur Bibliothek des LCD-Bausteins

Bibliothek LiquidCrystal in das Programm einbinden

#include <LiquidCrystal.h> Wichtige Funktionen

LiquidCrystal lcd()

Objekt lcd der Klasse LiquidCrystal erzeugen und Anschlusspins übergeben. Beispiel:

LiquidCrystal lcd(2,3,4,5,6,7);

lcd.begin()

Die Anzahl der Zeichen und der Zeilen wird festgelegt. Beispiel: 16 Zeichen pro Zeile, 2 Zeilen.

lcd.begin(16, 2);

lcd.clear()

Löscht alle Zeichen auf dem Display und positioniert den Cursor auf den Anfang der 1. Zeile.

lcd.print()

Schreibt Daten auf das Display. Beispiel: Die folgenden Codezeilen schreiben den Text "Anzahl: 5" auf das Display.

int anz = 5;

lcd.print("Anzahl: ");

lcd.print(anz);

Material 8: Elektromagnet mit Status-LED als Blockschaltbild

Material 9: Programmcode

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);

#define elektromagnet 10

#define lichtschranke 7

#define taster 8

long fahrzeit = 0;

void setup()

{

lcd.begin(16, 2);

pinMode(elektromagnet, OUTPUT);

pinMode(lichtschranke, INPUT);

pinMode(taster, INPUT);

}

void loop()

{

digitalWrite(elektromagnet, HIGH);

lcd.print("bereit");

do

{

delayMicroseconds(1); // Programm wird für 1μs angehalten.

}

while(digitalRead(taster) == HIGH);

lcd.clear();

lcd.print("Messung laeuft");

fahrzeit = messenFahrzeit();

ausgeben();

}

long messenFahrzeit()

{

long startzeit = 0;

digitalWrite(elektromagnet, LOW);

startzeit = millis();

do

{

delayMicroseconds(1);

}

while(digitalRead(lichtschranke) == HIGH);

return millis() - startzeit;

}

void ausgeben()

{

lcd.clear();

lcd.print("Zeit in ms: ");

lcd.print(fahrzeit);

delay(5000);

lcd.clear();

}

Material 10: Lösungsansatz (unvollständiger Programmcode)

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);

#define elektromagnet 10

#define lichtschranke 7

#define taster 8

const double wagenlaenge = 0.1;

double momentangeschwindigkeit;

void setup()

{

lcd.begin(16, 2);

pinMode(elektromagnet, OUTPUT);

pinMode(lichtschranke, INPUT);

pinMode(taster, INPUT);

}

void loop()

{

digitalWrite(elektromagnet, HIGH);

lcd.print("bereit");

do

{

delayMicroseconds(1);

}

while(digitalRead(taster) == HIGH);

lcd.clear();

lcd.print("Wagen rollt");

momentangeschwindigkeit = messenMomentangeschwindigkeit();

ausgeben();

}

// ab hier fehlt der Code

Aufgabe 2.2

Für den Mikrocontroller wurde bereits ein Programm entwickelt (Material 9). Wird der Taster betätigt, so beginnt der Wagen zu rollen. Der programmierte Mikrocontroller misst die Fahrzeit des Wagens bis zur Unterbrechung der Lichtschranke und gibt diese auf dem LCD-Baustein aus.

2.2.1

Häufig enthält ein Programm mehrere Unterprogramme, dabei wird zwischen Prozeduren und Funktionen unterschieden.

Nennen Sie zwei prinzipielle Vorteile, welche sich durch die Verwendung von Unterprogrammen ergeben. Erläutern Sie den Unterschied zwischen Prozeduren und Funktionen. (4 BE)

2.2.2

Erläutern Sie den Unterschied zwischen globalen und lokalen Variablen.

Hinweis: Beziehen Sie sich dabei auf je ein konkretes Beispiel im gegebenen Code (Material 9). (4 BE)

2.2.3

Erklären Sie die innerhalb der Prozeduren/Funktionen setup, loop und messenFahrzeit stattfindenden Abläufe.

Hinweis: Die Erläuterungen sind jeweils getrennt für die einzelnen Prozeduren/Funktionen vorzunehmen. (12 BE)

Aufgabe 2.3

Bei unveränderter Hardware soll ein Programm für den Mikrocontroller entwickelt werden, mit dem die Momentangeschwindigkeit des Wagens beim Durchlaufen der Lichtschranke ermittelt und ausgegeben werden kann. Dafür ist die Zeit zu messen, in welcher die Lichtschranke durch den rollenden Wagen unterbrochen ist. Dividiert man anschließend die Länge des Wagens durch die gemessene Zeit, so erhält man die Momentangeschwindigkeit des Wagens für den Ort, an dem sich die Lichtschranke befindet. In Material 10 ist ein Lösungsansatz für das Programm vorgegeben. Im Lösungsansatz ist erkennbar, dass die Länge des Wagens als Konstante wagenlaenge definiert ist. Für die Speicherung der ermittelten Momentangeschwindigkeit ist die bereits definierte Variable momentangeschwindigkeit zu verwenden. Am Ende des Hauptprogramms loop werden die Funktion messenMomentangeschwindigkeit und die Prozedur ausgeben aufgerufen.

2.3.1

Implementieren Sie die Funktion messenMomentangeschwindigkeit, welche die Momentangeschwindigkeit des Wagens am Ort der Lichtschranke ermittelt und zurückgibt. (10 BE)

2.3.2

Implementieren Sie die Prozedur ausgeben, welche die Momentangeschwindigkeit inkl. deren Maßeinheit [m/s] auf dem LCD-Baustein ausgibt, fünf Sekunden nach der Ausgabe das Display löscht und sich beendet. (3 BE)

Aufgabenstellung: Aufgabe Vorschlag B - Aufgabe 2.2–2.3 · Abitur Hessen Elektrotechnik LK 2021

Lösung

Nach den offiziellen Korrekturhinweisen

2.2.1 Nennen Sie zwei prinzipielle Vorteile, welche sich durch die Verwendung von Unterprogrammen ergeben. Erläutern Sie den Unterschied zwischen Prozeduren und Funktionen.

Lösung: Vorteile: Übersichtlicherer Code; Wiederverwendbarkeit (kürzerer Code bei mehrfachem Aufruf). Unterschied: Eine Funktion liefert genau einen Rückgabewert, eine Prozedur liefert grundsätzlich keinen Rückgabewert.

2.2.2 Erläutern Sie den Unterschied zwischen globalen und lokalen Variablen. Beziehen Sie sich dabei auf je ein konkretes Beispiel im gegebenen Code (Material 9).

Lösung: Die Variable fahrzeit ist global (jedes Unterprogramm kann darauf zugreifen). Die Variable startzeit ist lokal in messenFahrzeit definiert (Zugriff nur innerhalb dieser Funktion möglich).

2.2.3 Erklären Sie die innerhalb der Prozedur setup stattfindenden Abläufe.

Lösung: Der LCD-Baustein wird für 2 Zeilen mit je 16 Zeichen initialisiert. Der Pin des Elektromagneten wird als Ausgang, die Pins für Lichtschranke und Taster werden als Eingänge definiert.

2.2.3 Erklären Sie die innerhalb der Prozedur loop stattfindenden Abläufe.

Lösung: Der Elektromagnet wird eingeschaltet und „bereit“ ausgegeben. Nach Tasterbetätigung wird das Display gelöscht und „Messung laeuft“ ausgegeben. Dann wird messenFahrzeit aufgerufen, der Rückgabewert in fahrzeit gespeichert und ausgeben aufgerufen.

2.2.3 Erklären Sie die innerhalb der Funktion messenFahrzeit stattfindenden Abläufe.

Lösung: Der Elektromagnet wird ausgeschaltet und der Zeitpunkt in startzeit gespeichert. Nach Unterbrechung der Lichtschranke wird die Differenz zwischen Unterbrechungszeitpunkt und Ausschaltzeitpunkt (Fahrzeit) berechnet und zurückgegeben.

2.3.1 Implementieren Sie die Funktion messenMomentangeschwindigkeit, welche die Momentangeschwindigkeit des Wagens am Ort der Lichtschranke ermittelt und zurückgibt.

Lösung: ```cpp double messenMomentangeschwindigkeit() { long beginn; // Beginn der Lichtschrankenunterbrechung long ende; // Ende der Lichtschrankenunterbrechung do { delayMicroseconds(1); } while(digitalRead(lichtschranke) == HIGH); beginn = millis(); do { delay(1); } while(digitalRead(lichtschranke) == LOW); ende = millis(); return (double) 1000 * wagenlaenge / (ende - beginn); } ```

2.3.2 Implementieren Sie die Prozedur ausgeben, welche die Momentangeschwindigkeit inkl. deren Maßeinheit [m/s] auf dem LCD-Baustein ausgibt, fünf Sekunden nach der Ausgabe das Display löscht und sich beendet.

Lösung: ```cpp void ausgeben() { lcd.clear(); lcd.print("v in m/s: "); lcd.print(momentangeschwindigkeit); delay(5000); lcd.clear(); } ```

Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium

Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.

‹ Aufgabe Vorschlag A - Aufgabe 2.3–2.5 · LK 2021 · Aufgabe Vorschlag C - Aufgabe 2.2–2.5 · LK 2021 ›

Mehr Aufgaben zu Mikrocontroller programmieren (Arduino)