Benutzer-Werkzeuge

Webseiten-Werkzeuge


hello_mbot_blockierung

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hello_mbot_blockierung [2025/02/15 21:24] – [Nicht-blockierende Umsetzung] torsten.roehlhello_mbot_blockierung [2025/02/19 19:47] (aktuell) – [Nicht-blockierende Umsetzung] torsten.roehl
Zeile 5: Zeile 5:
 // //
  
-FIXME code noch nicht getestet +{{ :inf:msr:blocking-nonblocking.png?350 |}}
  
 ====== Beispiel ====== ====== Beispiel ======
Zeile 14: Zeile 14:
  
 ===== Blockierende Umsetzung ===== ===== Blockierende Umsetzung =====
-In einer blockierenden Umsetzung wird ''delay()'' zum Blinken verwendet. Während der Wartezeit kann der mBot keine neuen Sensordaten auslesen. Dadurch kann er erst nach Ablauf der Verzögerung auf ein Hindernis reagieren, was zu einem verspäteten Anhalten führt.+In einer blockierenden Umsetzung wird ''delay()'' zum Blinken verwendet. Während der Wartezeit kann der mBot keine neuen Sensordaten auslesen. Dadurch kann er erst nach Ablauf der Verzögerung auf ein Hindernis reagieren, was in der Regel zu einem verspäteten Anhalten führt.
  
 <Code c linenums:1 | Listing 1:MinimalesProgramm.ino> <Code c linenums:1 | Listing 1:MinimalesProgramm.ino>
-<code> 
 #include <MeMCore.h> #include <MeMCore.h>
  
-MeDCMotor motorLeft(M1); +MeDCMotor motor1(M1); 
-MeDCMotor motorRight(M2); +MeDCMotor motor2(M2); 
-MeUltrasonicSensor ultrasonic(PORT_3); // Ultraschallsensor an 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
  
 void setup() { void setup() {
-  led.setpin(PIN_LED); // Richtige Initialisierung der LED+  led.setpin(13);
 } }
  
 void loop() { void loop() {
-  int distance = ultrasonic.distanceCm(); // Abstand messen+  double distance = ultrasonic.distanceCm(); // Abstand messen
  
-  if (distance > 15 || distance == 0) { // Falls kein Hindernis erkannt +  if (distance > limit ) { // freie Fahrt? 
-    motorLeft.run(255); +    motor1.run(-255); 
-    motorRight.run(255); +    motor2.run(255); 
-     +    blinken(200);  // blocking method 
-    // LEDs dauerhaft blinken, solange der mBot fährt +  }   
-    led.setColor(0, 255, 0, 0);   // RGB-LED auf Rot setzen (LED 1) +  if (distance <= limit// stoppen ? 
-    led.setColor(1, 255, 0, 0);   // RGB-LED auf Rot setzen (LED 2) +    motor1.run(0); 
-    led.show(); +    motor2.run(0);
-    delay(200);  // Blockiert den Code für 200 ms +
- +
-    led.setColor(0, 0, 0, 0);     // RGB-LED ausschalten (LED 1) +
-    led.setColor(1, 0, 0, 0);     // RGB-LED ausschalten (LED 2) +
-    led.show(); +
-    delay(200);  // Blockiert erneut für 200 ms +
-  } else { +
-    motorLeft.run(0); +
-    motorRight.run(0); +
-    +
     // LEDs ausschalten     // LEDs ausschalten
     led.setColor(0, 0, 0, 0);     led.setColor(0, 0, 0, 0);
Zeile 57: Zeile 46:
   }   }
 } }
