Smart Bagger

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche

Der Smart Bagger ist ein kleiner Bagger, welcher sich über eine App fahren lässt. Sein Arm ist über einen Innovativen Handschuh komplett Steuerbar.

Die Idee[Bearbeiten]

Unsere Idee war es einen innovativen Spielzeugbagger zu entwerfen. Gewöhnliche Spielzeugbagger auf dem aktuellen Markt bieten maximal eine Fernsteuerungsfunktion. Dies war uns allerdings zu wenig. Wir wollten einen Bagger entwerfen, welcher nicht nur über eine Fernsteuerung, wie z.B. eine Rc Fernsteuerung oder eine App benutzbar ist. Das Fahrwerk sollte über eine App steuerbar sein. Zunächst planten wir den Baggerarm über einen Muskelsensor, welcher am Arm platziert wird zu steuern, dies stellte sich jedoch als schwierig heraus, da die gemessenen Impulse nicht eindeutig verwendbar waren. Somit entschieden wir uns für Flex Sensoren von Adafruit, welche eine neue Art der Steuerung erschaffen sollten.

Verbaute Teile[Bearbeiten]

  • Mechanische Teile
    • 1x 3D-Druck Baggerarm [1]
    • 2x Lego Technik Ketten
    • 4x Kettenmitnehmer
    • Diverse Metalllochplatten

  • Elektronische Teile
    • 1x Genuino 101
    • 1x Microservo ca 1,6kg pro cm
    • 2x HiTec HS-81 Servomotoren mit 3kg pro cm
    • 2x FiTec FS5103R Servomotoren mit 3kg pro cm
    • 3x Klinkenstecker
    • 3x Flex Sensor 2.2 von Adafruit mit 7kΩ - 13kΩ [2]
    • 1x 9V Batterie
    • 4x AA Batterien

Das Fahrwerk[Bearbeiten]

Das Fahrwerk des Baggers besteht aus Metalllochplatten um optimale Stabilität und ein robustes Chassis zu gewährleisten. Außerdem bieten die Lochplatten zahlreiche Befestigungsmöglichkeiten, sowie Spielraum für Veränderungen und Platz für Erweiterung, wie einen Anhänger. Der Rumpf wird über zwei Servomotoren angetrieben, welche mit den Kettengliedern verbunden sind. Die Ketten bieten dem Bagger optimalen halt, sowie eine optimale Kraftnutzung um auch kleiner Objekte überfahren zu können. Der auf dem Rumpf befestigte Baggerarm wird durch einen Servomotor via App ausgerichtet. Unter dem Rumpf befindet sich ein 9V Block, sowie 4x AA Batterien um die Stromversorgung zu gewährleisten. Auf dem Rumpf befindet sich neben dem Baggerarm ein Genuino 101, welcher unsere zentrale Steuereinheit ist und die Kommunikation via Bluetooth mit dem Smartphone ermöglicht. Das Fahrwerk ist 170 mm lang, sowie 140 mm breit und 70 mm hoch.

Der Arm[Bearbeiten]

Der Arm unseres Baggers stellt die wichtigste Funktion dar. Im Gegensatz zu einem normalen Spielzeugbagger ist unser Baggerarm vollkommen über eigene Handbewegungen steuerbar. Hierzu haben wir mehrere Flex Sensoren in einen Handschuh eingenäht, welcher lediglich angezogen werden muss. Nun kann man durch das knicken der jeweiligen Finger den Greifarm öffnen oder schließen, sowie den Baggerarm strecken oder stauchen und heben oder senken. Dies bietet ein präziseres Gefühl für die Ausrichtung des Armes um bestimmte Gegenstände zu heben. Der Baggerarm ist aus einem 3D-Druck entstanden und ist 100mm breit und Maximal 150mm hoch. In voller Länge misst er 220mm.

Funktionen[Bearbeiten]

Schaltplan Die Baggerarmsteuerung wird mittels der Flex-Sensoren realisiert, die an einen Handschuh genäht sind. Durch das Stauchen oder Strecken der Finger ändert sich der Widerstand in den Flex-Sensoren. Wird der Finger gestaucht, so vergrößert sich der Widerstand und wird der Finger gestreckt, so verringert sich der Widerstand. Der Widerstand der Sensoren wird über die AD-Wandler gemessen, dazu dient dann auch der 47kΩ Widerstand, welcher parallel dazu geschalten ist. Ein Flex-Sensor funktioniert in diesem Fall wie ein Potentiometer. Dadurch, dass jeder Servo unabhängig von den anderen kontrolliert werden kann ist es möglich das eine Person mit hilfe der App und dem Handschuh die volle funktion des Baggers nutzen kann.

