Self-Balancing Cube

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche

Dieses Projekt behandelt die Eigenkonstruktion eines, mit einem 3D-Drucker erstellten Würfel, welcher sich über Sensoren und einer Regelschleife selber balanciert. Das Projekt lief an der Hochschule Ruhr-West im Rahmen des Moduls Hardwarenahe Programmierung betreut von Prof. Dr. Michael Schäfer.

SBC Gesamt Vorne.jpg
SBC Grundgeruest mit Teilen.jpg

Idee & Umsetzungsplanung[Bearbeiten]

Nach einer anfänglicher Findungsphase bei den Projektbeispielen hat sich unsere Gruppe auf die Umsetzung eines selbst balanciernden Würfels geeinigt. Inspiration holten wir uns von zahlreichen Eigenkonstruktionen aus dem Internet mit dem prominensten Beispiel des Cubli. [1]

Zu Beginn planten wir einen ca. 12-14cm großen Würfel aus Kunststoff zu fertigen. Dieser sollte, die Hardware ausgenommen, mithilfe eines 3D-Druckers entstehen. Mithilfe eines Schwungrads, welches sich im Inneren des Würfels befindet, soll dieser ausbalanciert werden. Dies soll mit einem Regelalgorithmus geschehen, welcher auf einem Mikrocontroller läuft und Sensorik, sowie Aktorik kontrolliert.

Generell hat sich im Laufe des Projektes besonders die Corona-Krise als deutliche Einschränkung gezeigt. Nicht nur, dass das hochschulinterne FabLab nicht normal nutzbar ist, zudem fand parallel der Umzug des FabLabs in neue Räumlichkeiten statt, welcher die Nutzung bestimmter Geräte nicht möglich machte. Zudem musste bei den Bestellungen der Hardwareteile mit Verzögerungen gerechnet werden, die zusätzlich durch den plötzliche Wintereinbruch verzögert worden sind. Die gemeinsame Zusammenarbeit an der Hardware war ebenfalls deutlich eingeschränkt und sämtliche Treffen haben rein digital stattgefunden. Bezüglich der Hardware stellte sich heraus, dass Datenblätter von den Herstellern nicht immer akkurat gepflegt sind, sodass Bauteile (besonders auf den Motor bezogen) teilweise nicht mit absoluter Sicherheit über die Kompatibilität bestellt wurden, oder bei bereits vorhandener Hardware diese nicht sichergestellt war. Unter weitere Ansätze sind unsere Versuche aufgelistet und kurz dargestellt, um den Verlauf des Projektes und Rückschläge bzw. Herausforderungen zu zeigen.

Im Folgenden werden die Funktionwesie, die Bauteile, der Zusammenbau, als auch die Programmierung vorgestellt.

Funktionsweise[Bearbeiten]

Programmablaufplan

Der Self-Balancing Cube ist eine Art eines inversen Pendel. Dies ist ein Pendel mit dem Schwerpunkt oberhalb der Achse auf der es befestigt ist. Das Pendel befindet sich in seinem höchsten Punkt in einer instabilen Ruhelage und ist eine der Standardaufgaben der Regelungstechnik für die Stabilisierung einer instabilen Regelstrecke. [2] Bei unserem Würfel wird durch gezieltes Ansteuern des Motors und der daraus resultierenden Kraft die Balance gehalten. Der grobe Programmablaufplan ist auf der rechten Seite zu sehen.


Bauplan und Bauteile[Bearbeiten]

  • Material
    • Kabelbinder
    • Lötzinn
    • Stahlstifte
    • Klebeband (Powerstrip)
    • Schrauben (Zylinderkopf M6x10 8 Stk., Standard M3x9 6 Stk. + Muttern, Standard M3x6 3 Stk., Standard M8x45 1 Stk.)

Motor und Motorsteuerung[Bearbeiten]

Der verwendete Motor ist ein iPower GBM4108H-120T Gimbal Motor. Dieser verfügt über ein gutes Drehmoment aber dafür über eine geringe maximale Drehzahl. Der verwendete Encoder ist ein AMT103-V. Er dient zur Bestimmung der Rotorposition und der Drehgeschwindigkeit des Motors. Der verwendete Controller ist ein SimpleFOCShield, dieser benötigt einen Encoder um Motorwinkel und -geschwindigkeit zu erhalten. Diese sind notwendig, damit der Kontrollalgorithmus den Würfel balancieren kann.

Mikrocontroller[Bearbeiten]

Modell des Mikrocontroller Nucleo

Der verwendete Mikrocontroller ist ein Nucleo F411RE. Dieser wurde für seine gute Prozessortaktrate und seinen großen Programmspeicherplatz der die Mindestanforderung von 49.704 Bytes erfüllt. Zusätzlich sollte ein Arduino Uno Header vorhanden sein um ein Standard Arduino Shield montieren zu können.


