HaBuRo6 Framework, Quelle Github

Zurück

Das ESP32 Wifi Balancing Robot Framework besteht aus drei Software-Modulen.

PD/PI-Regler: Control.cpp & Control.h.
Sechsachsiger Bewegungssensor, Gyroskop und Beschleunigung: MPU6050.cpp & MPU6050.h.
Steuerung für zwei Schrittmotoren: Motors.cpp & Motors.h & Timers.cpp.

Die Software ist aus meiner Sicht gut kommentiert und strukturiert. Ein- und Ausgänge des ESP32 und alle Basisparameter werden in der Datei defines.h definiert. Deklaration der Variablen erfolgt in der Datei global.cpp. global.h (Deklaration extern) sorgt für die Zugänglichkeit der Variablen in den einzelnen Software Modulen.

Der Roboter wird ferngesteuert. Die Firma Bluino Electronics stellt eine Applikation für das Betriebssystem Android zur Verfügung. Google Play Store sorgt für die Installation. Details zur Bluino-App findest du hier.

Visual Studio Code mit der Extension PlatformIO ist meine Entwicklungsumgebung (IDE). Das hat zur Folge, dass der Inhalt der Datei: esp32_wifi_balancing_robot.ino in eine neue Datei main.cpp transferiert werden muss.

Das ESP32 Wifi Balancing Robot Framework wurde im Kern vom Spanier Jose Julio (EVO2, Jahr 2017) entwickelt. Seine Webseite „jjrobots.com“ ist noch als Webadresse vorhanden, jedoch wirst du zu einer merkwürdigen Seite geleitet. Suche nicht danach.

Im Jahr 2024 habe ich den HaBuRo3 gebaut. Der PID-Regler erhält als Eingangsgröße den Winkel vom MPU6050 Sensor. Die Ausgangsgröße des Reglers ist die Geschwindigkeit der Motoren. Für die Balancierung ok jedoch für die Fortbewegung war das Ergebnis nicht so gut. Eine wirkliche Verbesserung ist die Software von Jose Julio. Eine PD-Steuerung für die Balancierung und eine zusätzliche PI- Geschwindigkeitsregelung. Quasi eine Kaskadenregelung! Für den HaBuRo3 wurde eine Regler-Bibliothek eingesetzt. Auch kein guter Weg! Jose Julio bildet aus dem MPU6050 Steueralgorithmus und den zwei PD/PI-Reglern einen gemeinsamen Zeittrigger [dt]! Die verwendeten Motoren sind Schrittmotoren vom Typ NEMA17 mit A4988-Treibern und 1/8 Mikroschritten. Wobei hier die Positionierung der Schrittmotoren keine Rolle spielt. Eine präzise Geschwindigkeitsregelung mittels Interrupts (25 kHz) ist die Lösung!



HaBuRo6 Framework


Downloade ESP32 Wifi Balancing Robot Framework von GitHub und integriere es in die Visual Studio Code Entwicklungsumgebung mit der Extension PlatformIO. Starte den Compiler. Die Kompilierung bricht mit Warnungen und einer Fehlermeldung ab, weil der jetzige Compiler eine strengerer Typenprüfung vornimmt und die Software aus dem Jahr 2017 nicht den heutigen Standard entspricht. Wir müssen einige Dinge korrigieren.

Fehler: processOSCMsg was not declared in this scope.
Es fehlt die Deklaration für diese Funktion. Zwei Möglichkeiten gibt es, diesen Fehler zu beheben: Die Funktion processOSCMsg() in den Zeilen 401 bis 486 vor der void loop(), Zeile 272, platzieren.
Der bessere Weg! Die Funktion in Zeile 38 zu deklarieren:void processOSCMsg(void);.

Die Warnungen in der Datei MPU6050.h beheben:
typedef union accel_t_gyro_union in Zeile 434 ändern in union accel_t_gyro_union!

Doppelt definiert: MPU6050_AUX_VDDIO. Beheben: Zeile 16 in der Datei MPU6050.h auf Kommentar setzen: //#define MPU6050_AUX_VDDIO 0x001.

Doppelt definiert: MPU6050_FIFO_EN. Beheben: Zeile 27 in der Datei MPU6050.h auf Kommentar setzen: //#define MPU6050_FIFO_EN 0x023.

MPU6050.cpp Zeile 236: Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true) ändern in Wire.requestFrom(MPU6050_I2C_ADDRESS, size, 1)

Bevor wir den ESP32 Mikrocontroller betanken müssen wir noch zwei Parameter für das WiFi-Netzwerk eingeben. In Zeile 40 musst du die SSID (Service Set Identifier) eingeben. SSID ist der Name deines WLAN-Netzwerks. Nichts geht ohne Passwort! Auch bei deinem WLAN-Netzwerk. Das Passwort wird in Zeile 41 eingetragen.



Die wichtigsten Software Module genauer untersuchen!

Wenn die acht Euro teure Steuerplatine bestückt ist, dann macht es Sinn einzelne Module vorher zu testen. Die nachfolgenden Bilder veranschaulichen, wie ich die Hard- und Software im Vorfeld getestet habe.


HaBuRo6 Test Stepper