-</code> 
  
 +/*
 + * Funktionen
 + */
 +void blinken(int interval) {  
 +  led.setColor(0, 255, 0, 0); // RGB-LED auf Rot setzen (LED 1)
 +  led.setColor(1, 255, 0, 0); // RGB-LED auf Rot setzen (LED 2)
 +  led.show();
 +  delay(interval);  // Blockiert den Code 
 +
 +  led.setColor(0, 0, 0, 0);  // RGB-LED ausschalten (LED 1)
 +  led.setColor(1, 0, 0, 0);  // RGB-LED ausschalten (LED 2)
 +  led.show();
 +  delay(interval);  // Blockiert den Code  
 +}
 </Code> </Code>
 +
 +<note>
 +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, die während des Blinkens keine neuen Abstandswerte erfasst.
 +</note>
 +
 ===== Nicht-blockierende Umsetzung ===== ===== Nicht-blockierende Umsetzung =====
 In einer nicht-blockierenden Umsetzung wird die LED mit ''millis()'' gesteuert. Dadurch kann der mBot kontinuierlich Sensordaten auslesen und sofort stoppen, wenn er ein Hindernis erkennt, während die LED unabhängig weiterblinkt. In einer nicht-blockierenden Umsetzung wird die LED mit ''millis()'' gesteuert. Dadurch kann der mBot kontinuierlich Sensordaten auslesen und sofort stoppen, wenn er ein Hindernis erkennt, während die LED unabhängig weiterblinkt.
 +
 +<note important>
 +Beachte, die **loop-Funktionen** sind im Grunde genommen identisch, der einzige Unterschied ist, dass einmal ''blinken'' blockierend und einmal nicht blockierend ist.
 +</note>
 +
 +
 <Code c linenums:1 | Listing 1:MinimalesProgramm.ino> <Code c linenums:1 | Listing 1:MinimalesProgramm.ino>
 #include <MeMCore.h> #include <MeMCore.h>
  
-MeDCMotor motorLeft(M1); +MeDCMotor motor1(M1); 
-MeDCMotor motorRight(M2); +MeDCMotor motor2(M2); 
-MeUltrasonicSensor ultrasonic(PORT_3); // Ultraschallsensor an 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() {
-  int distance = ultrasonic.distanceCm(); // Abstand messen+  double distance = ultrasonic.distanceCm(); // Abstand messen
  
