Benutzer-Werkzeuge

Webseiten-Werkzeuge


mbot_streckenfahren

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
mbot_streckenfahren [2025/03/01 13:23] – [Quellcode (engl. Sourcecode)] torsten.roehlmbot_streckenfahren [2025/03/02 14:38] (aktuell) – [Erklärungen zum Quellcode] torsten.roehl
Zeile 1: Zeile 1:
 ====== mBot Streckenfahren ====== ====== mBot Streckenfahren ======
- 
-FIXME  <color #ed1c24>ABSCHNITT ENTSTEHT GERADE! - CODE NICHT GETESTET! 
-</color> 
- 
 //Der mBot kann, gesteuert über die Infrarot-Fernbedienung, eine zuvor eingegebene Strecke vorwärts oder rückwärts fahren. //Der mBot kann, gesteuert über die Infrarot-Fernbedienung, eine zuvor eingegebene Strecke vorwärts oder rückwärts fahren.
  
Zeile 392: Zeile 388:
 <WRAP center round tip 95%>Falls der Roboter nicht sauber geradeaus fährt, lässt sich das Programm dank seiner modularen Struktur leicht erweitern. Es ist möglich, eine zusätzliche Kalibriermethode zu implementieren, die sicherstellt, dass der Roboter präzise geradeaus fährt.“ <WRAP center round tip 95%>Falls der Roboter nicht sauber geradeaus fährt, lässt sich das Programm dank seiner modularen Struktur leicht erweitern. Es ist möglich, eine zusätzliche Kalibriermethode zu implementieren, die sicherstellt, dass der Roboter präzise geradeaus fährt.“
 </WRAP> </WRAP>
 +
  
 ==== Quellcode (engl. Sourcecode) ==== ==== Quellcode (engl. Sourcecode) ====
Zeile 407: Zeile 404:
  
 // IR-Entprellen // IR-Entprellen
-static uint8_t lastCode = 0xFF;+static uint8_t lastCode       = 0xFF;
 static unsigned long lastTime = 0; static unsigned long lastTime = 0;
 const unsigned long COOL_DOWN = 1000; // in Millisekunden, also 1 Sekunde const unsigned long COOL_DOWN = 1000; // in Millisekunden, also 1 Sekunde
Zeile 416: Zeile 413:
  
 // ADJUST AREA START // ADJUST AREA START
-int calibrationDistance = 40; // cm +int calibrationDistance = 40;  // in cm 
-int speed = 180; // Motor speed+int speed               200; // Motor speed 
 +int dir                 = 1;   // change to -1 if forward drive backwards!
 // ADJUST AREA END // ADJUST AREA END
  
 // actionCalibration... // actionCalibration...
 unsigned long ac_movingStartTimeForward  = 0; unsigned long ac_movingStartTimeForward  = 0;
-unsigned long ac_movingTimeForward = 0;+unsigned long ac_movingTimeForward       = 0;
 unsigned long ac_movingStartTimeBackward = 0; unsigned long ac_movingStartTimeBackward = 0;
-unsigned long ac_movingTimeBackward = 0; +unsigned long ac_movingTimeBackward      = 0; 
-bool ac_isMoving = false; +bool ac_isMoving         = false; 
-bool ac_isForwardMoving = false;+bool ac_isForwardMoving  = false;
 bool ac_isBackwardMoving = false; bool ac_isBackwardMoving = false;
-bool ac_calibrationDone = false; +bool ac_calibrationDone  = false; 
-// actionForward + 
-bool af_forwardActive         false; +// motor movement 
-unsigned long af_forwardStartTime = 0; +bool mm_firstRunMotor true
-// actionBackward +bool mm_motorActive   = false; 
-bool ab_backwardActive         = false; +unsigned long mm_motorStartTime = 0;
-unsigned long ab_backwardStartTime = 0;+
  
 //FSM //FSM
Zeile 453: Zeile 450:
 }; };
 ExState exState       = EX_IDLE; ExState exState       = EX_IDLE;
 +
 int     inputNumber   = 0;    // Anzahl der eingegebenen Stellen int     inputNumber   = 0;    // Anzahl der eingegebenen Stellen
 String  inputBuffer   = "";   // Sammeln der Ziffern als Text String  inputBuffer   = "";   // Sammeln der Ziffern als Text
Zeile 459: Zeile 457:
 void setup() { void setup() {
   led.setpin(13);   led.setpin(13);
-  Serial.begin(9600);+  //Serial.begin(9600);  // debugging
   ir.begin();   ir.begin();
 } }