Inertial Measurement Unit (IMU)[Bearbeiten]

Die verwendete IMU ist eine GY-521 mit einem MPU6050 Chip. Diese wurde für die Winkelbestimmung relativ zur Erde verwendet. Hierbei ist besonders auf ein kurzes Kabel der I2C Pins zum Mikrocontroller zu achten, da ansonsten Verbindungsprobleme entstehen können, die das gesamte Programm in einen Deadlock zwingen.

Grundgerüst[Bearbeiten]

Modell des Grundgerüst

Das Grundgerüst besteht aus zwei Basisplatten (17x17cm) auf denen der offene Würfel stehen kann. Diese sind durch drei Innenwände (16x8,1cm) miteinander verbunden die gesteckt werden und durch Bolzen ggf. zusätzlich gesichert werden können. Auf diesen werden die weiteren Bauteile wie Motor, Mikrocontroller, IMU, Akku sowie Schwungrad montiert bzw. geklebt. Für den Mikrokontroller sind extra Bolzen angebracht (vorne rechts) und für den Motor(-Controller) sind Aussparungen vorhanden (vorne links).


Schwungrad[Bearbeiten]

Modell des Schwungrad

Das Schwungrad hat einen Durchmesser von 14cm und ist mit 8 Löchern für M6x10 Schrauben ausgestattet. Diese erhöhen das Gewicht des Schwungrad bzw. die Schwungmasse am äußeren Rand.


Stromversorgung[Bearbeiten]

Die Stromversorgung wird durch eine Lithium-Polymer-Akkumulator mit 1500mAh Speicherkapazität, 11.1V Spannung und 40C gewährleistet. Um Die Anforderungen an die Batterie bzgl. Spannung und Gewicht gering zu halten wird ein DCDC-Wandler verwendet. Dieser wandelt auf 20V Spannung mit bis zu 2A Strom.

Zusammenbau[Bearbeiten]

Verlötung des Controller Board
DIP Switch Konfiguration

Vorraussetzung für das Befolgen dieses Abschnittes ist der erfolgreiche 3D-Druck der Bauteile und das Verlöten des Controllerboards (siehe rechts oben).

  • Ablauf
    • Innenwand Motor
      • Zylinderkopfschrauben M6x10 in Schwungrad drehen
      • Motor auf Innenwandboard mit zwei M3x9 Schrauben und dazugehörigen Muttern befestigen
      • Schwungrad auf Motor mit restlichen vier M3x9 Schrauben mit Unterlegscheiben festschrauben
      • M8x45 Schraube durch Schwungrad und Hohlschaft des Motors schieben
      • DIP Switch im Encoder auf 1010 stellen (siehe rechts unten)
      • Encoder auf der Rückseite des Motors mit durchgesteckter Schraube ankleben
    • Innenwand Board
      • Board Bolzen in Innenwandboard stecken
      • Mikrocontroller mit drei M3x6 Schrauben befestigen
      • Controllerboard auf Mikrocontroller stecken
      • IMU auf Controllerboard stecken (PINs: SCL und SDA)
    • Innenwand
      • Akku an Innenwand ankleben
      • DCDC-Wandler mit Kabelbindern befestigen
    • Innenwände zwischen die beiden Basisplatten stecken und ggf. zusätzlich mit Metallstiften sichern
    • Verkabelung gemäß nächstem Abschnitt

Verkabelung[Bearbeiten]

Die Verkabelung erfolgt wie in der Bildergalerie zu sehen ist. Ein Hauptschalter kann optional zwischen DCDC-Wandler und Akku gelötet werden.

Programmierung[Bearbeiten]

Für die Programmierung wurde die Arduino-FOC Bibliothek [3] zur Steuerung des Motors und zum Erhalten diverser Daten aus den Encodern verwendet. Zusätzlich ist die i2cdevlib-Bibliothek [4] verwendet worden, um die IMU anzusteuern.

Adaptive Angle Adjustment[Bearbeiten]

Es wurde ein rechen- und speicherarmer, gleitender Durchschnittsfilter zur adaptiven Berechnung des Gleichgewichtswinkels des Würfels genutzt. Dadurch ist der Würfel in der Lage, den Winkel, um den er balanciert, gleitend anzupassen, um akkurater zu sein, und gleichzeitig leichte Unterschiede in der Gewichtsverteilung ausgleichen zu können.

LQ-Regler[Bearbeiten]

Der LQ-Regler bzw. linear-quadratischer Regler, auch Riccati-Regler genannt, ist ein Zustandsregler für ein lineares dynamisches System, dessen Rückführmatrix über die Minimierung eines quadratischen Kostenfunktionals ermittelt wird. [5]

