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: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
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 +// motor movement 
-bool af_firstRunMotor = true;     // erstes Starten? +bool mm_firstRunMotor = true; 
-bool af_motorActive   = false;    // Motorzustand? +bool mm_motorActive   = false; 
-unsigned long af_motorStartTime = 0; +unsigned long mm_motorStartTime = 0;
-// actionBackward +
-bool ab_firstRunMotor = true;     // erstes Starten? +
-bool ab_motorActive   = false;    // Motorzustand? +
-unsigned long ab_motorStartTime = 0;+
  
 //FSM //FSM
Zeile 456: 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 462: Zeile 457:
 void setup() { void setup() {
   led.setpin(13);   led.setpin(13);
-  Serial.begin(9600);+  //Serial.begin(9600);  // debugging
   ir.begin();   ir.begin();
 } }
Zeile 496: 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 506: Zeile 507:
     lastCode = code;     lastCode = code;
     lastTime = now;     lastTime = now;
 +
     //     //
     switch (code) {     switch (code) {
Zeile 575: Zeile 577:
       return STATE_FORWARD;       return STATE_FORWARD;
   }   }
- 
   return lastState;   return lastState;
 } }
Zeile 589: Zeile 590:
   inputNumber = 0;   inputNumber = 0;
   inputBuffer = "";   inputBuffer = "";
 +  setLED(0, 0, 255); // LED BLUE
 } }
  
Zeile 613: Zeile 615:
     exState = EX_IDLE;     exState = EX_IDLE;
     buzzer.tone(1200, 200);     buzzer.tone(1200, 200);
 +    setLED(0, 0, 0); // LED OFF
   }   }
 } }
Zeile 621: Zeile 624:
   ---------------------------   ---------------------------
 */ */
- 
 void actionCalibration() { void actionCalibration() {
  
Zeile 627: 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 636: 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 651: 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 669: 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 ) {
   unsigned long currentMillis = millis();   unsigned long currentMillis = millis();
  
-  // 1. Wenn der Motor aktuell läuft, prüfen wir, ob die Zeit abgelaufen ist +  // Wenn der Motor aktuell läuft, prüfen wir, ob die Zeit abgelaufen ist 
-  if (af_motorActive) { +  if (mm_motorActive) { 
-    if (currentMillis - af_motorStartTime >= currentTravelTime) { +    if (currentMillis - mm_motorStartTime >= currentTravelTime) {
-      // Zeit ist um → Motor stoppen+
       motor1.stop();       motor1.stop();
       motor2.stop();       motor2.stop();
-      af_motorActive = false; +      mm_motorActive = false; 
 +      state          = STATE_OFF; 
 +      lastState      = STATE_OFF;
     }     }
-    // Funktion verlassen 
     return;     return;
   }   }
  
-  // 2. Wenn der Motor nicht läuft, prüfen wir, ob es das allererste Mal ist. +  if (!mm_firstRunMotor
-  if (af_firstRunMotor+    return;
-    // Dann starten wir den Motor +
-    motor1.run(-speed); +
-    motor2.run(speed); +
-    af_motorStartTime = currentMillis; +
-    af_motorActive    = true; +
-    af_firstRunMotor  = false;+
  
-  }+  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() {
-  unsigned long currentMillis = millis(); +  motorMovement(-dir);
- +
-  // 1. Wenn der Motor aktuell läuft, prüfen wir, ob die Zeit abgelaufen ist +
-  if (ab_motorActive) { +
-    if (currentMillis ab_motorStartTime >= currentTravelTime+
-      // Zeit ist um → Motor stoppen +
-      motor1.stop(); +
-      motor2.stop(); +
-      ab_motorActive = false; +
- +
-    } +
-    // Funktion verlassen +
-    return; +
-  } +
- +
-  // 2. Wenn der Motor nicht läuft, prüfen wir, ob es das allererste Mal ist. +
-  if (ab_firstRunMotor) { +
-    // Dann starten wir den Motor +
-    motor1.run(speed); +
-    motor2.run(-speed); +
-    ab_motorStartTime = currentMillis; +
-    ab_motorActive    = true; +
-    ab_firstRunMotor  = false; +
-  } +
 } }
  
Zeile 737: 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);
Zeile 753: 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 766: Zeile 736:
   ac_calibrationDone  = false;   ac_calibrationDone  = false;
  
-  // reset state forward +  // reset movement 
-  af_firstRunMotor = true; +  mm_firstRunMotor    = true; 
-  af_motorActive   = false; +  mm_motorActive      = false; 
-  af_motorStartTime = 0; +  mm_motorStartTime   = 0; 
-  // reset state backward +
-  ab_firstRunMotor = true; +
-  ab_motorActive   = false; +
-  ab_motorStartTime = 0;+
   // reset state distance   // reset state distance
   exState       = EX_IDLE;   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.1740837495.txt.gz · Zuletzt geändert: 2025/03/01 13:58 von torsten.roehl