Arduino IDE[Bearbeiten]

In dem Code für die Steuerung des Baggers werden zu erst diverse Variablen deklariert. Für jeden Servo gibt es jeweils eine -Konstante für die Pinbelegung auf dem Arduino 101 -ein Wert der aus der App oder dem AD-Wandler gelesen wird -einen Wert in Grad für den Winkel der geschrieben wird

Screenshot der Arduino.ino

Im Loop wird zuerst geprüft ob die Verbindung zu der App besteht, wenn dies nicht der Fall ist wird die LED schnell blinken um dies zu zeigen. Wenn die Verbindung besteht werden die Werte aus der App empfangen und in Winkel für die Servos umgewandelt mit der Map funktion. Diese Winkel werden dann direkt an den Servo gegeben. Nachdem so das gesamte Fahrwerk unter kontrolle ist, werde die Wiederstände der Flex-Sensoren nacheinander gemessen. Dazu werden die Werte über den AD-Wandler gelesen und anschließen geglättet, als Winkel gemappt und and die Servos weitergegeben. Zum Schluss werden die aktuellen Werte für den nächsten Durchlauf gespeichert mit einem Delay von 50ms gewartet bis der nächste durchlauf startet

Screenshot der Arduino.ino

Messwerte und Glättung[Bearbeiten]

