hello_mbot_kalibrierung
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hello_mbot_kalibrierung [2025/02/19 10:17] – [Quellcode (engl. Sourcecode)] torsten.roehl | hello_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: | <Code c linenums:1 | Listing 1: | ||
+ | #include " | ||
- | #include " | + | // 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 | + | int PIN_BUTTON = 7; // must be fixed! |
- | int buttonCount; | + | int threshold |
- | | + | 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, | + | |
- | buttonCount = 0; | + | |
- | } | + | |
- | + | ||
- | void loop() { | + | |
- | | + | |
- | int cmd = read(); | + | |
- | | + | |
- | state = decode(cmd); | + | |
- | // step: action | + | |
- | switch (state) { | + | |
- | case STATE_CALIBRATION: | + | |
- | actionCalibration(); | + | |
- | break; | + | |
- | case STATE_TEST: | + | |
- | actionTest(); | + | |
- | break; | + | |
- | case STATE_OFF: | + | |
- | actionOff(); | + | |
- | break; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | /* | + | |
- | | + | |
- | */ | + | |
- | + | ||
- | bool turn90Degree(bool left) { | + | |
- | | + | |
- | 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 |
- | | + | 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; | ||
+ | // | ||
+ | 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 | ||
+ | | ||
+ | // step: action | ||
+ | switch (state) { | ||
+ | | ||
+ | actionCalibration(); | ||
+ | break; | ||
+ | case STATE_TEST: | ||
+ | actionTest(); | ||
+ | break; | ||
+ | case STATE_OFF: | ||
+ | actionOff(); | ||
+ | break; | ||
} | } | ||
+ | } | ||
+ | |||
+ | |||
+ | /* | ||
+ | | ||
+ | */ | ||
- | if (isTurning && millis() - turnStartTime >= time90degree) { | + | bool turn90Degree(bool left) { |
+ | // step: ...start turning | ||
+ | if (!t90d_isTurning) { | ||
motor1.stop(); | motor1.stop(); | ||
motor2.stop(); | motor2.stop(); | ||
- | | + | |
- | return | + | int dir = left ? 1 : -1; |
+ | |||
+ | motor1.run(dir * speed); | ||
+ | motor2.run(dir * speed); | ||
+ | t90d_turnStartTime = millis(); | ||
+ | return | ||
} | } | ||
+ | // step: ...in progress | ||
+ | if (millis() - t90d_turnStartTime < time90degree) | ||
+ | return false; | ||
- | | + | |
+ | motor1.stop(); | ||
+ | motor2.stop(); | ||
+ | t90d_isTurning = false; | ||
+ | |||
+ | return true; | ||
} | } | ||
- | | + | 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() { | + | |
- | 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; |
- | | + | case 2: return STATE_TEST; |
- | | + | } |
- | | + | return STATE_OFF; |
- | // TODO calibrate 90degree here! | + | } |
- | + | ||
- | } | + | void actionCalibration() { |
- | void actionTest() { | + | |
- | led.setColorAt(1, 0, 255, 0); | + | |
- | led.setColorAt(0, | + | |
+ | |||
+ | led.setColorAt(1, | ||
+ | led.setColorAt(0, 255, 0, 0); | ||
led.show(); | led.show(); | ||
+ | int sensorState = lineFinder.readSensors(); | ||
- | | + | // step - start turning left |
- | static bool doneRight = false; | + | if (!ac_isTurning) { |
- | | + | |
- | if (!doneLeft) { | + | |
- | | + | |
- | | + | |
- | // | + | |
- | else if (doneLeft && !doneRight) { | + | ac_isTurning = true; |
- | | + | ac_isRightTurning = true; |
+ | do { | ||
+ | sensorState = lineFinder.readSensors(); | ||
+ | } while ( sensorState != S1_OUT_S2_OUT); | ||
} | } | ||
- | | + | |
- | | + | |
- | | + | if (ac_isRightTurning |
+ | | ||
+ | motor2.stop(); | ||
+ | ac_turnTimeLeft | ||
+ | |||
+ | 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, | ||
+ | led.setColorAt(0, | ||
+ | led.show(); | ||
+ | buzzer.tone(1200, | ||
+ | } | ||
+ | |||
+ | } | ||
+ | void actionTest() { | ||
+ | |||
+ | if (!at_doneLeft) { // Links-Drehung | ||
+ | at_doneLeft = turn90Degree(true); | ||
+ | led.setColorAt(1, | ||
+ | led.setColorAt(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, | ||
+ | led.setColorAt(0, | ||
+ | led.show(); | ||
+ | buzzer.tone(1200, | ||
+ | at_testComplete = true; | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void actionOff() { | ||
+ | led.setColorAt(1, | ||
+ | led.setColorAt(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, | ||
- | led.setColorAt(0, | ||
- | led.show(); | ||
- | motor1.stop(); | ||
- | motor2.stop(); | ||
- | } | ||
- | |||
</ | </ | ||
==== 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 |
* 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