AlphaBot: Autonomes Einparken: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Die Seite wurde neu angelegt: „Kategorie:Arduino Kategorie:AlphaBot thumb|rigth|450px|Abb. 1: Dieser Artikel ist in Bearbeitung '''Autor:''' Prof. Dr.-Ing. Schneider<br> '''Modul:''' Praxismodul I<br> '''Lehrveranstaltung:''' Mechatronik, Informatik Praktikum 2, 2. Semester<br> == Inhalt == * == Lernziele== Nach Durchführung dieser Lektion können Sie * == Versuchsdurchführung == === Aufgabe 5.1: Lichtschran…“
 
 
(48 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Arduino]]
[[Kategorie:Arduino]]
[[Kategorie:AlphaBot]]
[[Kategorie:AlphaBot]]
[[Datei:Work-98936 960 720.png|thumb|rigth|450px|Abb. 1:  Dieser Artikel ist in Bearbeitung]]
[[ Datei:EPA Algo.jpg|thumb|rigth|450px|Abb. 1:  Schritte eines Einparkvorgangs]]
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]<br>
{|class="wikitable"
'''Modul:''' Praxismodul I<br>
|-
'''Lehrveranstaltung:''' Mechatronik, Informatik Praktikum 2, 2. Semester<br>
| '''Autor:''' || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]
|-
| '''Modul:''' || Praxismodul II
|-
| '''Lehrveranstaltung:''' || Mechatronik, Informatik Praktikum 2, 2. Semester
|-
| '''Lektion:''' || 11
|}
 
= Inhalt =


== Inhalt ==
*
== Lernziele==
== Lernziele==
Nach Durchführung dieser Lektion können Sie
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<sup>®</sup> auswerten und visualisieren.
* autonom einen AlphaBot einparken.
 
== 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]. 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:''' <code>AutonomesParken.pap, AutonomesParken.ino</code>
 
 
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Ansatz für die Lösung Hausaufgabe&thinsp;</strong>
|-
| [[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 =
In diesem Termin lassen wir den AlphaBot autonom einparken.
== Aufgabe 11.1: Parken ==
Schreiben Sie das Programm <code>AutonomesParken.ino</code>. 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 <code>sucheParkluecke.ino</code> im 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&thinsp;°) 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 <code>switch..case</code>.
* 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:''' <code>AutonomesParken.ino</code>
 
== Aufgabe 11.2: Nachhaltige Doku ==
* Sichern Sie alle Ergebnisse mit beschreibendem Text (<code>message</code>) in SVN.
* Halten Sie die Regeln für den [[Software_Versionsverwaltung_mit_SVN|Umgang mit SVN]] ein.
* Halten Sie die [[Medium:Programmierrichtlinie.pdf|Programmierrichtlinie für C]] und die [[Medium:Programmierrichtlinien_für_Matlab.pdf|Programmierrichtlinien für MATLAB<sup>®</sup>]] 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: <code>SVN Log</code>


== Versuchsdurchführung ==
=== Aufgabe 5.1: Lichtschranke ===


== Tutorials ==


== Demos ==
== [[Datei:Lektionen.jpg|60px]] Ausblick zur nächsten Lektion ==
In der nächsten Lektion findet die Abschlussprüfung statt.


== Literatur ==


----
----
→ Termine [[Einführungsveranstaltung_Informatikpraktikum_2_im_SoSe_2023|1]] [[AlphaBot:_Messdatenverarbeitung_mit_MATLAB|2]] [[AlphaBot:_MATLAB_als_serieller_Monitor|3]] [[AlphaBot: Servo ansteuern|4]] [[AlphaBot: AlphaBot:_Motoren_und_Inkrementalgeber|5]]<br>
→ Termine [[Einführungsveranstaltung_Informatikpraktikum_2_im_SoSe_2026|1]] [[AlphaBot:_Messdatenverarbeitung_mit_MATLAB|2]] [[AlphaBot:_Hardware_Support_Package_für_MATLAB|3]] [[AlphaBot: Servo_mit_MATLAB_ansteuern|4]] [[AlphaBot:_Motoren_und_Inkrementalgeber|5]] [[AlphaBot: Programmier-Challenge I SoSe26|6]] [[AlphaBot:_Roboternavigation_SoSe26|7]] [[AlphaBot:_Bluetooth_Datenlogger|8]] [[AlphaBot: Geregelte Fahrt mit Linienverfolger|9]] [[AlphaBot: Parklücke suchen|10]] [[AlphaBot: Autonomes Einparken|11]] [[AlphaBot: Programmier-Challenge II SoSe26|12]]<br>
→ zurück zum Hauptartikel: [[AlphaBot_SoSe23|Informatik Praktikum 2]]
→ zurück zum Hauptartikel: [[AlphaBot_SoSe26|Informatik Praktikum 2]]<br>
→ Haben Sie Fragen? [[Informatik Praktikum FAQ]]

Aktuelle Version vom 2. Juli 2026, 16:12 Uhr

Abb. 1: Schritte eines Einparkvorgangs
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


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:

  1. Erstellen Sie eine Zustandsmaschine, die zwischen den folgenden 4 Zuständen unterscheiden kann.
    1. Zustand: Parklücke suchen,
    2. Zustand: Rechtseinschlag,
    3. Zustand: Linkseinschlag und
    4. Zustand: Geradeaus (Korrekturzug)
  2. Fahren Sie konstant ohne Unterbrechung zügig rückwärts.
  3. Verwenden Sie Ihr Programm sucheParkluecke.ino im Zustand 1.
  4. Programmieren Sie Zustand 2: Rechtseinschlag. Schlagen Sie voll rechts ein und fahren Sie rückwärts bis das Fahrzeug 40° zur Lücke steht.
  5. Programmieren Sie Zustand 3: Linkseinschlag. Schlagen Sie voll links ein, bis das Fahrzeug gerade (0 °) in der Lücke steht.
  6. Programmieren Sie Zustand 4: Geradeaus. Fahren Sie gerade vorwärts, bis Sie mittig in der Parklücke stehen.
  7. 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

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