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/18 16:56] – [90°-Drehung: zweite (komplexere) Variante] torsten.roehlhello_mbot_kalibrierung [2025/02/19 19:55] (aktuell) – [Bedienung] torsten.roehl
Zeile 1: Zeile 1:
 ====== Hello mBot Kalibrierung ====== ====== Hello mBot Kalibrierung ======
-FIXME  Abschnitt entsteht gerade!+
  
  
Zeile 26: Zeile 26:
   * Falls sich der mBot zu weit dreht → ''turn_time'' verringern.     * Falls sich der mBot zu weit dreht → ''turn_time'' verringern.  
   * Falls sich der mBot zu wenig dreht → ''turn_time'' erhöhen.     * Falls sich der mBot zu wenig dreht → ''turn_time'' erhöhen.  
-  * Der optimale Wert wird durch Tests ermittelt.+  * <color #ff7f27>Der optimale Wert muss durch Tests experimentell ermittelt werden.</color>
  
 ==== Quellcode (engl. Sourcecode) ==== ==== Quellcode (engl. Sourcecode) ====
Zeile 73: Zeile 73:
 Nach der Kalibrierung kann der Roboter getestet werden. Nach der Kalibrierung kann der Roboter getestet werden.
  
 +**
 +Dieses Programm verwendet eine einfache Tastensteuerung – einmal zur Kalibrierung und danach zum Testen der Kalibrierung. Es dient lediglich als Beispiel, um das Prinzip zu veranschaulichen.**
 </WRAP> </WRAP>
  
Zeile 79: Zeile 81:
 |{{ :inf:msr:mbot.png?200 |}}| |{{ :inf:msr:mbot.png?200 |}}|
 |<WRAP> |<WRAP>
-**Ausgangskonfiguration:**  
-  
 Der **mBot** befindet sich auf einem **schwarzen L** (90-Grad-Winkel) als Referenz.   Der **mBot** befindet sich auf einem **schwarzen L** (90-Grad-Winkel) als Referenz.  
  
Zeile 92: Zeile 92:
 </WRAP>| </WRAP>|
  
-  
-=== Funktionsweise ===   
-  * Die FSM steuert den Kalibrierungsprozess basierend auf Benutzereingaben.   
-  * Der mBot führt eine Drehung aus und passt die Drehzeit automatisch an.   
-  * Nach erfolgreicher Kalibrierung kann die Drehung getestet werden.   
  
-Dieses Programm verwendet eine einfache Tastensteuerung – einmal zur Kalibrierung und danach zum Testen der Kalibrierung. Es dient lediglich als Beispiel, um das Prinzip zu veranschaulichen.+
  
 ==== Quellcode (engl. Sourcecode) ==== ==== Quellcode (engl. Sourcecode) ====
 +
 +
 <Code c linenums:1 | Listing 1:MinimalesProgramm.ino> <Code c linenums:1 | Listing 1:MinimalesProgramm.ino>
 +#include "MeMCore.h"
  
 +// Hardware
 +MeBuzzer buzzer;
 +MeLineFollower lineFinder(PORT_2);
 +MeRGBLed led(0, 2);   // must be fixed!
 +MeDCMotor motor1(M1);
 +MeDCMotor motor2(M2);
 +int PIN_BUTTON = 7;   // must be fixed!
 +int threshold  = 500; // Analoger Schwellenwert!
 +int buttonCount;
 +// Allgemein
 +int speed = 100; // Motor speed
 +unsigned long time90degree;
 +
 +// turn90Degree...
 +bool t90d_isTurning = false;
 +unsigned long t90d_turnStartTime = 0;
 +// actionCalibration...
 +unsigned long ac_turnStartTimeLeft  = 0;
 +unsigned long ac_turnTimeLeft = 0;
 +unsigned long ac_turnStartTimeRight = 0;
 +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
 +*/
 +
 +bool turn90Degree(bool left) {
 +  // step: ...start turning
 +  if (!t90d_isTurning) {
 +    motor1.stop();
 +    motor2.stop();
 +    t90d_isTurning     = 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;
 +
 +  // step: ... finished
 +  motor1.stop();
 +  motor2.stop();
 +  t90d_isTurning = false;
 +
 +  return true;
 +}
 +
 +bool isButtonPressed() {
 +  static bool buttonPressed = false;
 +  int value = analogRead(PIN_BUTTON);
 +
 +  if (value < threshold) {
 +    if (!buttonPressed) {
 +      buttonPressed = true;
 +      return true;
 +    }
 +  } else {
 +    buttonPressed = false; // Button wurde losgelassen
 +  }
 +  return false;
 +
 +}
 +
 +int read() {
 +  if ( isButtonPressed() )
 +    buttonCount += 1;
 +
 +  if (buttonCount > 2)
 +    buttonCount = 0;
 +
 +  return buttonCount;
 +}
 +
 +
 +State decode(int cmd) {
 +  switch (cmd) {
 +    case 1: return STATE_CALIBRATION;
 +    case 2: return STATE_TEST;
 +  }
 +  return STATE_OFF;
 +}
 +
 +void actionCalibration() {
 +
 +  if (ac_calibrationDone)
 +    return;
 +
 +  led.setColorAt(1, 255, 0, 0);
 +  led.setColorAt(0, 255, 0, 0);
 +  led.show();
 +  int sensorState = lineFinder.readSensors();
 +
 +  // step - start turning left
 +  if (!ac_isTurning) {
 +    motor1.stop();
 +    motor2.stop();
 +    motor1.run(speed);
 +    motor2.run(speed);
 +    ac_turnStartTimeLeft = millis();
 +    ac_isTurning = true;
 +    ac_isRightTurning = true;
 +    do {
 +      sensorState = lineFinder.readSensors();
 +    } while ( sensorState != S1_OUT_S2_OUT);
 +  }
 +
 +  // step - end turning left ... start turning right
 +  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;
 +}
 </Code> </Code>
 ==== Bedienung ==== ==== Bedienung ====
Zeile 109: Zeile 335:
  
 ⚡ **Schritt 1:**   ⚡ **Schritt 1:**  
-▶ **Drücken des Tasters** → **Rote LEDs leuchten**  +▶ **Drücken des Tasters** → **LEDs werden <color #ed1c24>rot</color>**  
    * Die **Kalibrierung** startet.      * Die **Kalibrierung** startet.  
    * Nach Abschluss der Kalibrierung **erlöschen die LEDs**.    * Nach Abschluss der Kalibrierung **erlöschen die LEDs**.
  
 ⚡ **Schritt 2:**   ⚡ **Schritt 2:**  
-▶ **Erneutes Drücken des Tasters** → **LEDs werden grün**  +▶ **Erneutes Drücken des Tasters** → **LEDs werden <color #22b14c>grün</color>**  
    * Der **Testlauf** beginnt.    * Der **Testlauf** beginnt.
 +   * Nach Abschluss des Testlaufs **erlöschen die LEDs**.
  
 ⚡ **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.1739897789.txt.gz · Zuletzt geändert: 2025/02/18 16:56 von torsten.roehl