Benutzer-Werkzeuge

Webseiten-Werkzeuge


hello_mbot_kalibrierung

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_kalibrierung [2025/02/19 10:17] – [Quellcode (engl. Sourcecode)] torsten.roehlhello_mbot_kalibrierung [2025/02/19 19:55] (aktuell) – [Bedienung] torsten.roehl
Zeile 97: Zeile 97:
 ==== Quellcode (engl. Sourcecode) ==== ==== Quellcode (engl. Sourcecode) ====
  
-FIXME  Code noch nicht fertig!+
 <Code c linenums:1 | Listing 1:MinimalesProgramm.ino> <Code c linenums:1 | Listing 1:MinimalesProgramm.ino>
 +#include "MeMCore.h"
  
-    #include "MeMCore.h" +// Hardware 
-      +MeBuzzer buzzer; 
-    MeRGBLed led(0, 2);   // must be fixed! +MeLineFollower lineFinder(PORT_2); 
-    MeDCMotor motor1(M1);  +MeRGBLed led(0, 2);   // must be fixed! 
-    MeDCMotor motor2(M2);   +MeDCMotor motor1(M1); 
-    int PIN_BUTTON = 7;   // must be fixed! +MeDCMotor motor2(M2); 
-    int threshold  = 500; // Analoger Schwellenwert! +int PIN_BUTTON = 7;   // must be fixed! 
-    int buttonCount; +int threshold  = 500; // Analoger Schwellenwert! 
-    unsigned long time90degree;      +int buttonCount; 
-      +// Allgemein 
-    enum State { +int speed 100; // Motor speed 
-      STATE_OFF, +unsigned long time90degree;
-      STATE_CALIBRATION, +
-      STATE_TEST      +
-    }; +
-    State state = STATE_OFF; +
-      +
-    void setup() { +
-      led.setpin(13); +
-      pinMode(PIN_BUTTON, INPUT); +
-      buttonCount = 0; +
-    } +
-      +
-    void loop() { +
-      // step: command +
-      int cmd read()     +
-      // step: state  +
-      state  = decode(cmd);      +
-      // step: action +
-      switch (state) { +
-        case STATE_CALIBRATION: +
-          actionCalibration(); +
-          break; +
-        case STATE_TEST: +
-          actionTest(); +
-          break; +
-        case STATE_OFF: +
-          actionOff(); +
-          break; +
-      } +
-    } +
-      +
-      +
-    /* +
-       Funktionen +
-     */ +
-    +
-   bool turn90Degree(bool left) { +
-   int speed = 250; +
-  if (!isTurning) { +
-    turnStartTime = millis(); +
-    isTurning = true;+
  
-    if (left) { +// turn90Degree... 
-      +bool t90d_isTurning = false; 
-      motor1.run(speed);   +unsigned long t90d_turnStartTime = 0; 
-      motor2.run(speed);   +// actionCalibration... 
-    else +unsigned long ac_turnStartTimeLeft  = 0; 
-      +unsigned long ac_turnTimeLeft = 0; 
-      motor1.run(-speed);   +unsigned long ac_turnStartTimeRight = 0; 
-      motor2.run(-speed);   +unsigned long ac_turnTimeRight = 0; 
-    }+bool ac_isTurning = false; 
 +bool ac_isLeftTurning = false; 
 +bool ac_isRightTurning = false; 
 +bool ac_calibrationDone = false; 
 +//actionTest... 
 +bool at_doneLeft = false; 
 +bool at_doneRight = false; 
 +bool at_testComplete = false; 
 + 
 +enum State { 
 +  STATE_OFF, 
 +  STATE_CALIBRATION, 
 +  STATE_TEST 
 +}; 
 +State state = STATE_OFF; 
 + 
 +void setup() { 
 +  led.setpin(13); 
 +  pinMode(PIN_BUTTON, INPUT); 
 +  buttonCount = 0; 
 +} 
 + 
 +void loop() 
 +  // step: command 
 +  int cmd = read(); 
 +  // step: state 
 +  state  = decode(cmd); 
 +  // step: action 
 +  switch (state) { 
 +    case STATE_CALIBRATION: 
 +      actionCalibration(); 
 +      break; 
 +    case STATE_TEST: 
 +      actionTest(); 
 +      break; 
 +    case STATE_OFF: 
 +      actionOff(); 
 +      break;
   }   }
 +}
 +
 +
 +/*
 +     Funktionen
 +*/
  
