mbot_streckenfahren
                Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| mbot_streckenfahren [2025/03/01 13:53] – [Quellcode (engl. Sourcecode)] torsten.roehl | mbot_streckenfahren [2025/03/02 14:38] (aktuell) – [Erklärungen zum Quellcode] torsten.roehl | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== mBot Streckenfahren ====== | ====== mBot Streckenfahren ====== | ||
| - | |||
| - | FIXME  <color # | ||
| - | </ | ||
| - | |||
| //Der mBot kann, gesteuert über die Infrarot-Fernbedienung, | //Der mBot kann, gesteuert über die Infrarot-Fernbedienung, | ||
| Zeile 392: | Zeile 388: | ||
| <WRAP center round tip 95%> | <WRAP center round tip 95%> | ||
| </ | </ | ||
| + | |||
| ==== Quellcode (engl. Sourcecode) ==== | ==== Quellcode (engl. Sourcecode) ==== | ||
| Zeile 407: | Zeile 404: | ||
| // IR-Entprellen | // IR-Entprellen | ||
| - | static uint8_t lastCode = 0xFF; | + | static uint8_t lastCode | 
| static unsigned long lastTime = 0; | static unsigned long lastTime = 0; | ||
| const unsigned long COOL_DOWN = 1000; // in Millisekunden, | const unsigned long COOL_DOWN = 1000; // in Millisekunden, | ||
| 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 | 
| + | int dir = 1; // change to -1 if forward drive backwards! | ||
| // ADJUST AREA END | // ADJUST AREA END | ||
| // actionCalibration... | // actionCalibration... | ||
| unsigned long ac_movingStartTimeForward | unsigned long ac_movingStartTimeForward | ||
| - | unsigned long ac_movingTimeForward = 0; | + | unsigned long ac_movingTimeForward | 
| unsigned long ac_movingStartTimeBackward = 0; | unsigned long ac_movingStartTimeBackward = 0; | ||
| - | unsigned long ac_movingTimeBackward = 0; | + | unsigned long ac_movingTimeBackward | 
| - | bool ac_isMoving = false; | + | bool ac_isMoving | 
| - | bool ac_isForwardMoving = false; | + | bool ac_isForwardMoving | 
| bool ac_isBackwardMoving = false; | bool ac_isBackwardMoving = false; | ||
| - | bool ac_calibrationDone = false; | + | bool ac_calibrationDone | 
| - | // actionForward | + | // motor movement | 
| - | bool af_firstRunMotor | + | bool mm_firstRunMotor | 
| - | bool af_motorActive | + | bool mm_motorActive | 
| - | unsigned long af_motorStartTime = 0; | + | unsigned long mm_motorStartTime | 
| - | // actionBackward | + | |
| - | bool ab_firstRunMotor = true; // erstes Starten? | + | |
| - | bool ab_motorActive | + | |
| - | unsigned long ab_motorStartTime | + | |
| //FSM | //FSM | ||
| Zeile 456: | Zeile 450: | ||
| }; | }; | ||
| ExState exState | ExState exState | ||
| + | |||
| int | int | ||
| String | String | ||
| Zeile 462: | Zeile 457: | ||
| void setup() { | void setup() { | ||
| led.setpin(13); | led.setpin(13); | ||
| - | Serial.begin(9600); | + |  | 
| ir.begin(); | ir.begin(); | ||
| } | } | ||
| Zeile 496: | Zeile 491: | ||
| --------------------------- | --------------------------- | ||
| */ | */ | ||
| + | void setLED(int r, int g, int b) { | ||
| + | led.setColorAt(0, | ||
| + | led.setColorAt(1, | ||
| + | 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, | buzzer.tone(1200, | ||
| + | setLED(0, 0, 0); // LED OFF | ||
| } | } | ||
| } | } | ||
| Zeile 621: | Zeile 624: | ||
| --------------------------- | --------------------------- | ||
| */ | */ | ||
| - | |||
| void actionCalibration() { | void actionCalibration() { | ||
| Zeile 627: | Zeile 629: | ||
| return; | return; | ||
| - |  | + |  | 
| - | led.setColorAt(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( | 
| 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; | ||
| - | + |  | |
| - |  | + | 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, | ||
| - | led.setColorAt(0, | ||
| - | led.show(); | ||
| buzzer.tone(1200, | buzzer.tone(1200, | ||
| 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 | + | if (currentMillis - mm_motorStartTime | 
| - | // Zeit ist um → Motor stoppen | + | |
| motor1.stop(); | motor1.stop(); | ||
| motor2.stop(); | motor2.stop(); | ||
| - |  | + |  | 
| + |  | ||
| + | lastState | ||
| } | } | ||
| - | // Funktion verlassen | ||
| return; | return; | ||
| } | } | ||
| - |  | + | if (!mm_firstRunMotor) | 
| - |  | + |  | 
| - | // Dann starten wir den Motor | + | |
| - | motor1.run(-speed); | + | |
| - | motor2.run(speed); | + | |
| - | af_motorStartTime = currentMillis; | + | |
| - | af_motorActive | + | |
| - |  | + | |
| - |  | + |  | 
| + | motor1.run(-go_forward * speed); | ||
| + | motor2.run( go_forward * speed); | ||
| + | |||
| + | mm_motorStartTime = currentMillis; | ||
| + | mm_motorActive | ||
| + | mm_firstRunMotor | ||
| } | } | ||
| + | void actionForward() { | ||
| + | motorMovement(dir); | ||
| + | } | ||
| void actionBackward() { | void actionBackward() { | ||
| - |  | + |  | 
| - | + | ||
| - | // 1. Wenn der Motor aktuell läuft, prüfen wir, ob die Zeit abgelaufen ist | + | |
| - | if (ab_motorActive) { | + | |
| - | if (currentMillis | + | |
| - | // 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 | + | |
| - | ab_firstRunMotor | + | |
| - | } | + | |
| } | } | ||
| Zeile 737: | Zeile 711: | ||
| // | // | ||
| // 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, | 
| - | 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 = | + | currentTravelTime = inputDistance / v; | 
| // Serial.print(" | // Serial.print(" | ||
| // Serial.println(inputDistance); | // Serial.println(inputDistance); | ||
| Zeile 754: | Zeile 725: | ||
| void actionOff() { | void actionOff() { | ||
| - |  | + |  | 
| - | led.setColorAt(0, | + | |
| - | led.show(); | + | |
| // reset | // reset | ||
| motor1.stop(); | motor1.stop(); | ||
| Zeile 767: | Zeile 736: | ||
| ac_calibrationDone | ac_calibrationDone | ||
| - | // reset state forward | + | // reset movement | 
| - |  | + |  | 
| - |  | + |  | 
| - |  | + |  | 
| - | // reset state backward | + | |
| - | ab_firstRunMotor = true; | + | |
| - | ab_motorActive | + | |
| - | ab_motorStartTime = 0; | + | |
| // reset state distance | // reset state distance | ||
| exState | exState | ||
| } | } | ||
| </ | </ | ||
| + | ==== Erklärungen zum Quellcode ==== | ||
| + | === ⚙️ Setup (setup()) === | ||
| + | Initialisiert die IR-Fernbedienung und setzt den LED-Pin. | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | === 🔄 Loop (loop()) === | ||
| + | - **Liest IR-Signale ('' | ||
| + | - **Bestimmt den aktuellen Zustand ('' | ||
| + | - **Führt die passende Aktion aus (`actionXXX()`)** | ||
| + | |||
| + | === 🚦 Zustandsbezogene Aktionen (actionXXX()) ==== | ||
| + | * **'' | ||
| + | * **'' | ||
| + | * **'' | ||
| + | * **'' | ||
| + | |||
| + | === ⌨️ Eingabeverarbeitung (handleInput(), | ||
| + | - Ermöglicht die Eingabe einer numerischen Distanz per IR-Fernbedienung. | ||
| + | - '' | ||
| + | - '' | ||
| + | |||
| + | === ⚙️ Die ADJUST AREA === | ||
| + | Hier können **drei zentrale Parameter** angepasst werden: | ||
| + | * **'' | ||
| + | * **'' | ||
| + | * **'' | ||
| + | * Falls das Fahrzeug rückwärts fährt, auf '' | ||
| + | |||
| + | Die Werte beeinflussen das Fahrverhalten direkt und sollten je nach Umgebung angepasst werden. | ||
mbot_streckenfahren.1740837191.txt.gz · Zuletzt geändert:  von torsten.roehl
                
                