Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Hello mBot Kalibrierung
Dieser Abschnitt zeigt, wie der mBot kalibriert werden kann. Grundsätzlich können alle Motoren oder Sensoren kalibriert werden. Ich stelle zwei Varianten vor, wie der mBot kalibriert werden kann (er besitzt keine Encoder), um 90-Grad-Drehungen durchzuführen.
Voraussetzungen:
- Der Abschnitt Hello mBot Blockierung sollte bekannt sein
- Der Abschnitt Hello mBot Programmorganisation sollte bekannt sein.
90°-Drehung: erste (einfache) Variante
Dieses Programm ermöglicht eine 90-Grad-Drehung des mBot.
Die Drehung erfolgt zeitgesteuert, wobei die Dauer (turn_time)
für eine präzise Kalibrierung angepasst werden kann.
Funktionsweise
- Der mBot führt eine Drehbewegung für die Dauer von
turn_time
aus. - Nach Ablauf der Zeit stoppt die Bewegung um dann alle 5 Sekunden wiederholt zu werden.
- Die Drehzeit bestimmt, wie weit sich der mBot dreht.
Kalibrierung
- Falls sich der mBot zu weit dreht →
turn_time
verringern. - Falls sich der mBot zu wenig dreht →
turn_time
erhöhen. - Der optimale Wert muss durch Tests experimentell ermittelt werden.
Quellcode (engl. Sourcecode)
Listing 1:MinimalesProgramm.ino
#include <MeMCore.h> MeDCMotor motor1(M1); MeDCMotor motor2(M2); void setup() { Serial.begin(9600); } void loop() { turn90Degrees(400); // Hier die Drehzeit anpassen delay(5000); // Wartezeit zwischen Drehungen } void turn90Degrees(int turn_time) { int speed = 100; // Geschwindigkeit motor1.run(speed); motor2.run(speed); delay(turn_time); motor1.run(0); motor2.run(0); }
Vorteile & Nachteile
Vorteil | Nachteil |
---|---|
✅ Einfach zu implementieren und gut für Programmieranfänger geeignet. | ❌ Manuelle Kalibrierung ist aufwendig. |
❌ Bei schwächer werdender Batterie muss die Drehzeit erneut angepasst werden. | |
❌ Die Methode blockiert das Programm und lässt sich nicht elegant in komplexere Programme integrieren. |
90°-Drehung: zweite (komplexere) Variante
mBot 90-Grad-Drehung mit automatischer Kalibrierung
Dieses Programm ermöglicht eine automatische 90-Grad-Kalibrierung des mBot. Die Steuerung erfolgt über eine finite state machine (FSM), die eine tastengesteuerte Kontrolle erlaubt. 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.
Quellcode (engl. Sourcecode)
Code noch nicht fertig!
Listing 1:MinimalesProgramm.ino
#include "MeMCore.h" 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; unsigned long time90degree; 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){ // TODO (nicht-blockierende methode) 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() { led.setColorAt(1, 255, 0, 0); led.setColorAt(0, 255, 0, 0); led.show(); // TODO calibrate 90degree here! } void actionTest() { led.setColorAt(1, 0, 255, 0); // Setze LED-Farbe auf grün led.setColorAt(0, 0, 255, 0); led.show(); static bool doneLeft = false; // Zeigt an, ob die linke Drehung abgeschlossen ist static bool doneRight = false; // Zeigt an, ob die rechte Drehung abgeschlossen ist // Wenn die linke Drehung noch nicht abgeschlossen ist if (!doneLeft) { doneLeft = turn90Degree(true); // Drehung nach links } // Wenn die linke Drehung abgeschlossen ist und die rechte Drehung noch nicht else if (doneLeft && !doneRight) { doneRight = turn90Degree(false); // Drehung nach rechts } // Wenn beide Drehungen abgeschlossen sind, gehe in den "OFF"-Zustand else if (doneLeft && doneRight) { state = STATE_OFF; // Wechsel zu "OFF", wenn Test abgeschlossen ist } } void actionOff() { led.setColorAt(1, 0, 0, 0); led.setColorAt(0, 0, 0, 0); led.show(); motor1.stop(); motor2.stop(); }
Bedienung
Nach dem Start befindet sich der mBot im Ruhezustand. Nachdem er auf der L-Position platziert wurde, kann es losgehen.
⚡ Schritt 1: ▶ Drücken des Tasters → LEDs werden rot
- Die Kalibrierung startet.
- Nach Abschluss der Kalibrierung erlöschen die LEDs.
⚡ Schritt 2: ▶ Erneutes Drücken des Tasters → LEDs werden grün
- Der Testlauf beginnt.
- Nach Abschluss des Testlaufs erlöschen die LEDs.
⚡ Schritt 3: ▶ Nach dem Testlauf kehrt der mBot in den Ruhezustand zurück.
- Der Vorgang kann von vorne gestartet werden.
Vorteile & Nachteile
Vorteil | Nachteil |
---|---|
✅ Automatische Kalibrierung ohne manuelles Anpassen der Drehzeit. | ❌ Erfordert eine FSM-Implementierung. |
✅ Präzisere Drehung durch wiederholte Anpassung. | ❌ Höherer Programmieraufwand. |
✅ Nach der Kalibrierung direkt einsatzbereit. | |
✅ Die Methode blockiert das Programm nicht und lässt sich damit elegant in komplexere Programme integrieren. |