Zeile 493: Zeile 491:
   ---------------------------   ---------------------------
 */ */
 +void setLED(int r, int g, int b) {
 +  led.setColorAt(0, r, g, b);
 +  led.setColorAt(1, r, g, b);
 +  led.show();
 +}
  
 int read() { int read() {
   if (ir.decode()) {   if (ir.decode()) {
     uint32_t code = getIRCode();     uint32_t code = getIRCode();
 +
     // Vermeidung wiederholter Eingaben     // Vermeidung wiederholter Eingaben
     unsigned long now = millis();     unsigned long now = millis();
Zeile 503: Zeile 507:
     lastCode = code;     lastCode = code;
     lastTime = now;     lastTime = now;
 +
     //     //
     switch (code) {     switch (code) {
Zeile 572: Zeile 577:
       return STATE_FORWARD;       return STATE_FORWARD;
   }   }
- 
   return lastState;   return lastState;
 } }
Zeile 586: Zeile 590:
   inputNumber = 0;   inputNumber = 0;
   inputBuffer = "";   inputBuffer = "";
 +  setLED(0, 0, 255); // LED BLUE
 } }
  
Zeile 610: Zeile 615:
     exState = EX_IDLE;     exState = EX_IDLE;
     buzzer.tone(1200, 200);     buzzer.tone(1200, 200);
 +    setLED(0, 0, 0); // LED OFF
   }   }
 } }
Zeile 618: Zeile 624:
   ---------------------------   ---------------------------
 */ */
- 
 void actionCalibration() { void actionCalibration() {
  
Zeile 624: Zeile 629:
     return;     return;
  
-  led.setColorAt(1, 255, 0, 0); +  setLED(255, 0, 0); // RED ON
-  led.setColorAt(0, 255, 0, 0); +
-  led.show();+
   int sensorState = lineFinder.readSensors();   int sensorState = lineFinder.readSensors();
  
Zeile 633: Zeile 636:
     motor1.stop();     motor1.stop();
     motor2.stop();     motor2.stop();
-    motor1.run(-speed); +    motor1.run(-dir * speed); 
-    motor2.run(speed);+    motor2.run( dir * speed); 
     ac_movingStartTimeForward = millis();     ac_movingStartTimeForward = millis();
     ac_isMoving = true;     ac_isMoving = true;
Zeile 648: Zeile 652:
     motor2.stop();     motor2.stop();
     ac_movingTimeForward = millis() - ac_movingStartTimeForward;     ac_movingTimeForward = millis() - ac_movingStartTimeForward;
- +    motor1.run( dir * speed); 
-    motor1.run(speed); +    motor2.run(-dir * speed);
-    motor2.run(-speed);+
     ac_movingStartTimeBackward = millis();     ac_movingStartTimeBackward = millis();
     do {     do {
Zeile 666: Zeile 669:
     calibrationTravelTime = (ac_movingTimeForward + ac_movingTimeBackward) / 2.0;     calibrationTravelTime = (ac_movingTimeForward + ac_movingTimeBackward) / 2.0;
     ac_calibrationDone = true;     ac_calibrationDone = true;
-    led.setColorAt(1, 0, 0, 0); 
-    led.setColorAt(0, 0, 0, 0); 
-    led.show(); 
     buzzer.tone(1200, 600);     buzzer.tone(1200, 600);
     lastState = STATE_OFF;     lastState = STATE_OFF;
- 
   }   }
 } }
  
-void actionForward() { +void motorMovement(int go_forward ) { 
-  // 1. Wenn gerade gefahren wird, prüfen wir, ob die Fahrzeit abgelaufen ist +  unsigned long currentMillis = millis(); 
-  if (af_forwardActive) { + 
-    // Ist schon genug Zeit vergangen? +  // Wenn der Motor aktuell läuft, prüfen wir, ob die Zeit abgelaufen ist 
-    if (millis() af_forwardStartTime >= currentTravelTime) { +  if (mm_motorActive) { 
-      // Dann stoppen wir jetzt die Motoren+    if (currentMillis mm_motorStartTime >= currentTravelTime) {
       motor1.stop();       motor1.stop();
       motor2.stop();       motor2.stop();
-      af_forwardActive = false;+      mm_motorActive = false
 +      state          = STATE_OFF; 
 +      lastState      = STATE_OFF;
     }     }
- 
     return;     return;
   }   }
  
-  // 2. Wenn also gerade NICHT gefahren wird, können wir eine neue Fahrt starten +  if (!mm_firstRunMotor) 
-  af_forwardActive      = true; +    return;
-  af_forwardStartTime   = millis();+
  
-  // Motoren starten +  setLED(0, 255, 0); // LED GREEN 
-  motor1.run(-speed); +  motor1.run(-go_forward * speed); 
-  motor2.run(speed);+  motor2.run( go_forward * speed);
  
 +  mm_motorStartTime = currentMillis;
 +  mm_motorActive    = true;
 +  mm_firstRunMotor  = false;
 } }
  
 +void actionForward() {
 +  motorMovement(dir);
 +}
 void actionBackward() { void actionBackward() {
-  // 1. Wenn gerade gefahren wird, prüfen wir, ob die Fahrzeit abgelaufen ist +  motorMovement(-dir);
-  if (ab_backwardActive) { +
-    // Ist schon genug Zeit vergangen? +
-    if (millis() - ab_backwardStartTime >= currentTravelTime) { +
-      // Dann stoppen wir jetzt die Motoren +
-      motor1.stop(); +
-      motor2.stop(); +
-      ab_backwardActive = false; +
-    } +
- +
-    return; +
-  } +
- +
-  // 2. Wenn also gerade NICHT gefahren wird, können wir eine neue Fahrt starten +
-  ab_backwardActive      = true; +
-  ab_backwardStartTime   = millis(); +
- +
-  // Motoren starten +
-  motor1.run(speed); +
-  motor2.run(-speed); +
 } }
  