Team[Bearbeiten]

Anhänge[Bearbeiten]

3D-Druck Dateien: [6]
Quellcode: [7]
Werbeplakat: [8]
Instructables: [9]

Vorstellung[Bearbeiten]


Weitere Ansätze[Bearbeiten]

Im Folgenden werden Ansätze vorgestellt, welche den Verlauf des Projektes zeigen sollen.

Aufbau mit Brushless DC Motor (BLDC Motor)[Bearbeiten]

Aufbau mit BLDC Motor und Epoxidharz Schwungscheibe

Zu Projektbeginn haben wir einen BLDC Motor verwenden wollen, welcher aus einem Modellflieger entnommen wurde. Dies erwies sich einerseits als Vorteil, da der dazugehörige ESC (Electronic Speed Controller) ebenfalls aus dem Modellflieger verwendet werden konnte, andererseits der Controller jedoch so konzipiert ist, dass der Motor nur ein eine Richtung ansteuerbar ist. Zudem konnten weder Modellnummern noch andere hilfreiche Bauteildaten des Motors oder des ESCs genau zugeordnet/abgelesen werden, sodass eine Suche nach einem Datenblatt unmöglich wurde. Aus diesem Grund wurde dieser Ansatz verworfen.


Aufbau mit Brushed DC Motor (BDC Motor)[Bearbeiten]

Aufbau mit BDC Motor und 3D gedruckter Schwungscheibe

In diesem Ansatz wurde versucht ein invertiertes Pendel, als Grundlage für den Würfel, da das Prinzip im Grunde gleich ist, umzusetzen. Hierfür wurde ein Brushed DC Motor verwendet. Der Aufbau ist im Bild rechts zu sehen.

Das Problem hierbei stellte sich zum einem im Motorgewicht und zum anderen im Drehmoment des Motors dar. Das zu große Eigengewicht des Motors verursachte eine Neigung des Pendels im ausgependelten (also "senkrechten") Stellung entgegen der Pendelachse. Dadurch klemmte das Pendel und konnte sich nicht ohne Eingreifen lösen.


Epoxidharz Schwungscheibe[Bearbeiten]

Aus Epoxidharz gegossene Schwungscheibe mit Bleigewichten am äußeren Rand

Im generellen Entwicklungsprozess bezüglich der Schwungscheibe sind verschiedene Konzepte aufgekommen, wie diese umgesetzt werden könnte. Eines dieser Konzepte war ein Versuch eine Schwungscheibe aus Epoxidharz zu gießen. Um das Gewicht der Schwungscheibe zu erhöhen wurden am äußeren Rand der Scheibe kleine Bleigewichte (Anglerblei) eingelassen. Als Gussform wurde ein Kunststoffdeckel eines kleinen Eimers verwendet. Verwendet wurde die Scheibe in Kombination mit dem BDC Motor, welcher sich jedoch als zu schwach erwies. Weswegen im nächsten Schritt eine Schwungscheibe per 3D-Drucker hergestellt wurde. Hierbei wurden Öffnungen am äußeren Rand der Scheibe ausgelassen um mit Schrauben den Gewichtsschwerpunkt nach Außen zu verlagern (analoger Gedanke wie bei der Epoxidharz-Schwungscheibe mit den Bleichgewichten).


Aufbau mit unterschiedlicher Sensorik[Bearbeiten]

Im Verlauf des Projektes wurde verschiedene Sensorik verwendet. Nachfolgend werden alle Sensoren vorgestellt, die Anwendung erläutert und begründet wieso sich für diesen Sensor entschieden wurde und welche Probleme aufgetreten sind.

Halleffekt-Sensoren[Bearbeiten]

Halleffekt Sensoren neben Neodynuim Magneten

Mithilfe der Hallsensoren wird die Geschwindigkeit des Schwungrads und somit die Geschwindigkeit des Motors gemessen. Neodyniummagneten wurden in eine 3D-gedruckte Schwungscheibe eingelassen. Dreht sich die Scheibe bewegen sich die Magneten über den Sensor und dieser erkennt die Veränderung im Magnetfeld. Auf Basis des Zeitabstandes zwischen den Auslösungen des Sensors wird die Geschwindigkeit bestimmt. Problematisch hierbei ist jedoch, dass der Sensor auslösen kann, wenn der Magnet nahe aber nicht direkt am Sensor ist. Dabei kann es passieren, dass der Sensor keinen konkreten Zustand erkennen kann. Zudem wiesen diese Sensoren ein recht hohes Rauschverhalten auf, sodass eine Filterung des Rauschens notwendig würde. Dazu liefert der Mikrocontroller jedoch nicht ausreichend Rechenleistung, um dies schnell und effizient durchzuführen.


