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:24] – torsten.roehl | hello_mbot_blockierung [2025/02/19 19:47] (aktuell) – [Nicht-blockierende Umsetzung] torsten.roehl | ||
---|---|---|---|
Zeile 4: | Zeile 4: | ||
Blockierende Methoden halten die Programmausführung an, bis sie vollständig abgeschlossen sind – während dieser Zeit werden keine anderen Aufgaben bearbeitet. Nicht blockierende Methoden hingegen ermöglichen es, mehrere Prozesse quasi gleichzeitig auszuführen, | Blockierende Methoden halten die Programmausführung an, bis sie vollständig abgeschlossen sind – während dieser Zeit werden keine anderen Aufgaben bearbeitet. Nicht blockierende Methoden hingegen ermöglichen es, mehrere Prozesse quasi gleichzeitig auszuführen, | ||
// | // | ||
- | ===== Blockierende vs. Nicht-blockierende Methoden ===== | ||
- | ^ Methode | + | {{ :inf: |
- | | **Blockierend** | + | |
- | | **Nicht-blockierend** | + | |
- | < | + | |
- | Blockierende Programmierung (mit **delay**) ist oft leichter verständlich und implementierbar, | + | |
- | Nichtblockierende Programmierung (mit **millis**) ermöglicht eine reaktionsfähigere Steuerung, da alle Prozesse nahezu gleichzeitig abgearbeitet werden – was gerade bei zeitkritischen Anwendungen wie dem mBot von Vorteil ist.</ | + | ====== 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 | + | <note important> |
- | | + | Beachte, die **loop-Funktionen** sind im Grunde genommen identisch, der einzige Unterschied ist, dass einmal '' |
- | | + | </ |
- | | + | |
+ | |||
+ | <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 Methode! | ||
+ | unsigned long previousMillis | ||
+ | bool ledState | ||
+ | bool firstRun | ||
+ | |||
+ | 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) { | ||
+ | |||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | // step: ..in progress | ||
+ | if (!firstRun && (currentMillis - previousMillis < interval)) | ||
+ | return; | ||
+ | |||
+ | // step: .. toggle now! | ||
+ | firstRun = false; | ||
+ | previousMillis = currentMillis; | ||
+ | ledState = !ledState; | ||
+ | |||
+ | if (ledState) { | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | } else { | ||
+ | led.setColor(0, | ||
+ | led.setColor(1, | ||
+ | } | ||
+ | led.show(); | ||
+ | } | ||
+ | </ | ||
+ | == Erklärungen zum Quellcode == | ||
+ | |||
+ | |||
+ | Die Variable '' | ||
+ | |||
+ | < | ||
+ | In dieser Version wird das Blinken der LEDs nicht blockierend mit '' | ||
+ | ====== Zusammenfassung ====== | ||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | ^ '' | ||
+ | |✅ **Schnellere Reaktionszeit: | ||
+ | |✅ **Parallele Abläufe:** Der mBot kann gleichzeitig fahren, blinken und Hindernisse | ||
+ | |✅ **Effizienter Code: | ||
+ | |||
+ | |||
+ | <WRAP center round info 95%> | ||
+ | **Wann ist welche Methode sinnvoll? | ||
- | ➡ **Ziel:** Die nicht-blockierende | + | Die **blockierende Methode** ist für einfache Abläufe gut geeignet, während die **nicht-blockierende |
hello_mbot_blockierung.1739651072.txt.gz · Zuletzt geändert: 2025/02/15 20:24 von torsten.roehl