Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose17:b4lpublic:start

Projektdokumentation Balance Bot

Idee

inverses Pendel Die Idee des Roboters basiert auf einem Inversen Pendel. Bei einem inversen Pendel liegt der Schwerpunkt weit über der Achse, dies sorgt für eine instabile Ruhelage des oberen Endes. Mit Bewegungen des Pendels am unteren Ende soll die Kippbewegung ausgeglichen werden. Diese Art eines Pendels lässt sich eigentlich leicht mithilfe der Regelungstechnik ausbalancieren. Dieses Prinzip kennt man zum Beispiel, wenn man versucht, einen Besen umgedreht auf der Hand zu balancieren oder auch von einem Segway. Uns kam die Idee so etwas mit einem Arduino und einem Gyrosensor (misst Drehbewegungen) umzusetzen. Am Ende sollte ein Roboter entstehen, der nur mit einer Achse auskommt, problemlos stehen und balancieren kann.


Umsetzung

Verwendete Materialien

  • 2 x Holzplatten
  • 4 x M5 Gewindestangen
  • 16 x M5 Muttern
  • Breadboard
  • 2 x Räder
  • 2 x Radnaben
  • 2 x Motorhalterung
  • 2 x 50:1 Metal Gearmotor 37Dx54L mm with 64 CPR Encoder (No End Cap)
  • 16 x M3 Schrauben
  • 8 x M3 Muttern
  • Arduino Nano
  • 3 x Potentiometer
  • MPU-6050 Sensor
  • Dual MC33926 Motor Driver Carrier
  • Kabel
  • An-/Ausschalter
  • Lipo Akku
  • Akkuwächter

Verwendete Software und Bibliotheken

Software

  • Arduino IDE

Bibliotheken

  • Wire - vorinstalliert
  • MPU6050 - ist auch in der zip-Datei unten enthalten
  • I2Cdev - ist auch in der zip-Datei unten enthalten
  • PID - Kann über die Arduino Bibliotheksverwaltung hinzugefügt werden

Konstruktion

Das Gestell des Roboters trägt alle wichtigen Komponenten und bildet das inverse Pendel. Die Konstruktion wurde mit niedriger Komplexität aber mit einer gewissen robustheit konstruiert. Der Haupteil des Roboters besteht aus vier M5 Gewindestangen. Am oberen und unteren Ende der Gewindestangen sind Bretter mit Muttern befestigt. Somit lässt sich, falls notwendig, die höhe des Roboters leicht verändern. Am unteren Brett sind zwei Motorhalterungen mit M3 Schrauben und Muttern befestigt. Die Motoren sind ebenfalls mit M3 schrauben an den Halterungen befestigt. Die Radnaben wurden mit Gewindestiften auf der Motorwelle gesichert. Die Pololu Räder mit einem 90 mm Durchmesser sind an der Radnabe mit M3 Schrauben verschraubt. Auf der oberen Seite des unteren Bretts ist der Akku und der dazugehörige Akku-Wächter mit einem Klettverschluss befestigt. Das Oberteil des Roboters hat das Breadboard mit den elektronischen Komponenten darauf montiert. Das Breadboard ist mit Kabelbinder und Klettverschlüssen am Brett angebracht. Der Sensor muss so befestigt werden, dass er nicht wackel kann. Das Breadboard ist mit vier wichtigen Komponenten ausgestattet:

  • Arduino Nano
  • MPU-6050 Gyrosensor und Beschleunigungssensor
  • Dual MC33926 Motor Driver Carrier
  • 3 Potentiometer

3D-Modell von der Seite 3D-Modell von vorne 3D-Modell von oben 3D-Modell von unten

Schaltplan

Der von uns benutzte Akku lieferte 7,4 Volt, die Motoren können mit bis zu 12 Volt betrieben werden. Es wird mit zwei unterschiedlichen Spannungen gearbeitet an der unteren Leiste der Steckplatine herrscht eine Spannung von 7,4 Volt. Diese kommen von unserem Akku, gehen dann zum Arduino und direkt zu der Motorsteuerung. An der oberen Leiste sind es 5 Volt die vom Arduino ausgehen. Diese 5 Volt werden vom Sensor, der Motorsteuerung und den Potentiometern benötigt, da dies die übliche Spannung ist, die von einem Arduino verwendet wird. Der Motortreiber wird über Digitalpins bzw. PWM-Pins angesprochen. Die Werte der Potentiometer werden analog ausgelesen. Die Gyrosensorwerte werden mit dem I2C-Bus übertragen. Deswegen muss der Sensor mit dem SCL und SDA Pin des Arduinos verbunden werden. Außerdem muss der interrupt pin vom Sensor mit einem Digitalpin verbunden werden.

Schaltplan

Pinbelegung