Das obige Bild zeigt die Software für den Test der zwei Schrittmotoren. Wie bereits erwähnt geht es nicht um Positionierung, sondern um das Regeln der Geschwindigkeit. Montiere bei diesem Test auch die Räder! Verändere den Speed in Zeile 60/61. Man kann ganz schnell herausfinden bei welcher Geschwindigkeit die Motoren kein Drehmoment mehr liefern, die vom Motortreiber A4988 gelieferten Impulse vom Stepper verschluckt werden und vieles mehr. Messe auch den Strom. Weiterhin ist jetzt auch die Gelegenheit für die zwei Motortreiber A4988 den Strom einzustellen. Im Netz gibt es darüber viele Beispiele. Wenn alles funktioniert dann sorge dafür, dass die Motoren die richte Drehrichtung haben. Vorwärtsfahrt entspricht Drehen im Uhrzeigersinn. Dafür habe ich die Funktion void mov2(void), Zeile 46 bis 57 gefrickelt. Hinweis: In der Datei define.h Zeile 61 ist ein sehr wichtiger Parameter: MAX_ACCEL. Spiele damit!

HaBuRo6 Test MPU6050


Sechsachsiger Bewegungssensor, Gyroskop und Beschleunigung MPU6050 unter die Lupe nehmen. Getestet wird hier die Kalibrierung und ist der Neigungswinkel (Pitch, hier nicht x sondern y) plausibel wenn du die Testvorrichtung bewegst. Folgendes Ergebnis muss du erzielen: Positiver Neigungswinkel und Drehrichtung der Motoren im Uhrzeigersinn. Negativer Neigungswinkel und Drehrichtung der Motoren gegen den Uhrzeigersinn.

HaBuRo6 Test Servo


Hier wird das Servo getestet. Hinweis: Nach dem Einschalten des Roboters richtet sich der Roboter selbstständig auf. Das Servo hat keinen Anteil an diesem Prozess!!



Was macht das ESP32 Wifi Balancing Robot Framework?

Eine kurze Beschreibung.



Diese kurze Beschreibung bezieht sich mit den Zeilennummern auf das originale Projekt Bluino von GitHub Du musst es dir irgendwo archivieren, weil ja das Framework jederzeit geändert werden kann. Ansonsten hast du keinen korrekten Bezugspunkt zu den Zeilen!


Der Roboter wird auf den Boden gelegt (Augen zum Boden) und der Einschalter wird betätigt.
Die Funktion setup(), Start Zeile 59, main.cpp.
Das Servo fährt in die Grundstellung, Zeile 88, main.cpp.

Der MPU6050 Sensor wird initialisiert, Zeile 47 bis 51 und Zeile 91, main.cpp. Der Zustand der MPU6050-Initialisierung wird über den Print-Monitor angezeigt. Zeile 100 bis 110, MPU6050.cpp (WHO_AM_I und error).

Danach wird der MPU6050 Sensor kalibriert, Zeile 50, main.cpp und Zeile 60 bis 98, MPU6050.cpp. Der Print-Monitor visualisiert Gyro calibration... DONT MOVE!

Der ESP32 kontaktiert das WiFi-Netzwerk, Zeile 93 bis 141, main.cpp. Der Print-Monitor visualisiert die IP-Adresse, in meinem Fall 192.168.188.78. Bei Verbindungserfolg leuchtet die boardeigene ESP32-LED (blau).

Es folgt die eventgesteuerte Anforderung GET REQUEST für alle Kommandos, die die Android-Bluino-App bereitstellen muss, Zeile 144 bis 246, main.cpp. Alle Kommandos der Android-Bluino-App werden über den Print-Monitor visualisiert, Zeile 241 – finde ich sehr hilfreich! Beachte: Es ist ein ereignisgesteuerter Prozess der Bibliothek ESPAsyncWebServer.

Jetzt kommen die zwei Stepper ins Spiel. Timerinterrupt wird initialisiert, Zeile 248, main.cpp. Der Roboter liegt immer noch auf dem Boden. Jetzt passieren zwei Dinge: Die Motoren und das Servo zappeln kurz vor und zurück. Zeile 256 bis 267.

Ende Funktion setup(), Zeile 270, main.cpp
Start der Funktion loop(), Zeile 272, main.cpp.

Kommen Kommandos von der Android-Bluino-App? Zeile 275 bis 278, main.cpp.

Daten vom MPU6050 Sensor werden gelesen und mit einem Zeittrigger [dt] verbunden, Zeile 280 und 282, main.cpp. In den Zeilen 290 bis 296 wird der Winkel in die Variable angle_adjusted gespeichert. Diese Variable wird dem PD-Regler als Istwert übergeben, Zeile 327. Weil der Robert immer noch in nahezu (23°) waagerechter Position auf dem Boden liegt, und damit der Winkel größer 56° ist erfolgt jetzt die Abarbeitung in Zeile 387 bis 393. Die zwei Regler erhalten spezielle Parameter und der Roboter richtet sich auf. Nun steht er in senkrechter Position! Dadurch werden die zwei Regler erneut mit user-Werten betankt, Zeile 382 bis 386!

Der Roboter ist in senkrechter Position und wird in Balance gehalten. Ruhig steht er nicht, er tänzelt leicht hin und her. Softwaretechnisch passiert das in den Zeilen 327 bis 350. Die Reaktion auf Fahr- und Kurvenbefehle, Funktion processOSCMsg() werden in diesem Kapitel etwas erläutert.



HaBuRo6 Debugger_Info


Die Beschreibung des Roboters ist parallel zum Bau entstanden. Nach einigen Wochen habe ich den Datenstrom zwischen Roboter und der Android-App genauer unter die Lupe genommen. Siehe obiges Bild. Ich möchte die Fernsteuerung auf Bluetooth umstellen, weil ich kein Android (Samsung) Mobilphone habe und ich kann nicht ständig das Handy meiner Frau benutzen. Das geht gar nicht! Zuerst möchte ich es mit der Bibliothek RemoteXY versuchen und später eine eigene Fernsteuerung zusammenstricken.



Zurück