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/16 08:36] – [Nicht-blockierende Umsetzung] 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 21: | Zeile 21: | ||
MeDCMotor motor1(M1); | MeDCMotor motor1(M1); | ||
MeDCMotor motor2(M2); | MeDCMotor motor2(M2); | ||
- | MeUltrasonicSensor ultrasonic(PORT_3); | + | MeUltrasonicSensor ultrasonic(PORT_3); |
- | MeRGBLed led(0, 2); | + | MeRGBLed led(0, 2); |
double limit = 15; // Grenze 15 cm | double limit = 15; // Grenze 15 cm | ||
void setup() { | void setup() { | ||
- | led.setpin(13); | + | led.setpin(13); |
} | } | ||
Zeile 35: | Zeile 35: | ||
motor1.run(-255); | motor1.run(-255); | ||
motor2.run(255); | motor2.run(255); | ||
- | | + | blinken(200); |
- | // LEDs dauerhaft | + | |
- | led.setColor(0, | + | if (distance <= limit) { // stoppen ? |
- | led.setColor(1, | + | |
- | led.show(); | + | |
- | delay(200); | + | |
- | + | ||
- | led.setColor(0, | + | |
- | led.setColor(1, | + | |
- | led.show(); | + | |
- | delay(200); | + | |
- | } | + | |
- | if(distance <= limit) { // stoppen ? | + | |
motor1.run(0); | motor1.run(0); | ||
motor2.run(0); | motor2.run(0); | ||
- | | ||
// LEDs ausschalten | // LEDs ausschalten | ||
led.setColor(0, | led.setColor(0, | ||
Zeile 56: | 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); | ||
} | } | ||
</ | </ | ||
Zeile 61: | Zeile 65: | ||
< | < | ||
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 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, | ||
- | einfache zentrierte Box</ | + | </ |
===== 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 < | ||
Zeile 75: | Zeile 85: | ||
double limit = 15; // Grenze 15 cm | double limit = 15; // Grenze 15 cm | ||
+ | // ...drei Variablen für nicht-blockierende Methode! | ||
unsigned long previousMillis = 0; | unsigned long previousMillis = 0; | ||
bool ledState = false; | bool ledState = false; | ||
Zeile 89: | Zeile 100: | ||
motor1.run(255); | motor1.run(255); | ||
motor2.run(-255); | motor2.run(-255); | ||
- | blinken(200); | + | blinken(200); |
} | } | ||
if (distance <= limit) { // stoppen? | if (distance <= limit) { // stoppen? | ||
Zeile 100: | Zeile 111: | ||
} | } | ||
} | } | ||
+ | /* | ||
+ | * Funktionen | ||
+ | */ | ||
+ | void blinken(int interval) { | ||
- | void blinken(int interval) { | ||
unsigned long currentMillis = millis(); | unsigned long currentMillis = millis(); | ||
- | if (currentMillis - previousMillis | + | |
- | | + | |
- | previousMillis = currentMillis; | + | |
- | ledState = !ledState; | + | |
- | if (ledState) { | + | |
- | led.setColor(0, | + | |
- | led.setColor(1, 255, 0, 0); // RGB-LED auf Rot setzen (LED 2) | + | |
- | } else { | + | |
- | led.setColor(0, 0, 0, 0); // RGB-LED ausschalten (LED 1) | + | |
- | | + | |
- | } | + | |
- | led.show(); | + | |
- | | + | |
+ | if (ledState) { | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | } else { | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | } | ||
+ | led.show(); | ||
} | } | ||
</ | </ | ||
- | < | + | == Erklärungen zum Quellcode |
- | In dieser Version wird das Blinken der LEDs nicht blockierend mit millis() umgesetzt. Dadurch kann der Roboter während des Blinkens weiterhin den Abstandssensor abfragen und schneller auf Hindernisse reagieren. Im Test führte dies dazu, dass der Roboter zuverlässiger rechtzeitig stoppt und nicht mehr gegen die Wand fährt.</ | + | |
- | ===== 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. | ||
- | === Vorteile der nicht-blockierenden Methode === | + | Die Variable '' |
- | ✅ **Schnellere Reaktionszeit: | + | |
- | ✅ **Parallele Abläufe:** Der mBot kann gleichzeitig fahren, blinken | + | < |
+ | In dieser Version wird das Blinken der LEDs nicht blockierend mit '' | ||
+ | ====== Zusammenfassung ====== | ||
- | ✅ **Effizienter Code:** Anstatt auf eine feste Wartezeit zu warten, werden | + | Nicht-blockierende Methoden ermöglichen |
- | === Vorteile der blockierenden Methode === | ||
- | ✅ **Einfache Umsetzung: | ||
- | ✅ **In einfachen Anwendungen ausreichend: | + | ^ '' |
+ | |✅ **Schnellere Reaktionszeit: | ||
+ | |✅ **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. | ||
hello_mbot_blockierung.1739695008.txt.gz · Zuletzt geändert: 2025/02/16 08:36 von torsten.roehl