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 20:30] – torsten.roehl | hello_mbot_blockierung [2025/02/19 19:47] (aktuell) – [Nicht-blockierende Umsetzung] torsten.roehl | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
// | // | ||
+ | {{ : | ||
+ | ====== Beispiel ====== | ||
- | ===== Problemstellung: | + | <WRAP center round tip 80%> |
- | Ein mBot soll vorwärts | + | Ein mBot soll sich vorwärts |
+ | </ | ||
- | ==== Blockierende Umsetzung ==== | + | ===== Blockierende Umsetzung |
- | In einer blockierenden Umsetzung wird '' | + | In einer blockierenden Umsetzung wird '' |
- | ==== Nicht-blockierende Umsetzung ==== | + | <Code c linenums:1 | Listing 1: |
+ | #include < | ||
+ | |||
+ | MeDCMotor motor1(M1); | ||
+ | MeDCMotor motor2(M2); | ||
+ | MeUltrasonicSensor ultrasonic(PORT_3); | ||
+ | MeRGBLed led(0, 2); | ||
+ | double limit = 15; // Grenze 15 cm | ||
+ | |||
+ | void setup() { | ||
+ | led.setpin(13); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | double distance = ultrasonic.distanceCm(); | ||
+ | |||
+ | if (distance > limit ) { // freie Fahrt? | ||
+ | motor1.run(-255); | ||
+ | motor2.run(255); | ||
+ | blinken(200); | ||
+ | } | ||
+ | if (distance <= limit) { // stoppen ? | ||
+ | motor1.run(0); | ||
+ | motor2.run(0); | ||
+ | // LEDs ausschalten | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | 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 | ||
In einer nicht-blockierenden Umsetzung wird die LED mit '' | In einer nicht-blockierenden Umsetzung wird die LED mit '' | ||
- | ==== Vergleich und Vorteile | + | <note important> |
- | | + | Beachte, die **loop-Funktionen** sind im Grunde genommen identisch, |
- | | + | </ |
- | * ✅ **Effizienter Code:** Keine Verzögerung durch blockierende Wartezeiten. | + | |
+ | |||
+ | <Code c linenums:1 | Listing 1: | ||
+ | #include < | ||
+ | |||
+ | MeDCMotor motor1(M1); | ||
+ | MeDCMotor motor2(M2); | ||
+ | MeUltrasonicSensor ultrasonic(PORT_3); | ||
+ | MeRGBLed led(0, 2); | ||
+ | |||
+ | double limit = 15; // Grenze 15 cm | ||
+ | |||
+ | // ...drei Variablen für nicht-blockierende | ||
+ | unsigned long previousMillis | ||
+ | bool ledState | ||
+ | bool firstRun | ||
+ | |||
+ | void setup() { | ||
+ | led.setpin(13); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | double distance | ||
+ | |||
+ | | ||
+ | motor1.run(255); | ||
+ | motor2.run(-255); | ||
+ | blinken(200); | ||
+ | | ||
+ | if (distance <= limit) { // stoppen? | ||
+ | motor1.run(0); | ||
+ | motor2.run(0); | ||
+ | // LEDs ausschalten, | ||
+ | led.setColor(0, 0, 0, 0); | ||
+ | led.setColor(1, 0, 0, 0); | ||
+ | led.show(); | ||
+ | | ||
+ | } | ||
+ | /* | ||
+ | * Funktionen | ||
+ | */ | ||
+ | void blinken(int interval) { | ||
+ | |||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | // step: ..in progress | ||
+ | if (!firstRun && (currentMillis - previousMillis < interval)) | ||
+ | return; | ||
+ | |||
+ | // step: .. toggle now! | ||
+ | firstRun = false; | ||
+ | previousMillis = currentMillis; | ||
+ | ledState = !ledState; | ||
- | ➡ **Ziel:** Die nicht-blockierende Variante ermöglicht eine bessere Steuerung des mBots, da sie Sensorabfragen und Motorsteuerung kontinuierlich ausführt. | + | if (ledState) { |
+ | led.setColor(0, | ||
+ | led.setColor(1, 255, 0, 0); // RGB-LED auf Rot | ||
+ | } else { | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | } | ||
+ | led.show(); | ||
+ | } | ||
+ | </ | ||
+ | == Erklärungen zum Quellcode == | ||
+ | Die Variable '' | ||
- | ===== Vergleich und Vorteile der nicht-blockierenden Methode | + | < |
+ | In dieser Version wird das Blinken der LEDs nicht blockierend mit '' | ||
+ | ====== Zusammenfassung ====== | ||
- | Die nicht-blockierende | + | Nicht-blockierende |
- | ✅ **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. | + | ^ '' |
+ | |✅ **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. | ||
- | ✅ **Effiziente Nutzung der Prozessorzeit: | ||
- | ⚠ **Etwas komplexere Umsetzung:** Die nicht-blockierende Methode erfordert eine andere Programmstruktur mit Zeitsteuerung durch '' | + | <WRAP center round info 95%> |
+ | **Wann ist welche Methode sinnvoll?** | ||
- | ➡ **Wann ist welche | + | Die **blockierende |
- | Die **blockierende Methode** | + |
hello_mbot_blockierung.1739651443.txt.gz · Zuletzt geändert: 2025/02/15 20:30 von torsten.roehl