AlphaBot: Autonomes Einparken: Unterschied zwischen den Versionen
| (9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 25: | Zeile 25: | ||
== Vorbereitung/Hausaufgabe == | == Vorbereitung/Hausaufgabe == | ||
In diesem Praktikumstermin soll Ihr AlphaBot autonom einparken. Erstellen Sie als Vorbereitung ein [https://de.wikipedia.org/wiki/Endlicher_Automat Zustandsdiagramm] für die Funktion <code>Parken()</code> mit [https://www.yworks.com/products/yed yEd]. | In diesem Praktikumstermin soll Ihr AlphaBot autonom einparken. Erstellen Sie als Vorbereitung ein [https://de.wikipedia.org/wiki/Endlicher_Automat Zustandsdiagramm] für die Funktion <code>Parken()</code> mit [https://www.yworks.com/products/yed yEd]. Falls in der Informatik Zustandsautomaten nicht behandelt worden, schauen Sie sich bitte als Vorbereitung die Tutorial an. | ||
Planen Sie eine Zustandsmaschine, die zwischen den Zuständen | Planen Sie eine Zustandsmaschine, die zwischen den Zuständen | ||
* Zustand 1: Parklücke suchen, | * Zustand 1: Parklücke suchen, | ||
| Zeile 41: | Zeile 42: | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong> | | <strong>Ansatz für die Lösung Hausaufgabe </strong> | ||
|- | |- | ||
| [[Datei:Zustandsdiagramm AEP Inf2P.jpg|500px]] | | [[Datei:Zustandsdiagramm AEP Inf2P.jpg|500px]] | ||
|} | |} | ||
== Tutorial == | |||
* [[Zustandsdiagramm| HSHL-Wiki: Zustandsdiagramm]] | |||
<syntaxhighlight lang="c" style="background-color: #EFF1C1; font-size:small"> | |||
// Pin-Definitionen | |||
const int ledPin = 13; | |||
const int buttonPin = 2; | |||
// Zustände definieren | |||
enum State { | |||
LED_OFF, | |||
LED_ON, | |||
LED_BLINK | |||
}; | |||
State currentState = LED_OFF; | |||
// für Tasterentprellung | |||
bool lastButtonState = LOW; | |||
unsigned long lastDebounceTime = 0; | |||
const unsigned long debounceDelay = 50; | |||
void setup() { | |||
pinMode(ledPin, OUTPUT); | |||
pinMode(buttonPin, INPUT); | |||
Serial.begin(9600); | |||
} | |||
void loop() { | |||
handleButton(); | |||
runStateMachine(); | |||
} | |||
void handleButton() { | |||
bool reading = digitalRead(buttonPin); | |||
if (reading != lastButtonState) { | |||
lastDebounceTime = millis(); | |||
} | |||
if ((millis() - lastDebounceTime) > debounceDelay) { | |||
if (reading == HIGH && lastButtonState == LOW) { | |||
// Zustand wechseln bei Tastendruck | |||
switchState(); | |||
} | |||
} | |||
lastButtonState = reading; | |||
} | |||
void switchState() { | |||
if (currentState == LED_OFF) { | |||
currentState = LED_ON; | |||
} | |||
else if (currentState == LED_ON) { | |||
currentState = LED_BLINK; | |||
} | |||
else { | |||
currentState = LED_OFF; | |||
} | |||
Serial.print("Neuer Zustand: "); | |||
Serial.println(currentState); | |||
} | |||
void runStateMachine() { | |||
switch (currentState) { | |||
case LED_OFF: | |||
digitalWrite(ledPin, LOW); | |||
break; | |||
case LED_ON: | |||
digitalWrite(ledPin, HIGH); | |||
break; | |||
case LED_BLINK: | |||
digitalWrite(ledPin, millis() % 500 < 250); | |||
break; | |||
} | |||
} | |||
</syntaxhighlight> | |||
= Versuchsdurchführung = | = Versuchsdurchführung = | ||
| Zeile 66: | Zeile 148: | ||
* Ermitteln Sie die Roboterpose aus den unterschiedlichen Radumdrehungen (Differenzielle Odometrie). | * Ermitteln Sie die Roboterpose aus den unterschiedlichen Radumdrehungen (Differenzielle Odometrie). | ||
* Senden Sie den Lagewinkel der Roboterpose und Zustand via Bluetooth an MATLAB und visualisieren Sie diese Werte über der Zeit. | * Senden Sie den Lagewinkel der Roboterpose und Zustand via Bluetooth an MATLAB und visualisieren Sie diese Werte über der Zeit. | ||
* Nutzen Sie den Ultraschallsensor um mittig in der Parklücke zu stehen. | * Nutzen Sie den Ultraschallsensor, um mittig in der Parklücke zu stehen. | ||
'''Arbeitsergebnisse:''' <code>AutonomesParken.ino</code> | '''Arbeitsergebnisse:''' <code>AutonomesParken.ino</code> | ||
| Zeile 79: | Zeile 161: | ||
'''Arbeitsergebnis''' in SVN: <code>SVN Log</code> | '''Arbeitsergebnis''' in SVN: <code>SVN Log</code> | ||
== [[Datei:Lektionen.jpg|60px]] Ausblick zur nächsten Lektion == | == [[Datei:Lektionen.jpg|60px]] Ausblick zur nächsten Lektion == | ||
In der nächsten Lektion findet die Abschlussprüfung statt. | In der nächsten Lektion findet die Abschlussprüfung statt. | ||
Aktuelle Version vom 2. Juli 2026, 16:12 Uhr