Bauteil Funktion Pin
Gyrosensor SCL (Signal Clock) A5
Gyrosensor SDA (Signal Data) A4
Gyrosensor INT (interrupt pin) D2
Motortreiber Motor 1, Richtung D6
Motortreiber Motor 1, Geschwindigkeit per PWM-Signal D3
Motortreiber Motor 2, Richtung D4
Motortreiber Motor 2, Geschwindigkeit per PWM-Signal D5
Potentiometer Justierung Kp A1
Potentiometer Justierung Ki A2
Potentiometer Justierung Kd A3

Sensorwerte

Der Sensor übermittelt konstant sechs Werte. Drei der Werte kommen von dem Gyrosensor und drei von dem Beschleunigungssensor. Die drei Werte sind jeweils die zugehörigen Werte um die x-, y- und z-Achse. Da der Roboter bedingt durch seine Konstruktion sich nur um eine Achse bewegt, sind nur 2 Werte für uns interessant. Bei uns war das, ein mal der Gyrosensorwert um die y-Achse, dieser Wert gibt die Winkelgeschwindigkeit an. Andererseits der Beschleungungswert in x-Richtung. Mit jeweils einem der beiden Werten könnte man den Winkel des Roboters bestimmen aber das wäre sehr ungenau und der ausgegeben Winkel wird vom echten Winkel schon nach kurzer Zeit abdriften. Um eine genauen Winkel zu bestimmen muss man beide Werte kombinieren. Da für gibt es zwei Möglichkeiten. Erstens der Complementary filter, der nur aus einer kurzen Mathematischenformel besteht und sich recht einfach in der Arduino IDE umsetzen lässt.
Die Formel lautet: Winkel = 0,98 * (Winkel + Gyro * dt) + 0,02 * Beschleunigung

Zweitens, um es etwas genauer zu bekommen, kann man den Kalman-Filter von Kristian Lauszus verwenden, wofür es auch eine Arduino Bibliothek gibt. Dieser Filter ist wesentlich komplexer und lässt sich ohne Kenntnis höhrer Mathematik nicht erklären.
Wir haben für unseren Roboter beide Varianten ausprobiert und beides ergab gute Werte. Am Ende haben wir uns dann aber für die I2C Device Bibliothek entschieden, die sehr genau den Winkel ausgibt.

Regelungstechnik

Das Herzstück des Roboters ist die Regelungstechnik. Hiermit soll der Roboter immer wieder in die instabile Ruhelage gebracht werden. Um das System zu regeln, muss ein Regelkreis aufgestellt werden. Daher muss die Ausgangsgröße überwacht werden und bei einer Abweichung über eine Stellgröße korrigiert werden. Regelkreis Das Messen findet über den Sensor statt, die Werte des Sensors sind in eine Winkellage umgerechnet. Die Ruhelage, der Sollwert ist die 0° Position. Dieser Wert wird mit dem Gemessenen verglichen. Die resultierende Differenz beider Werte ist die Regelabweichung. Falls es zu einer Abweichung kommt, wird die Stellgröße bestimmt um den Roboter wieder in die Ruhelage zu bringen. Dieser Vorgang wird , so lange der Roboter an ist, wiederholt.

Regler Begriffe

Der Regelkreis des Roboters besteht aus drei Hauptgliedern: der Regler selbst, das Messglied und die Regelstrecke. Die Implementierung des Regelkreises erfordert mehrere aber wichtige Variablen.Regelstrecke Die Führungsgröße w, unserer Sollwert, ist die instabile Ruhelage 0°. Die Regelgröße x ist der aktuelle Wert, die Istgröße. Mit diesen beiden wird die Regelabweichung gebildet, e=w-x. Der Regler errechnet die Stellgröße y, die steuernde Wirkung des Reglers auf den Roboter. Die Störgröße z sind von außen wirkende Größen. Diese verändern den Istwert und lösen einen Regelvorgang aus.

PID-Regler

Der Roboter nutzt einen PID-Regler, dieser kombiniert drei unterschiedliche Reglertypen. Der P-Anteil ist das proportionale Glied, die Regelabweichung wird mit dem Verstärkungsfaktor Kp multipliziert. Der I-Anteil ist das integral Glied, dieser summiert die Regelabweichung über einen festgelegten Zeitraum, die Abtastzeit und multipliziert diesen mal dem Verstärkungsfaktor Ki. Der D-Anteil differenziert die Regelabweichung über die Abtastzeit, so wird die Änderungsgeschwindigkeit berechnet, diese wird mit Kd multipliziert. Der PID-Regler vereinigt alle Vorteile der verschiedenen Regler-Anteile und ist somit genau und schnell.PID-FormelPID-Aufbau

Umsetzung in Code