Reedschalter[Bearbeiten]

Halleffekt Sensoren neben Neodynuim Magneten

In einem weiteren Versuch wurden Reedschalter verwendet, um die Geschwindigkeit des Motors zu bestimmen. Ebenfalls wurde hier die Schwungscheibe mit eingelassenen Magneten verwendet. Ähnlich zu den Halleffektsensoren lösen die Reedschalter aus, wenn ein Magnet in der Nähe ist. Anders als bei den Hallsensoren werden hier zwei Zustände - positiv, wenn Magnet am Sensor und negativ wenn nicht - abgebildet. Diese können somit einfacher differenziert werden. Generell hat dieser Ansatz funktioniert, jedoch ist die Auflösung der Geschwindigkeitsmessung nicht ausreichend, da nur 8 Magnete verwendet wurden. Zudem kann es zu Problemen kommen, wenn der Sensor genau zwischen zwei Magneten stehen bleibt, weil der Regelalgorithmus einen (relativ gut) ausgeregelten Zustand erkennt, und die Richtung des Schwungrads so klein und oft wechselt, dass der Sensor aus diesem "Totbereich" nicht raus kommt.


Aufbau mit Motor Encoder[Bearbeiten]

Aufbau mit beiden Encodern

In diesem Aufbau wurde der Gimbal Motor verwendet, welcher ebenfalls im finalen Produkt genutzt wird.

Mithilfe eines Encoders kann die Geschwindigkeit direkt auf der Motorachse gemessen werden. Es wird also die direkte Umdrehung gemessen und anhand dessen die Geschwindigkeit abgeleitet. Dies erlaubt auch den Motorwinkel zu bestimmen. Der Encoder wird direkt an den SimpleFOC Shield angeschlossen, welcher die Informationen vom Encoder direkt ausliest und, verarbeitet und die Motorsteuerung entsprechend anpasst.

Das Problem hier ist jedoch, dass die Bibliothek des ESC die Zeitmessung des Arduinos überschreibt, sodass Fehler bei der Winkelbestimmung des IMU entstehen und diesen sogar in einen Deadlock führen, sodass der gesamte Algorithmus einfriert.

Zudem wurde versucht einen zweiten Encoder zu verwenden. Dieser wurde dazu an der Pendelachse montiert, was die Bestimmung des Winkels optimiert. Hierbei wurde kein Problem festgestellt, jedoch ist dieser Aufbau nicht gut auf den Würfel umsetzbar, da der zweite Encoder eine starre Verbindung zum Untergrund auf dem das Pendel, oder dann der Würfel, steht, benötigt. Somit wäre der Würfel nicht mehr "portabel", da ein kleiner Standfuß eingebaut werden müsste. Mehr dazu im Abschnitt zum Würfel v1.0


Würfel v1.0[Bearbeiten]

Würfel v1.0 als Aufbau zur Nutzung mit und ohne den zweiten Encoder
Stanndfuß des Würfel v1.0 zur Nutzung des zweiten Encoders wie bei invertiertem Pendel

In diesem Ansatz wurde der Aufbau mit zwei Encodern weiter verfolgt und versucht diesen, zuvor mit einem invertierten Pendel durchgeführt, auf einen Würfel zu adaptieren. Hierbei wurde ein Würfel mit dem 3D-Drucker produziert. Es wurde auch hier der Gimbal Motor, zwei Encoder und der SimpleFOC verwendet. Hierbei muss beachtet werden, dass der zweite Encoder, welcher sich im bisherigen Ansatz am Fußende des Pendels befand, hier ebenfalls mit Kontakt zur Bodenfläche einzubauen ist. Dazu wurde eine Art Standfuß entwickelt, sodass im Grunde ein invertiertes Pendel nur mit einem Würfel herum als Verkleidung entstanden ist. Der Würfel und der Standfuß sind den Bildern rechts zu entnehmen. Da der zweite Encoder nicht direkt am Fuße (also an der Würfelkante) positionierbar ist, wurde hier eine Art Übersetzung konzipiert. Wie auf dem Bild zu sehen, wird eine Art Gabel verwendet, welche die Bewegung relativ zur Bodenfläche an den Encoder weitergibt. Auf Basis dessen muss der Winkel entsprechend ausgerechnet werden, was jedoch nicht besonders gut funktioniert hat.

Zum einen zeigte sich das Mehrgewicht des Würfels im direkten Vergleich zum Pendel als problematisch, zum anderen lag das oben beschriebene Problem mit der "Übersetzung" der Bewegung zum Encoder vor. Letztendlich lief die Entwicklung dieses Ansatzes darauf hinaus die IMU Sensoren zu nutzen, zumal ein tatsächlicher Würfel ohne jegliche Standfüße das eigentliche Projektziel ist.