| Autor: | Prof. Dr.-Ing. Schneider |
| Modul: | Praxismodul II |
| Lehrveranstaltung: | Mechatronik, Informatik Praktikum 2, 2. Semester |
| Lektion: | 11 |
Inhalt
Lernziele
Nach Durchführung dieser Lektion können Sie
- mit yED eine Zustandsmaschine planen.
- eine Zustandsmaschine programmieren.
- funktional programmieren und Funktionen zu einem großen Projekt zusammenfügen.
- Quelltext debuggen und optimieren.
- Messdaten speichern und via MATLAB® auswerten und visualisieren.
- autonom einen AlphaBot einparken.
Vorbereitung/Hausaufgabe
In diesem Praktikumstermin soll Ihr AlphaBot autonom einparken. Erstellen Sie als Vorbereitung ein Zustandsdiagramm für die Funktion Parken() mit yEd. Falls in der Informatik Zustandsautomaten nicht behandelt worden, schauen Sie sich bitte als Vorbereitung die Tutorial an.
Planen Sie eine Zustandsmaschine, die zwischen den Zuständen
- Zustand 1: Parklücke suchen,
- Zustand 2: Rechtseinschlag (rückwärts),
- Zustand 3: Linkseinschlag (rückwärts) und
- Zustand 4: Geradeaus (Korrekturzug)
unterscheiden kann. Welche Transitionen führen zu den Zustandsübergängen?
Legen Sie das Programm als Funktionsrümpfe an.
Arbeitsergebnis: ZustandsdiagrammAutonomesParken.graphml
Arbeitsergebnisse: AutonomesParken.pap, AutonomesParken.ino
| Ansatz für die Lösung Hausaufgabe |
Tutorial
// Pin-Definitionen
const int ledPin = 13;
const int buttonPin = 2;
// Zustände definieren
enum State {
LED_OFF,
LED_ON,
LED_BLINK
};
State currentState = LED_OFF;
// für Tasterentprellung
bool lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop() {
handleButton();
runStateMachine();
}
void handleButton() {
bool reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading == HIGH && lastButtonState == LOW) {
// Zustand wechseln bei Tastendruck
switchState();
}
}
lastButtonState = reading;
}
void switchState() {
if (currentState == LED_OFF) {
currentState = LED_ON;
}
else if (currentState == LED_ON) {
currentState = LED_BLINK;
}
else {
currentState = LED_OFF;
}
Serial.print("Neuer Zustand: ");
Serial.println(currentState);
}
void runStateMachine() {
switch (currentState) {
case LED_OFF:
digitalWrite(ledPin, LOW);
break;
case LED_ON:
digitalWrite(ledPin, HIGH);
break;
case LED_BLINK:
digitalWrite(ledPin, millis() % 500 < 250);
break;
}
}
Versuchsdurchführung
In diesem Termin lassen wir den AlphaBot autonom einparken.
Aufgabe 11.1: Parken
Schreiben Sie das Programm AutonomesParken.ino. Folgende Funktionsanforderungen sollten erfüllt werden:
- Erstellen Sie eine Zustandsmaschine, die zwischen den folgenden 4 Zuständen unterscheiden kann.
- Zustand: Parklücke suchen,
- Zustand: Rechtseinschlag,
- Zustand: Linkseinschlag und
- Zustand: Geradeaus (Korrekturzug)
- Fahren Sie konstant ohne Unterbrechung zügig rückwärts.
- Verwenden Sie Ihr Programm
sucheParkluecke.inoim Zustand 1. - Programmieren Sie Zustand 2: Rechtseinschlag. Schlagen Sie voll rechts ein und fahren Sie rückwärts bis das Fahrzeug 40° zur Lücke steht.
- Programmieren Sie Zustand 3: Linkseinschlag. Schlagen Sie voll links ein, bis das Fahrzeug gerade (0 °) in der Lücke steht.
- Programmieren Sie Zustand 4: Geradeaus. Fahren Sie gerade vorwärts, bis Sie mittig in der Parklücke stehen.
- Schalten Sie alle Motoren aus.
Anforderungen:
- Realisieren Sie die Zustandsmaschine mit der Mehrfachverzweigung
switch..case. - Ermitteln Sie die Roboterpose aus den unterschiedlichen Radumdrehungen (Differenzielle Odometrie).
- Senden Sie den Lagewinkel der Roboterpose und Zustand via Bluetooth an MATLAB und visualisieren Sie diese Werte über der Zeit.
- Nutzen Sie den Ultraschallsensor, um mittig in der Parklücke zu stehen.
Arbeitsergebnisse: AutonomesParken.ino
Aufgabe 11.2: Nachhaltige Doku
- Sichern Sie alle Ergebnisse mit beschreibendem Text (
message) in SVN. - Halten Sie die Regeln für den Umgang mit SVN ein.
- Halten Sie die Programmierrichtlinie für C und die Programmierrichtlinien für MATLAB® ein.
- Versehen Sie jedes Programm mit einem Header (Header Beispiel für MATLAB, Header Beispiel für C).
- Kommentiere Sie den Quelltext umfangreich.
Arbeitsergebnis in SVN: SVN Log
Ausblick zur nächsten Lektion
In der nächsten Lektion findet die Abschlussprüfung statt.
→ Termine 1 2 3 4 5 6 7 8 9 10 11 12
→ zurück zum Hauptartikel: Informatik Praktikum 2
→ Haben Sie Fragen? Informatik Praktikum FAQ