-  if (distance > 15 ) {  +  if (distance > limit ) { // freie Fahrt? 
-    motorLeft.run(255); +    motor1.run(255); 
-    motorRight.run(255); +    motor2.run(-255); 
-    updateBlink(true);  // LEDs blinken nur während der Fahrt +    blinken(200); // not-blocking method 
-  } else +  } 
-    motorLeft.run(0); +  if (distance <= limit) // stoppen? 
-    motorRight.run(0); +    motor1.run(0); 
-    updateBlink(false); // LEDs ausschalten, wenn der mBot stoppt+    motor2.run(0); 
 +    // LEDs ausschalten, wenn der mBot stoppt 
 +    led.setColor(0, 0, 0, 0); 
 +    led.setColor(1, 0, 0, 0); 
 +    led.show();
   }   }
 } }
 +/*
 + * Funktionen
 + */
 +void blinken(int interval) {
  
-void updateBlink(bool shouldBlink) { 
   unsigned long currentMillis = millis();   unsigned long currentMillis = millis();
  
-  if (shouldBlink) { +  // step: ..in progress 
-    if (currentMillis - previousMillis >= blinkInterval{ +  if (!firstRun && (currentMillis - previousMillis < interval)
-      previousMillis = currentMillis; +    return;
-      ledState = !ledState;+
  
-      if (ledState) { +  // step: .. toggle now! 
-        led.setColor(0, 255, 0, 0);   // RGB-LED auf Rot setzen (LED 1) +  firstRun = false; 
-        led.setColor(1, 255, 0, 0);   // RGB-LED auf Rot setzen (LED 2) +  previousMillis = currentMillis; 
-      } else { +  ledState = !ledState; 
-        led.setColor(0, 0, 0, 0);     // RGB-LED ausschalten (LED 1) + 
-        led.setColor(1, 0, 0, 0);     // RGB-LED ausschalten (LED 2) +  if (ledState) { 
-      } +    led.setColor(0, 255, 0, 0); // RGB-LED auf Rot 
-      led.show(); +    led.setColor(1, 255, 0, 0); // RGB-LED auf Rot
-    }+
   } else {   } else {
-    led.setColor(0, 0, 0, 0); // Beide LEDs ausschalten +    led.setColor(0, 0, 0, 0);   // RGB-LED aus 
-    led.setColor(1, 0, 0, 0); +    led.setColor(1, 0, 0, 0);   // RGB-LED aus
-    led.show();+
   }   }
 +  led.show();
 } }
 </Code> </Code>
 +== 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 ist häufig ausreichend. 
- 
-=== Vorteile der nicht-blockierenden Methode === 
-✅ **Schnellere Reaktionszeit:** Der Sensor wird kontinuierlich geprüft, sodass der mBot Hindernisse sofort erkennt und rechtzeitig anhalten kann, ohne durch Wartezeiten verzögert zu werden.   
  
-✅ **Parallele Abläufe:** Der mBot kann gleichzeitig fahrenblinken und Hindernisse erkennenda keine Aufgabe den Programmfluss blockiert. Dadurch reagiert das System dynamischer auf Veränderungen in der Umgebung +Die Variable ''firstRun'' sorgt dafürdass das Blinken beim ersten Aufruf sofort startetstatt erst nach dem ersten Intervall zu warten.
  
-✅ **Effizienter Code:** Anstatt auf eine feste Wartezeit zu warten, werden Aufgaben zeitgesteuert verarbeitetSo bleibt das System jederzeit aktiv und reaktionsfähig +<note> 
 +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 reagierenIm Test führte dies dazu, dass der Roboter zuverlässiger rechtzeitig stoppt und nicht mehr gegen die Wand fährt.</note> 
 +====== Zusammenfassung ======
  
-=== Vorteile der blockierenden Methode === +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.
-✅ **Einfache Umsetzung:** Der Code ist leicht zu schreiben und zu verstehen, da Abläufe nacheinander ausgeführt werden, ohne komplexe Zeitsteuerung +
  
-✅ **In einfachen Anwendungen ausreichend:** Wenn keine parallelen Abläufe oder schnelle Reaktionen erforderlich sind, kann die blockierende Methode eine pragmatische Lösung sein.   
  
-=== Nachteile der Methoden === +^ ''millis'' Vorteile der nicht-blockierenden Methode ^ ''delay'' Vorteile der blockierenden Methode ^ 
-⚠ **Blockierend:** Verzögerungen durch Wartezeiten, keine parallelen Abläufe möglich.  +|✅ **Schnellere Reaktionszeit:** Der Sensor wird kontinuierlich geprüft, sodass der mBot Hindernisse sofort erkennt und rechtzeitig anhalten kann, ohne durch Wartezeiten verzögert zu werden. | ✅ **Einfache Umsetzung:** Der Code ist leicht zu schreiben und zu verstehenda Abläufe nacheinander ausgeführt werden, ohne komplexe Zeitsteuerung. |  
 +|✅ **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:** Wenn keine parallelen Abläufe oder schnelle Reaktionen erforderlich sind, kann die blockierende Methode eine pragmatische Lösung sein.   | 
 +|✅ **Effizienter Code:** Anstatt auf eine feste Wartezeit zu warten, werden Aufgaben zeitgesteuert verarbeitet. So bleibt das System jederzeit aktiv und reaktionsfähig.  | | 
  
-⚠ **Nicht-blockierend:** Erfordert eine etwas komplexere Programmstruktur mit Zeitsteuerung durch ''millis()''.   
  
 <WRAP center round info 95%> <WRAP center round info 95%>
hello_mbot_blockierung.1739654643.txt.gz · Zuletzt geändert: 2025/02/15 21:24 von torsten.roehl