Zeile 726: Zeile 711:
   //Serial.println("...actionDistance");   //Serial.println("...actionDistance");
   // noch in der Eingabe?   // noch in der Eingabe?
-  if (exState == EX_WAIT_FOR_INPUT) {+  if (exState == EX_WAIT_FOR_INPUT)
     return;     return;
-  }+
   // step: ...calculate distance   // step: ...calculate distance
-  inputDistance = inputBuffer.toInt()+  inputDistance = max(0, min(200, inputBuffer.toInt()))
-  if (inputDistance > 200+
-    inputDistance = 200+
-  }+
   // step: calculate the travel time (for non blocking-method)   // step: calculate the travel time (for non blocking-method)
   double v = (1.0 * calibrationDistance) / (1.0 * calibrationTravelTime);   double v = (1.0 * calibrationDistance) / (1.0 * calibrationTravelTime);
-  currentTravelTime =  inputDistance / v; +  currentTravelTime = inputDistance / v;
-    +
   // Serial.print("Eingegebene Distance: ");   // Serial.print("Eingegebene Distance: ");
   // Serial.println(inputDistance);   // Serial.println(inputDistance);
Zeile 743: Zeile 725:
  
 void actionOff() { void actionOff() {
-  led.setColorAt(1, 0, 0, 0); +  setLED(0, 0, 0); // LED OFF
-  led.setColorAt(0, 0, 0, 0); +
-  led.show();+
   // reset   // reset
   motor1.stop();   motor1.stop();
Zeile 756: Zeile 736:
   ac_calibrationDone  = false;   ac_calibrationDone  = false;
  
-  // reset state forward +  // reset movement 
- +  mm_firstRunMotor    = true; 
-  // reset state backward+  mm_motorActive      = false; 
 +  mm_motorStartTime   = 0;
  
   // reset state distance   // reset state distance
 +  exState       = EX_IDLE;
 } }
 </Code> </Code>
 +==== Erklärungen zum Quellcode ====
 +=== ⚙️ Setup (setup()) ===
 +Initialisiert die IR-Fernbedienung und setzt den LED-Pin.  
 +  * ''ir.begin()'' → Startet die IR-Signalverarbeitung.  
 +  * ''led.setpin(13)'' → Setzt den LED-Steuerpin.  
 +
 +=== 🔄 Loop (loop()) ===
 +  - **Liest IR-Signale (''read()'')**  
 +  - **Bestimmt den aktuellen Zustand (''decode()'')**  
 +  - **Führt die passende Aktion aus (`actionXXX()`)**  
 +
 +=== 🚦 Zustandsbezogene Aktionen (actionXXX()) ====
 +  * **''actionForward()'' / ''actionBackward()''** → startet Motoren für Vorwärts-/Rückwärtsfahrt.  
 +  * **''actionDistance()''** → Berechnet die Fahrtzeit basierend auf eingegebener Distanz.  
 +  * **''actionCalibration()''** → Bestimmt die Fahrzeit für eine feste Strecke mit dem Linienfolger.  
 +  * **''actionOff()''** → Stoppt alle Motoren und setzt den Zustand zurück.  
 +
 +=== ⌨️ Eingabeverarbeitung (handleInput(), finalizeInput()) ===
 +  - Ermöglicht die Eingabe einer numerischen Distanz per IR-Fernbedienung.  
 +  - ''handleInput(int number)'' → Fügt eine Zahl zur Eingabe hinzu.  
 +  - ''finalizeInput()'' → Wandelt den Eingabewert in eine Strecke um.  
 +
 +=== ⚙️ Die ADJUST AREA ===
 +Hier können **drei zentrale Parameter** angepasst werden:  
 +  * **''calibrationDistance = 40''** → Standardstrecke für die Kalibrierung in cm.  
 +  * **''speed = 200''** → Geschwindigkeit der Motoren.  
 +  * **''dir = 1''** → Richtungskorrektur für Vorwärtsbewegung. 
 +          * Falls das Fahrzeug rückwärts fährt, auf ''-1'' setzen.  
 +
 +Die Werte beeinflussen das Fahrverhalten direkt und sollten je nach Umgebung angepasst werden.  
  
  
mbot_streckenfahren.1740835394.txt.gz · Zuletzt geändert: 2025/03/01 13:23 von torsten.roehl