-  if (isTurning && millis() - turnStartTime >= time90degree) {+bool turn90Degree(bool left
 +  // step: ...start turning 
 +  if (!t90d_isTurning) {
     motor1.stop();     motor1.stop();
     motor2.stop();     motor2.stop();
-    isTurning false+    t90d_isTurning     true; 
-    return true+    int dir = left ? 1 : -1; 
 + 
 +    motor1.run(dir * speed); 
 +    motor2.run(dir * speed); 
 +    t90d_turnStartTime = millis()
 +    return false;
   }   }
 +  // step: ...in progress
 +  if (millis() - t90d_turnStartTime < time90degree)
 +    return false;
  
-  return false;  +  // step: ... finished 
 +  motor1.stop(); 
 +  motor2.stop(); 
 +  t90d_isTurning = false; 
 + 
 +  return true;
 } }
  
-    bool isButtonPressed() { +bool isButtonPressed() { 
-      static bool buttonPressed = false; +  static bool buttonPressed = false; 
-      int value = analogRead(PIN_BUTTON); +  int value = analogRead(PIN_BUTTON); 
-      + 
-      if (value < threshold) { +  if (value < threshold) { 
-        if (!buttonPressed) { +    if (!buttonPressed) { 
-          buttonPressed = true; +      buttonPressed = true; 
-          return true; +      return true;
-        } +
-      } else { +
-        buttonPressed = false; // Button wurde losgelassen +
-      } +
-      return false; +
-     +
     }     }
-      +  } else { 
-    int read() { +    buttonPressed = false; // Button wurde losgelassen 
-      if ( isButtonPressed() ) +  } 
-        buttonCount += 1; +  return false; 
-      + 
-      if (buttonCount > 2) +
-        buttonCount = 0; + 
-      +int read() { 
-      return buttonCount; +  if ( isButtonPressed() ) 
-    +    buttonCount += 1; 
-      + 
-      +  if (buttonCount > 2) 
-    State decode(int cmd) { +    buttonCount = 0; 
-      switch (cmd) { + 
-        case 1: return STATE_CALIBRATION; +  return buttonCount; 
-        case 2: return STATE_TEST; +
-      + 
-      return STATE_OFF; + 
-    +State decode(int cmd) { 
-      +  switch (cmd) { 
-    void actionCalibration() { +    case 1: return STATE_CALIBRATION; 
-      led.setColorAt(1, 255, 0, 0); +    case 2: return STATE_TEST; 
-      led.setColorAt(0, 255, 0, 0); +  
-      led.show()+  return STATE_OFF; 
-      // TODO calibrate 90degree here! +
-       + 
-    } +void actionCalibration() { 
-  void actionTest() { + 
-  led.setColorAt(1, 0, 255, 0);   +  if (ac_calibrationDone
-  led.setColorAt(0, 0, 255, 0);+    return
 + 
 +  led.setColorAt(1, 255, 0, 0); 
 +  led.setColorAt(0, 255, 0, 0);
   led.show();   led.show();
 +  int sensorState = lineFinder.readSensors();
  
-  static bool doneLeft = false;   +  // step - start turning left 
-  static bool doneRight = false;   +  if (!ac_isTurning) { 
-  // +    motor1.stop(); 
-  if (!doneLeft) { +    motor2.stop(); 
-    doneLeft = turn90Degree(true);  +    motor1.run(speed); 
-   +    motor2.run(speed); 
-  //  +    ac_turnStartTimeLeft millis(); 
-  else if (doneLeft && !doneRight{ +    ac_isTurning = true; 
-    doneRight turn90Degree(false);  +    ac_isRightTurning = true; 
 +    do { 
 +      sensorState = lineFinder.readSensors(); 
 +    } while ( sensorState != S1_OUT_S2_OUT);
   }   }
-  //  + 
-  else if (doneLeft && doneRight) { +  // step - end turning left ... start turning right 
-    state STATE_OFF +  if (ac_isRightTurning && sensorState == S1_IN_S2_IN) { 
 +    motor1.stop(); 
 +    motor2.stop(); 
 +    ac_turnTimeLeft millis() - ac_turnStartTimeLeft; 
 + 
 +    motor1.run(-speed); 
 +    motor2.run(-speed); 
 +    ac_turnStartTimeRight = millis(); 
 +    do { 
 +      sensorState = lineFinder.readSensors(); 
 +    } while ( sensorState != S1_OUT_S2_OUT); 
 +    ac_isRightTurning = false; 
 +    ac_isLeftTurning = true;
   }   }
 +
 +  // step - end turing right
 +  if (ac_isLeftTurning && sensorState == S1_IN_S2_IN) {
 +    motor1.stop();
 +    motor2.stop();
 +    ac_turnTimeRight = millis() - ac_turnStartTimeRight;
 +    time90degree = (ac_turnTimeLeft + ac_turnTimeRight) / 2.0;
 +    ac_calibrationDone = true;
 +    led.setColorAt(1, 0, 0, 0);
 +    led.setColorAt(0, 0, 0, 0);
 +    led.show();
 +    buzzer.tone(1200, 600);
 +  }
 +
 +}
 +void actionTest() {
 +
 +  if (!at_doneLeft) { // Links-Drehung
 +    at_doneLeft = turn90Degree(true);
 +    led.setColorAt(1, 0, 255, 0);
 +    led.setColorAt(0, 0, 255, 0);
 +    led.show();
 +    return;
 +  }
 +
 +  if (!at_doneRight) { // Rechts-Drehung
 +    at_doneRight = turn90Degree(false);
 +    return;
 +  }
 +
 +  if (!at_testComplete) { // fertig
 +    motor1.stop();
 +    motor2.stop();
 +    led.setColorAt(1, 0, 0, 0);
 +    led.setColorAt(0, 0, 0, 0);
 +    led.show();
 +    buzzer.tone(1200, 600);
 +    at_testComplete = true;
 +    return;
 +  }
 +}
 +
 +void actionOff() {
 +  led.setColorAt(1, 0, 0, 0);
 +  led.setColorAt(0, 0, 0, 0);
 +  led.show();
 +
 +  // reset
 +  motor1.stop();
 +  motor2.stop();
 +
 +  // reset state calibration
 +  ac_isTurning = false;
 +  ac_isLeftTurning = false;
 +  ac_isRightTurning = false;
 +  ac_calibrationDone = false;
 +
 +  // reset state test
 +  at_doneLeft = false;
 +  at_doneRight = false;
 +  at_testComplete = false;
 } }
-    
-  
-      
-    void actionOff() { 
-      led.setColorAt(1, 0, 0, 0); 
-      led.setColorAt(0, 0, 0, 0); 
-      led.show(); 
-      motor1.stop();     
-      motor2.stop();     
-    } 
-      
 </Code> </Code>
 ==== Bedienung ==== ==== Bedienung ====
Zeile 263: Zeile 345:
  
 ⚡ **Schritt 3:**   ⚡ **Schritt 3:**  
-▶ **Nach dem Testlauf** kehrt der mBot in den **Ruhezustand** zurück.  +▶ **Nach dem Testlauf** kehrt der mBot durch Drückens des Tasters in den **Ruhezustand** zurück.  
    * Der Vorgang kann **von vorne** gestartet werden.    * Der Vorgang kann **von vorne** gestartet werden.
  
hello_mbot_kalibrierung.1739960233.txt.gz · Zuletzt geändert: 2025/02/19 10:17 von torsten.roehl