Die Flexsensoren waren nicht die erste Wahl bei der Messung der Handbewegung. Angefangen haben wir mit der Messung von der Muskelaktivität ([Elektromyographie]https://de.wikipedia.org/wiki/Elektromyografie) durch einen Muscle-Sensor von Adafruit. Mit vielen Versionen und Versuchen die Messungen zu optimieren hat uns der Muscle-Sensor nicht weiter gebracht. Dieser hat keine verlässlichen und manchmal garkeine Werte geliefert, da die Anwedung auf der Haut auch sehr abhängig vom Benutzer ist. Letztendlich ist so auch der Aufwand für nur die Benutzung der Baggers zu hoch.

Die Messung des Wiederständes des Flex-Sensors ist für uns eine sehr viel verlässlichere Lösung. Dieser ist sehr viel kleiner und einfacher zu verwenden bei der Benutzung. Nach der praktischen umsetzung 3 dieser Sensoren in einen Handschuh zu nähen ist schnell aufgefallen das auch diese Sensoren ein geringes Rauschen in den Werten liefern. Bei einer direkten Verwendung dieser Werte würden also die Servos zittern und damit eine ungewollte Bewegung haben. Es gibt viele Methoden zur Glättung. So haben wir es zuerst mit einer Art Moving Average Filter versucht, welcher den MittelWert und dann die Varianz von 20Werten errechnet. Diese Varianz haben wir dann als Toleranzwert verwendet. Das heißt, dass der Aktuelle Messwert im Loop um den Wert der Varianz größer oder kleiner sein muss als der letzte. Diese Rechnung jedoch war relativ Rechenintensiv und schwer zu optimieren, so das auch die Sensoren weiterhin unabhängig von einander bleiben.

Die finale Version beinhaltet dem gegenüber eine simplere Methode. Es wird durch eine höhere Gewichtung auf dem Vorgänger des Messwertes eine Glättung erzielt. Praktisch: Finalerwert = AktuellerMesswert*0.3 + AlterMesswert*0.7

Evothings Studio[Bearbeiten]

Ein Screenshot der mobilen Applikation.
Screenshot der App

Ursprünglich war eine Umsetzung der mobilen Applikation durch das PhoneGap Framework von Adobe geplant, doch diese Idee wurde früh in der Entwicklung verworfen, da die automatische Aktualisierung der dargestellten App aus unbekannten Gründen nicht ausgelöst wurde. Folglich hätte dies manuell durch Trennung und Wiederaufbau der Verbindung zur Desktop App stattfinden müssen, was zu viel Zeit in Anspruch genommen hätte. Nach einer kurzen Suche ergaben sich daraufhin Evothings Studio sowie die dazugehörige Viewer-App als geeignete Alternativen.

Um den Prozess der Programmierung zu beschleunigen, benutzten wir das bereits vorhandene Codebeispiel "Arduino/Genuino 101 LED On/Off BLE" von Evothings als Grundlage für unsere eigene Anwendung. In ersten Tests steuerten wir die Onboard LED des Arduino-Boards gemäß des Beispiels an, zuerst durch die Nutzung einfacher Buttons und anschließend durch Slider (HTML Formulare mit Range Inputs). Änderungen an diesen Slidern lösten jeweils onInput- und onChange-Events aus, durch welche Funktionen zur Übertragung eines Bluetooth-Signals an das Board aufgerufen wurden. Die App nutzte daraufhin die aktuellen Werte eines Sliders um zu Entscheiden, ob die LED an- oder auszuschalten war (Ein Wert von 0 bis 50 deaktivierte die LED, ab 51 wurde sie aktiviert).

Ein Ausschnitt des Codes der mobilen Applikation
Code-Ausschnitt der App zur Steuerung der linken Kette

Nachdem so die ersten beiden Slider erstellt und Signale erfolgreich übertragen wurden, begann die Umstellung der App von einer LED- zur Servo-Steuerung. Hierfür wurden mehrere UUIDs (Universally Unique Identifier) generiert und in der App hinterlegt, mit denen separate Signale an die Servos für den linken und rechten Antrieb des Baggers gesendet werden konnten. Mit jedem onInput- oder onChange-Event an den Slidern wurde ein neues Signal an das Board gesendet, welches den aktuellen numerischen Wert des Sliders enthielt. Dieser diente wiederum dazu, auf der Seite des Arduino101 in einen konkreten Leistungswert für den dazugehörigen Servo umgewandelt zu werden. Erste Tests der simultanen Übertragung und unabhängigen Steuerung der Ketten waren erfolgreich, Sliderbewegungen in Schritten von 1 sorgten jedoch für zu viele Signale und die Entstehung einer hohen Übertragungslatenz. Dem wurde mit einer Umstellung der Intervallgröße auf 5 entgegengewirkt, was die Menge an übertragenen Signalen und deren Anstauung deutlich verringerte. Der Bagger war somit vollkommen lenkbar, allerdings schwer anzuhalten, da die Slider dafür genau in ihre Mittelposition bewegt werden mussten. Zur Lösung dieses Problems wurden die onChange-Events, welche beim Ende der Sliderinteraktion (Hier: Entfernen des Fingers vom Slider) eintraten. Ihr neues Ziel war es nicht mehr nur, den aktuellen Sliderwert zu übertragen, sondern diesen vorher auf seinen Mittelwert (50) zurückzusetzen. Folglich stellen die Servos beim Ende der Sliderinteraktion ihre Arbeit ein und der Bagger blieb stehen.

Bei der daraufhin implementierten Steuerung der Armausrichtung kam eine sehr ähnliche Lösung zum Einsatz. Auch hier wurde der aktuelle Sliderwert jeweils an das Board und den Servo weitergeleitet, bei großen Änderungen – Beispielsweise einer Drehung um 90 Grad – fiel jedoch auf, dass die schnelle Bewegung des Arms zu viel Schwung generierte und in Kombination mit dessen Gewicht drohte, den Servo zu beschädigen. Um dies zu verhindern, wurde die Übertragungsfunktion der App an dieser Stelle so angepasst, dass der Arm in kleinen aufeinanderfolgenden Intervallen an seine Zielposition bewegt würde.

Nachdem somit alle Grundlegenden Funktionen implementiert waren, wurde die App noch durch weitere Features ergänzt. Um den Bagger leicht in seinen Ausgangszustand zu versetzen, wurde ihr eine Methode hinzugefügt, welche an alle drei Servos ein Signal mit ihren Standardwerten sendete. Diese wurde sowohl beim Verbindungsaufbau mit dem Arduino101 als auch auf Wunsch per Knopfdruck durch Nutzender*innen ausgeführt. Um außerdem einfache Vor- und Rückwärtsbewegungen des Baggers zu ermöglichen, wurde eine Checkbox inmitten der Antriebssteuerung eingeführt. Bei jeder Benutzung eines Antriebssliders wurde daraufhin geprüft, ob in dieser ein Häkchen gesetzt war. Traf dies zu, wurde das Signal eines Sliders an beide Servos gesendet und der jeweils "unbenutzte" Slider automatisch mit dem neuen Wert aktualisiert. Letztlich wurden die Übertragungsfunktionen für Bluetooth-Signale um einen Vergleich der jeweils aktuellen Servowerte mit den neu gewünschten ergänzt. Ziel dessen war es, das Senden von redundanten Signalen zu vermeiden und so einer Aufstauung mehrerer Signale weiter entgegenzuwirken.

Programme[Bearbeiten]

  • Arduino IDE
  • Evothings Studio & Viewer
  • Autodesk Fusion 360

Gruppenzusammensetzung[Bearbeiten]

  • Marius Blumenthal
  • Steffen Bocian
  • Jan Stais