Die Implementierung des PID-Reglers in Code wird mithilfe der PID Bibliothek von Brett Beauregard umgesetzt. Daher muss diese erst über die Arduino IDE heruntergeladen und installiert werden. Außerdem nutzen wir die vorinstallierte Wire Bibliothek, um die Sensorwerte an den Arduino zu übertragen. Um die Methoden der Klasse PID nutzen zu können, muss nun die Bibliothek mit #include <PID_v1.h> in unser Programm eingefügt werden. Nachdem wir unsere Variablen festgelegt haben werden diese mit der PID() Methode initialisiert. Da unsere Motoren auf die Werte 0-255 beschränkt sind, benutzen wir die SetOutputLimits() Methode, um den Output genau auf das Intervall der Motoren zu beschränken. Die SetSampleTime() setzt unsere Abtastzeit in Millisekunden fest. Wir haben uns, nach Messungen der Schleifen Dauer, auf 10 ms geeinigt. Die SetTunings() Methode wird in der Loop Funktion aufgerufen, hiermit ist es möglich die Verstärkungsfaktoren (Kp, Ki, Kd) im Betrieb einzustellen. Die Compute() Funktion wird ebenfalls in der Loop aufgerufen und berechnet den Aktuellen Output Wert, falls die festgelegte Abtastzeit vergangen ist. In der Testphase ist uns bewusst geworden, dass das Einstellen der Verstärkungsfaktoren über die Arduino IDE sehr unpraktisch ist. Daher haben wir die Potentiometer am breadboard angebracht, um die Parameter durch das Verstellen der Widerstände anzupassen. Das war ein großer Vorteil in unserer suche nach den optimalen Verstärkungsfaktoren. Die Faktoren lassen sich mit einem Schraubendreher im Betrieb verändern. PID-Potentiometer

Dimensionierung des PID-Reglers

Bei der Einstellung des PID-Reglers gibt es verschiedene Verfahren, Methoden oder Einstellregeln. Wir haben uns für das Empirische Einstellen entschieden, da bei den anderen Verfahren Simulation Kenntnisse oder tieferes Verständnis der Regelungstechnik benötigt wird. Auch in der industriellen Praxis werden Regelkreise häufig ohne Verwendung eines Modelles durch Ausprobieren von Reglereinstellungen realisiert. Die Einzige Voraussetzung für dieses Verfahren ist, dass bei der Einstellung ein instabiles Verhalten keine Schäden verursachen kann.

Da wir noch keine praktische Erfahrungswerte für einen PID-Regler besitzen, haben wird alle Parameter zuerst auf null gedreht. Nun wird der P-Anteil langsam aufgedreht, bis der Roboter anfängt zu oszillieren. Nun wird allmählich der I-Anteil hinzugeschaltet. Es muss solange probiert werden bis das Ergebnis einigermaßen zufrieden stellend ist. Um die Regelung stabiler und flüssiger wirken zu lassen kann noch ein minimaler D-Anteil dazugegeben werden. Der D-Anteil sorg dafür das die Ausgleichsbewegungen gedämpft werden. Nach einiger Zeit bekommt man für die Regelparameter und das System ein sehr gutes Gefühl und man ist in der Lage mit probieren gute Ergebnisse zu erzielen. Für unser Roboter haben wird folgende Verstärkungsfaktoren ermittelt:

  • Kp = 60
  • Ki = 51
  • Kd = 1

Wenn die optimalen Verstärkungsfaktoren ermittelt sind, dann wird der Output des PID-Reglers sehr klein. Das bedeutet der Roboter macht nur kleine Ausgleichsbewegungen und bleibt somit auch immer sehr nahe in seinem instabilen Schwerpunkt. In der Abbildung ist der Output Wert des Regler gegenüber der Zeit dargestellt. Der Output beträgt maximal ca. 40 und schwingt leicht hin und her.

Winkel-Output-Plot

Wir haben es auch einmal mit dem Fausformelverfahren von Ziegler und Nichols versucht. Für dieses Verfahren muss man erst mal Kp,krit und Tkrit bestimmen. Kp,krit ist der Kp-Wert ab dem der Roboter oszilliert. Das ist aber auch die Herausforderung, da man schwer sagen kann wann genau dieser Punkt eintritt. Tkrit ist dann die Periodendauer der Schwingung. Wenn man aber Kp,krit und Tkrit bestimmt hat lässt sich leicht Kp, Ki und Kd bestimmen.

Kp = 0,5 * Kpkrit
Ki = Kp / (0,5 * Tkrit)
Kd = Kp * 0,12 * Tkrit

Um Tkrit zu bestimmen haben den Winkel (blau) und den Output (Rot) des PID-Reglers in der Arduino IDE mit dem Seriellem Plotter geplottet. Die einzelnen Perioden haben wir mit kurzen blauen Strichen gekennzeichnet. Leider sind Achsenbeschriftungen (hier aber auch nicht so relevant) im Seriellen Plotter ziemlich klein. Zum vergrößern bitte einmal auf das Bild klicken.

