hello_mbot_blockierung
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hello_mbot_blockierung [2025/02/15 21:33] – torsten.roehl | hello_mbot_blockierung [2025/02/19 19:47] (aktuell) – [Nicht-blockierende Umsetzung] torsten.roehl | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
// | // | ||
- | FIXME code noch nicht getestet | + | {{ : |
====== Beispiel ====== | ====== Beispiel ====== | ||
Zeile 19: | Zeile 19: | ||
#include < | #include < | ||
- | MeDCMotor | + | MeDCMotor |
- | MeDCMotor | + | MeDCMotor |
- | MeUltrasonicSensor ultrasonic(PORT_3); | + | MeUltrasonicSensor ultrasonic(PORT_3); |
- | MeRGBLed led(0, 2); | + | MeRGBLed led(0, 2); |
- | int PIN_LED | + | double limit = 15; // Grenze 15 cm |
void setup() { | void setup() { | ||
- | led.setpin(PIN_LED); | + | led.setpin(13); |
} | } | ||
void loop() { | void loop() { | ||
- | | + | |
- | if (distance > 15 ) { // Falls kein Hindernis erkannt | + | if (distance > limit ) { // freie Fahrt? |
- | | + | |
- | | + | |
- | | + | blinken(200); |
- | // LEDs dauerhaft | + | |
- | led.setColor(0, | + | |
- | led.setColor(1, | + | |
- | led.show(); | + | |
- | delay(200); | + | |
- | + | ||
- | | + | |
- | led.setColor(1, | + | |
- | led.show(); | + | |
- | delay(200); | + | |
- | } else { | + | |
- | | + | |
- | | + | |
- | | + | |
// LEDs ausschalten | // LEDs ausschalten | ||
led.setColor(0, | led.setColor(0, | ||
Zeile 55: | Zeile 45: | ||
led.show(); | led.show(); | ||
} | } | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | * Funktionen | ||
+ | */ | ||
+ | void blinken(int interval) { | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | led.show(); | ||
+ | delay(interval); | ||
+ | |||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | led.show(); | ||
+ | delay(interval); | ||
} | } | ||
</ | </ | ||
+ | |||
+ | < | ||
+ | Nicht immer schafft es der Roboter rechtzeitig zum Stehen zu kommen. In den Tests fuhr er ein paar Mal gegen die Wand, bevor er stoppen konnte. Schuld daran ist die blockierende LED-Steuerung, | ||
+ | </ | ||
+ | |||
===== Nicht-blockierende Umsetzung ===== | ===== Nicht-blockierende Umsetzung ===== | ||
In einer nicht-blockierenden Umsetzung wird die LED mit '' | In einer nicht-blockierenden Umsetzung wird die LED mit '' | ||
+ | |||
+ | <note important> | ||
+ | Beachte, die **loop-Funktionen** sind im Grunde genommen identisch, der einzige Unterschied ist, dass einmal '' | ||
+ | </ | ||
+ | |||
+ | |||
<Code c linenums:1 | Listing 1: | <Code c linenums:1 | Listing 1: | ||
#include < | #include < | ||
- | MeDCMotor | + | MeDCMotor |
- | MeDCMotor | + | MeDCMotor |
- | MeUltrasonicSensor ultrasonic(PORT_3); | + | MeUltrasonicSensor ultrasonic(PORT_3); |
- | MeRGBLed led(0, 2); // RGB-LED am mBot (Port 0, 2 LEDs) | + | MeRGBLed led(0, 2); |
- | int PIN_LED = 13; // Standard-LED-Pin | + | |
+ | double limit = 15; // Grenze 15 cm | ||
+ | |||
+ | // ...drei Variablen für nicht-blockierende Methode! | ||
unsigned long previousMillis = 0; | unsigned long previousMillis = 0; | ||
- | const unsigned long blinkInterval = 200; // Blinken alle 200 ms | ||
bool ledState = false; | bool ledState = false; | ||
+ | bool firstRun = true; | ||
void setup() { | void setup() { | ||
- | led.setpin(PIN_LED); | + | led.setpin(13); |
} | } | ||
void loop() { | void loop() { | ||
- | | + | |
- | if (distance > 15 ) { | + | if (distance > limit ) { // freie Fahrt? |
- | | + | |
- | | + | |
- | | + | |
- | } else { | + | } |
- | | + | if (distance <= limit) |
- | | + | |
- | | + | |
+ | // LEDs ausschalten, | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | led.show(); | ||
} | } | ||
} | } | ||
+ | /* | ||
+ | * Funktionen | ||
+ | */ | ||
+ | void blinken(int interval) { | ||
- | void updateBlink(bool shouldBlink) { | ||
unsigned long currentMillis = millis(); | unsigned long currentMillis = millis(); | ||
- | | + | |
- | if (currentMillis - previousMillis | + | if (!firstRun && |
- | | + | |
- | ledState = !ledState; | + | |
- | | + | // step: .. toggle now! |
- | led.setColor(0, | + | firstRun = false; |
- | led.setColor(1, | + | previousMillis = currentMillis; |
- | } else { | + | ledState = !ledState; |
- | led.setColor(0, | + | |
- | led.setColor(1, | + | |
- | } | + | led.setColor(0, |
- | led.show(); | + | led.setColor(1, |
- | } | + | |
} else { | } else { | ||
- | led.setColor(0, | + | led.setColor(0, |
- | led.setColor(1, | + | led.setColor(1, |
- | led.show(); | + | |
} | } | ||
+ | led.show(); | ||
} | } | ||
</ | </ | ||
+ | == Erklärungen zum Quellcode == | ||
- | ===== Vor- und Nachteile blockierender und nicht-blockierender Methoden ===== | ||
- | Nicht-blockierende Methoden ermöglichen eine effizientere Steuerung des mBots, da Abläufe parallel ausgeführt werden können. Gleichzeitig sind blockierende Methoden einfacher umzusetzen und sind häufig ausreichend. | + | Die Variable '' |
- | === Vorteile der nicht-blockierenden Methode === | + | < |
- | ✅ **Schnellere Reaktionszeit: | + | In dieser Version |
+ | ====== Zusammenfassung ====== | ||
- | ✅ **Parallele Abläufe:** Der mBot kann gleichzeitig fahren, blinken und Hindernisse erkennen, da keine Aufgabe den Programmfluss blockiert. Dadurch reagiert das System dynamischer auf Veränderungen in der Umgebung. | + | Nicht-blockierende Methoden ermöglichen |
- | + | ||
- | ✅ **Effizienter Code:** Anstatt auf eine feste Wartezeit zu warten, werden Aufgaben zeitgesteuert verarbeitet. So bleibt das System jederzeit aktiv und reaktionsfähig. | + | |
- | + | ||
- | === Vorteile der blockierenden Methode === | + | |
- | ✅ **Einfache Umsetzung: | + | |
- | ✅ **In einfachen Anwendungen ausreichend: | ||
- | === Nachteile | + | ^ '' |
- | ⚠ **Blockierend:** Verzögerungen | + | |✅ **Schnellere Reaktionszeit:** Der Sensor wird kontinuierlich geprüft, sodass der mBot Hindernisse sofort erkennt und rechtzeitig anhalten kann, ohne durch Wartezeiten |
+ | |✅ **Parallele Abläufe:** Der mBot kann gleichzeitig fahren, blinken und Hindernisse erkennen, da keine Aufgabe den Programmfluss blockiert. Dadurch reagiert das System dynamischer auf Veränderungen in der Umgebung. |✅ **In einfachen Anwendungen ausreichend: | ||
+ | |✅ **Effizienter Code:** Anstatt auf eine feste Wartezeit zu warten, werden Aufgaben zeitgesteuert verarbeitet. So bleibt das System jederzeit aktiv und reaktionsfähig. | ||
- | ⚠ **Nicht-blockierend: | ||
<WRAP center round info 95%> | <WRAP center round info 95%> |
hello_mbot_blockierung.1739655205.txt.gz · Zuletzt geändert: 2025/02/15 21:33 von torsten.roehl