hello_mbot_programmorganisation
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hello_mbot_programmorganisation [2025/02/15 18:44] – torsten.roehl | hello_mbot_programmorganisation [2025/02/27 14:51] (aktuell) – torsten.roehl | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
Die Steuerung erfolgt hier mit Hilfe der Infrarot-Fernbedienung. | Die Steuerung erfolgt hier mit Hilfe der Infrarot-Fernbedienung. | ||
- | Alternativ kann man natürlich auch Bluetooth verwenden. Dies würde auch komplexere Abläufe ermöglichen, | + | Alternativ kann man natürlich auch Bluetooth verwenden. Dies würde auch komplexere Abläufe ermöglichen, |
+ | |||
+ | Zusätzlich (siehe Beispiel) kann der eingebaute Taster genutzt werden, um einfache Befehle direkt am mBot auszuführen. | ||
+ | // | ||
Vorteile einer geordneten Programmstruktur: | Vorteile einer geordneten Programmstruktur: | ||
Zeile 13: | Zeile 17: | ||
* **Flexibilität: | * **Flexibilität: | ||
- | FIXME ABSCHNITT SCHREIBEN 8-) | + | {{ : |
+ | <WRAP center round tip 90%> | ||
+ | **Finite State Machine (FSM)** ist ein Modell mit einer endlichen Anzahl von Zuständen, das durch Eingaben zwischen diesen wechselt. Sie besteht aus Zuständen, Übergängen und einem Startzustand. FSMs werden in der Informatik und Automatisierung zur Steuerung von Abläufen genutzt. | ||
+ | </ | ||
+ | |Ein endlicher Automat (**Finite State Machine**, <color # | ||
+ | |{{ : | ||
+ | | Die Abbildung zeigt eine <color # | ||
+ | |||
+ | |||
+ | ===== Grundstrukur ===== | ||
< | < | ||
- | enum State { | + | enum State { |
- | | + | |
- | | + | |
- | | + | |
- | STATE_STOP | + | |
}; | }; | ||
- | + | State state = STATE_A; | |
- | State currentState | + | |
void setup() { | void setup() { | ||
- | // Initialisierung | + | // Initialisierung |
} | } | ||
void loop() { | void loop() { | ||
- | byte cmd = readIR(); // Funktion, die IR-Befehle einliest | + | |
+ | | ||
- | // Befehl verarbeiten und ggf. Zustand wechseln | + | // step: state - Befehlsverarbeitungund |
- | | + | |
- | | + | |
+ | // step: action | ||
+ | switch (state) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | case STATE_B: | ||
+ | | ||
+ | | ||
+ | case STATE_C: | ||
+ | | ||
+ | break; | ||
} | } | ||
+ | } | ||
+ | // ...Implementierung der einzelnen Routinen | ||
- | // Je nach aktuellem Zustand | + | </code> |
- | switch (currentState) { | + | |
- | case STATE_IDLE: | + | Die FSM wird hier an mehreren Punkten deutlich: |
- | | + | * Feste Zustände |
- | break; | + | * Die Enumeration definiert eine endliche Menge von Zuständen. |
- | case STATE_CALIBRATION: | + | * Zustandsübergänge |
- | | + | * Die Funktion decode(cmd) verarbeitet |
+ | | ||
+ | * Der switch-Block im loop() entscheidet, | ||
+ | |||
+ | |||
+ | Die Methoden (actions) sollten möglichst | ||
+ | |||
+ | |||
+ | ===== Beispiel ===== | ||
+ | <WRAP center round tip 90%> | ||
+ | Der **mBot** soll in diesem Beispiel die Zustände der LEDs über einen Taster ändern. Bei jedem Tastendruck wechselt die LED zyklisch zwischen drei Zuständen: **aus**, <color # | ||
+ | |||
+ | * **STATE_OFF** → LED **aus** | ||
+ | * **STATE_RED** → <color # | ||
+ | * **STATE_GREEN** → <color # | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Quellcode (engl. Sourcecode) ==== | ||
+ | |||
+ | <Code c linenums:1 | Listing 1: | ||
+ | #include < | ||
+ | |||
+ | MeRGBLed led(0, 2); // must be fixed! | ||
+ | int PIN_BUTTON = 7; // must be fixed! | ||
+ | int threshold | ||
+ | int buttonCount; | ||
+ | |||
+ | |||
+ | enum State { | ||
+ | | ||
+ | STATE_RED, | ||
+ | STATE_GREEN | ||
+ | |||
+ | }; | ||
+ | State state = STATE_OFF; | ||
+ | |||
+ | void setup() { | ||
+ | led.setpin(13); | ||
+ | pinMode(PIN_BUTTON, | ||
+ | buttonCount = 0; | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // step: command | ||
+ | int cmd = read(); | ||
+ | |||
+ | // step: state | ||
+ | state = decode(cmd); | ||
+ | |||
+ | // step: action | ||
+ | switch (state) { | ||
+ | case STATE_RED: | ||
+ | | ||
break; | break; | ||
- | case STATE_LABYRINTH: | + | case STATE_GREEN: |
- | | + | |
break; | break; | ||
- | case STATE_STOP: | + | case STATE_OFF: |
- | | + | |
break; | break; | ||
} | } | ||
} | } | ||
- | void processCommand(byte cmd) { | + | |
- | | + | /* |
- | if (cmd == CMD_STOP) { | + | |
- | | + | */ |
+ | |||
+ | |||
+ | bool isButtonPressed() { | ||
+ | | ||
+ | int value = analogRead(PIN_BUTTON); | ||
+ | |||
+ | if (value < threshold) { | ||
+ | | ||
+ | buttonPressed | ||
+ | return true; | ||
+ | } | ||
+ | } else { | ||
+ | buttonPressed = false; // Button wurde losgelassen | ||
} | } | ||
- | | + | |
- | // z. B. Übergang in den Kalibrierungs- oder Labyrinthmodus. | + | |
} | } | ||
- | // Implementierung der einzelnen Routinen | + | int read() { |
- | void idleRoutine() { | + | |
- | | + | buttonCount += 1; |
+ | |||
+ | if (buttonCount > 2) | ||
+ | buttonCount = 0; | ||
+ | |||
+ | return buttonCount; | ||
} | } | ||
- | void calibrationRoutine() { | + | |
- | | + | State decode(int cmd) { |
+ | | ||
+ | case 1: return STATE_RED; | ||
+ | case 2: return STATE_GREEN; | ||
+ | } | ||
+ | return STATE_OFF; | ||
} | } | ||
- | void labyrinthRoutine() { | + | void actionRed() { |
- | | + | |
+ | led.setColorAt(0, | ||
+ | led.show(); | ||
} | } | ||
- | void stopRoutine() { | + | void actionGreen() { |
- | | + | |
+ | led.setColorAt(0, | ||
+ | led.show(); | ||
} | } | ||
- | </code> | + | void actionOff() { |
+ | led.setColorAt(1, | ||
+ | led.setColorAt(0, | ||
+ | led.show(); | ||
+ | } | ||
+ | |||
+ | </Code> | ||
+ | |||
+ | === Erklärungen zum Quellcode === | ||
+ | |||
+ | |||
+ | - Der Taster wird über '' | ||
+ | - Die Funktion'' | ||
+ | - Die Funktion '' | ||
+ | - **OFF → RED → GREEN → OFF**. | ||
+ | - Die Funktion '' | ||
+ | - Die entsprechenden **LED-Funktionen** setzen die LED-Farbe je nach Zustand. | ||
+ | |||
+ | |||
+ | Das Programm ermöglicht eine einfache Steuerung einer LED über einen Taster mit einer **Zustandsmaschine**. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |
hello_mbot_programmorganisation.1739645060.txt.gz · Zuletzt geändert: 2025/02/15 18:44 von torsten.roehl