kritischer Winkel-Output-Plot

Leider war das Ergebnis von dem Verfahren nicht zufriedenstellend und wir sind dann wieder zum empirischen Verfahren übergegangen, was sich sehr flexibel über die Potentiometer einstellen lässt.

Code

Befor der Code für den Roboter genutzt werden kann, muss der Sensor kalibriert werden. Der Roboter muss in seinem Schwerpunkt aufgestellt werden und das Imu_zero Programm gestartet werden. imu_zero.zip Dabei muss der Sensor in Ruhe bleiben. Nach ca. einer Minute können die ermittelten Offsets am Serial Monitor abgelesen werden und in unser Hauptprogramm eingefügt werden. balancebot.zip
Die zwei Bibliotheken aus der zip-Datei müssen in den entsprechenden Arduinoprogrammordner verschoben werden. Unter Windows z. B.: C:\Program Files (x86)\Arduino\libraries. Außerdem muss die PID-Bibliothek aus der Bibliotheksverwaltung installiert sein.

Probleme und Lösungen

Die Motoren, die wir benutzt haben sind nicht sonderlich schnell. Deswegen darf der Roboter beim balancieren nicht sehr weit auslenken und muss sehr schnell und präzise agieren. Dafür ist es besser das Gyroskop möglichst weit nach unten zu verlegen, da es auch einen Beschleunigungssensor hat. Das Problem dabei ist, dass die Motoren ein Magnetfeld erzeugen, welches die Messwerte erheblich stört (War Problem bei dem MinIMU-9 v2 Gyro nicht bei dem MPU6050). Nach Austausch der Gyrosensoren, wegen einem Kurzschluss, haben wir den neuen Sensor am oberen Brett gelassen. Dennoch ist es uns gelungen gute PID Werte zu ermitteln, und den Roboter über 15 min lang balancieren zu lassen. Den Sensor auf das untere Brett zu montieren, würde die gemessenen Werte optimieren.

Beim Einstellen der PID Werte ist uns aufgefallen das die Werte im Betrieb nicht konstant sind. Wenn Werte eingestellt werden und die Motoren sind ausgeschaltet, bleiben diese konstant (Bild links). Schaltet man nun die Motoren an, schwanken sie minimal (Bild rechts). Dies hat uns allerdings nicht beeinflusst bei der Ermittlung der PID Faktoren.

PID-Werte nicht schwankend PID-Werte schwankend

Beim Anschalten des Roboters, braucht der Sensor ca. 4 Sekunden um sich auf seine eingestellten Offsets zu kalibrieren (egal wie man ihn hält). Angenommen man hält den Roboter im Schwerpunkt und schaltet ihn an, dann würden sich die Motoren am Anfang sehr schnell drehen und in 4 Sekunden Abklingen auf null, dann ist er startbereit.

Startvorgang

Endergebnis

Fertiger Roboter von der Seite Fertiger Roboter von oben

Der Roboter ist in der Lage problemlos längere Zeiten zu balancieren. Das Längste was wir versucht haben war 15 Minuten, es würde wahrscheinlich auch noch länger gehen. Er ist aber nicht besonders stabil beim balancieren, wenn man ihn anstößt kippt er schnell um. Dies liegt daran das die Motoren keine hohe Beschleunigung haben und bei über acht Grad Auslenkung die Kippbewegung nicht mehr ausgeglichen werden kann. Auch bei anderen Untergründen wie ein glatter Tisch, macht er Probleme. Hier liegt es wohl daran das die PID-Werte anders bzw. genauer eingestellt werden müssen. Wir haben den Roboter nur auf dem Teppichboden vom Laborraum fahren. Ein glatter Untergrund macht das Balancieren anscheinend etwas Anspruchsvoller.

Ausblick

Das Projekt ist für uns beendet aber es gibt noch viele weitere Herausforderungen die man angehen könnte. Der Roboter balanciert, aber gegen Einwirkungen von aussen ist er nicht sicher. Wir denken man bräuchte allerdings andere Motoren die eine Höhere Beschleunigung haben um Stöße von der Seite wieder ausgleichen zu können. Eine weitere Hürde wäre das der Roboter schrägen überwindet, also Bergauf und Bergab. Automatische Gleichgewichts Anpassung, wenn z.B. Gegenstände am Roboter angebracht oder daraufgestellt werden. Am ende wäre noch Bluetooth-Modul Ausstattung, um die Steuerung per Smartphone zu realisieren sehr anspruchsvoll. Es gibt also noch einiges an Verbesserungen die man noch nachgehen könnte.

projektesose17/b4lpublic/start.txt · Zuletzt geändert: 2017/10/09 14:50 von c.jaedicke