Segway

Vor einigen Jahren versuchte ich mich auch an der Umsetzung eines Segways mittels Arduino. Kern des Programms ist die Bestimmung des aktuellen Neigungswinkel und dann die PID-Regelung zur Motoransteuerung.

Zuerst hatte ich noch versucht, die beiden 250W-Motoren mit zwei selbst gebauten Vollbrücken und Arduino-PWM-Ansteuerung zu regeln. Die Ergebnisse damit waren aber ernüchternd. Deshalb habe ich mir einen komerziellen Motortreiber, den Sabertooth Dual 60A, besorgt. Dieser ist in der Lage, beide Motoren mit bis zu 60A dauerhaft zu befeuern.

Bei der Bestimmung des Neigungswinkels kommt ein sog. Kalman-Filter zum Einsatz. Dieser nutzt die Beschleunigungs- und Winkelgeschwindigkeitswerte und kombiniert beide in idealer Weise. Mittels der Beschleunigungskomponenten in x- und z-Richtung könnte aufgrund der in z-Richtung wirkenden Erdbeschleunigung, der Neigungswinkel eigentlich prinzipiell sehr einfach berechnet werden. Man würde nur den arctan(a_x/a_z) benötigen. Leider beschleunigt aber das Segway auch und dadurch kommt es neben der Erdbeschleunigung noch zu weiteren Beschleunigungskomponenten. Hier kommt das Gyroskop im Sensor vom Typ MPU6050 zum Einsatz. Integriert man die Winkelgeschwindigkeit nach der Zeit t auf, so erhält man den aktuellen Winkel. Zudem ist das Gyroskop unempfindlich auf Beschleunigungen. Dies hört sich sehr gut an, doch leider hat das Gyroskop bzw. die Zeitintegration einen entscheidenden Nachteil. Es kommt nämlich zu einem Drift des mit dem Gyroskop berechneten Winkels mit fortschreitender Zeit, sprich der berechnete Winkel weicht zusehends vom richtigen Wert ab.

Nur eine geschickte Kombination der Werte beider Sensoren, also Beschleunigungen und Winkelgeschwindigkeit, in Form des Kalmanfilters liefert sehr sichere Werte (siehe Excel-Abbildung).

Wie steuert man nun ein Segway? Nun, möchte man etwa nach vorne beschleunigen, so neigt man sich nach vorne. Dies würde eigentlich zu einem nach vorne gerichteten Kippen der Person führen. Durch den entstandenen Neigungswinkel versucht nun das Segway durch Beschleunigung, diesen wieder auf 0 zu bringen. Durch diese Beschleunigung wirkt eine nach hinten gerichtete Trägheitskraft auf die fahrende Person. Dieses durch die Beschleunigung nach hinten wirkende Drehmoment und das durch die Neigung nach vorne wirkende Drehmoment heben sich genau auf.

Möchte man bremsen, so neigt sich der Fahrer nach hinten und das Segway stellt sich ein wenig auf. Dadurch kommt es zu einem nach hinten wirkenden Drehmoment, welches sich mit dem Trägheitsdrehmoment nach vorne wieder genau aufhebt.

Die Kosten des gesamten Segways belaufen sich auf rund 500 Euro, wobei der Sabertooth Motortreiber mit gut 130 Euro die teuerste Einzelausgabe war. Gelenkt wird mittels zweier am Lenker befestigter Taster. An der Lenkstange befindet sich auch die Box mit den 3 PID-Reglern.

Zur Spannungsversorgung dienen zwei 12V Bleiakkus mit jeweils 12 Ah. Wie man im Video erkennen kann, sind die beiden 250W Motoren noch etwas zu schwach. Dies führt zu einem eher wackeligen Fahrverhalten. Aushilfe sollen daher 2 Stück 500W Elektromotoren verschaffen, die jedoch erst noch besorgt werden müssen.

 


Arduino-Code und Dateien:

Sabertooth 60A simplifiedArduinoLibrary

SabertoothArduinoLibraries