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 12:58] – [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
  
 // Allgemein // Allgemein
-unsigned long calibrationTravelTime = 0;+unsigned long calibrationTravelTime;
 unsigned long currentTravelTime = 100; unsigned long currentTravelTime = 100;
  
 // 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
 + 
 +// motor movement 
 +bool mm_firstRunMotor = true; 
 +bool mm_motorActive   = false; 
 +unsigned long mm_motorStartTime = 0;
  
 //FSM //FSM
Zeile 447: 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 453: Zeile 457:
 void setup() { void setup() {
   led.setpin(13);   led.setpin(13);
-  Serial.begin(9600);+  //Serial.begin(9600);  // debugging
   ir.begin();   ir.begin();
 } }
Zeile 487: 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 497: Zeile 507:
     lastCode = code;     lastCode = code;
     lastTime = now;     lastTime = now;
 +
     //     //
     switch (code) {     switch (code) {
Zeile 566: Zeile 577:
       return STATE_FORWARD;       return STATE_FORWARD;
   }   }
- 
   return lastState;   return lastState;
 } }
Zeile 580: Zeile 590:
   inputNumber = 0;   inputNumber = 0;
   inputBuffer = "";   inputBuffer = "";
 +  setLED(0, 0, 255); // LED BLUE
 } }
  
Zeile 604: Zeile 615:
     exState = EX_IDLE;     exState = EX_IDLE;
     buzzer.tone(1200, 200);     buzzer.tone(1200, 200);
 +    setLED(0, 0, 0); // LED OFF
   }   }
 } }
Zeile 612: Zeile 624:
   ---------------------------   ---------------------------
 */ */
- 
 void actionCalibration() { void actionCalibration() {
  
Zeile 618: 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 627: 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 642: 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 650: Zeile 659:
     } while ( sensorState != S1_OUT_S2_OUT);     } while ( sensorState != S1_OUT_S2_OUT);
     ac_isBackwardMoving = false;     ac_isBackwardMoving = false;
-    ac_isForwardMoving = true;+    ac_isForwardMoving  = true;
   }   }
  
Zeile 660: 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 ) { 
-  Serial.println("...actionForward");+  unsigned long currentMillis = millis(); 
 + 
 +  // Wenn der Motor aktuell läuft, prüfen wir, ob die Zeit abgelaufen ist 
 +  if (mm_motorActive) { 
 +    if (currentMillis - mm_motorStartTime >= currentTravelTime) { 
 +      motor1.stop(); 
 +      motor2.stop(); 
 +      mm_motorActive = false; 
 +      state          = STATE_OFF; 
 +      lastState      = STATE_OFF; 
 +    } 
 +    return; 
 +  } 
 + 
 +  if (!mm_firstRunMotor) 
 +    return; 
 + 
 +  setLED(0, 255, 0); // LED GREEN 
 +  motor1.run(-go_forward * speed); 
 +  motor2.run( go_forward * speed)
 + 
 +  mm_motorStartTime = currentMillis; 
 +  mm_motorActive    = true; 
 +  mm_firstRunMotor  = false;
 } }
  
 +void actionForward() {
 +  motorMovement(dir);
 +}
 void actionBackward() { void actionBackward() {
-  Serial.println("...actionBackward");+  motorMovement(-dir);
 } }
  
Zeile 680: 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 = v * inputDistance; +  currentTravelTime = inputDistance / v;
   // Serial.print("Eingegebene Distance: ");   // Serial.print("Eingegebene Distance: ");
   // Serial.println(inputDistance);   // Serial.println(inputDistance);
 } }
- 
  
 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 706: Zeile 731:
  
   // reset state calibration   // reset state calibration
-  ac_isMoving = false; +  ac_isMoving         = false; 
-  ac_isForwardMoving = false;+  ac_isForwardMoving  = false;
   ac_isBackwardMoving = false;   ac_isBackwardMoving = false;
-  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.1740833939.txt.gz · Zuletzt geändert: 2025/03/01 12:58 von torsten.roehl