Roboteruhr

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche

Dieses Projekt beschäftigt sich mit der Entwicklung einer Roboter Uhr. Dafür werden zwei DOBOT Roboter Arme verwendet. Diese sollen so gesteuert werden, dass Sie aufgrund einer Echtzeituhr, die aktuelle Uhrzeit aus einem Pool an Zifferblöcken aufstellt. Mittels Unterdruck-Greifer können die Ziffernblöcke aufgehoben und wieder abgesetzt werden.

Dobo Uhr.jpg

DOBOT-Magician[Bearbeiten]

Dobot.jpg

Der Magician von Dobot ist im Gegensatz zu den meisten SCARA-Armen komplexer im Aufbau und dem ursprünglichen SCARA-Entwurf nach Makino deutlich ähnlicher als die Industrievarianten. Dadurch wird eine größere Flexibilität in der „Punkt zu Punkt Bewegung“ ermöglicht. Der Dobot besitzt eine Tragkraft von 0,5 kg und verfügt über eine Reichweite von 320 Millimeter. Die Anwendung erstreckt sich über den Bildungs-, Privat- sowie den Businessbereich wie Beispielsweise in einer Agentur oder in einem Labor. Die vier Achsen ermöglichen eine Automatisierung im Alltag für den 4.0 Ansatz. Ein einfacher Einstieg in die Hard- und Software wird durch das „Out-Of-The-Box Prinzip“, sowie eine leichte „Teach and Playback“ Funktion für Beginner, eine „Blocky Anwendung“ für Fortgeschrittene und eine „Script-Anwendung“ für erfahrene Python-Programmierer sichergestellt. Die Software-optionen sind in der vom Hersteller eigens entwickelten Open-Source Software namens Dobot Studio verfügbar. Auch die Hardware ist modular, zum Beispiel ist die Spitze austauschbar um 3D-Druck, Zeichnungen und das Anheben von Objekten zu ermöglichen.

Aufbau[Bearbeiten]

Die Dobot-Roboteruhr besteht aus zwei Dobot Roboterarmen welche auf einer Platte mit 30 Zentimetern Abstand befestigt werden. Ein Arm ist dabei für den „Aufbau“ also das nach vorne Stellen der entsprechenden Blöcke aus der Ablagefläche und einer für den „Abbau“, also das zurückstellen auf die Ablagefläche verantwortlich. Der Platz zwischen den Armen dient zur Lagerung der Ziffernblöcke mit welchen die Uhrzeit dargestellt wird. Ein Dobot soll dabei Ziffernblöcke von ihrem fest zugeteilten Lagerplatz holen und an die entsprechende Stelle der Uhrzeit stellen. Sein Gegenpart soll die Ziffernblöcke von ihrer Position in der Uhrzeitanzeige holen und sie wieder an ihren zugeteilten Lagerplatz stellen. Dieser Prozess wird durch einen im Dobot-Kit enthaltenen Kompressor, welcher mit dem Unterdruckgreifer des Dobots verbunden ist ermöglicht.

Bevor das Projekt Roboteruhr, oder ein ähnliches Projekt mit Dobots umgesetzt wird ist folgendes zu beachten. Die vom Hersteller beschriebene Präzision wird besonders bei nahezu maximaler Auslenkung nicht mehr erreicht. Die Roboterarmebesitzen zwar 4 DOF, doch werden zu weit entfernte, oder zu nahe Punkte von der Programmierung nicht erreicht. Die tatsächlich erreichbaren Punkte sollten also bereits zur Planungszeit bekannt sein.

Skitze 1.PNG

Platte[Bearbeiten]

Die Fläche für die Roboteruhr bilden zwei aufeinander liegende Platten, welche später als Ankerpunkt für die restlichen Elemente dienen. Diese werden mit dem Laisercutter ausgeschnitten. Für die beiden Dobots und die 29 Ziffernblöcke genügt eine Platte mit den Maßen 300 Millimetern in der Höhe und 600 Millimetern in der Breite.

In die untere Platte werden Qadratische Löcher für die Podeste der Dobots eingefügt um später eine höhere Stabilität zu erhalten. Die Ziffernblöcke erhalten hier ihre Halterung, welche aus Magneten in den Ziffernblöcken als auch Magneten in der unteren Platte die sich gegenseitig anziehen bestehen.

Skitze 2.PNG

In die obere Platte werden jediglich die Qadratische Löcher für die Podeste der Dobots eingefügt.

Skitze 3.PNG


Sind die beiden Platten im Lasercutter entsprechend ausgecuttet worden können Die Magneten bereits in die untere Platte eingesetzt und mit einem Klebstoff befestigt werden. Sobald man sicher ist, dass alles richtig ist kann auch die Obere Platte mittels Klebstoff o.ä. befestigt werden.

Podest[Bearbeiten]

Die Podeste auf denen die Dobots stehen, bestehen aus 4 Seiten und einer Oberfläche mit einer Maße von 160x160x60 Millimetern. Die 5 Elemente bilden einen Hohlraum in dem der Kompressor gelagert wird. Die obere Fläche besteht aus ihren äußeren Rändern auf denen die Gummifüße des Dobots Platz finden. Zusammengehalten werden die Platten durch sogenannte „Fingerverschachtelung“, welche zusätzlich geklebt werden kann. Eine Fingerverschachtelung kann im entsprechenden Vektorgrafiktool selbstständig, oder von einem online Tool erstellt werden. Auf einer der seiten ist noch ein Loch um die Kable nach untne zu führen.

Blöcke[Bearbeiten]

Die Ziffernblöcke selbst besitzen die Maße 30x17x40 Millimeter. Sie bestehen aus einem Stück Buche welches mit einer Kreissäge in die entsprechenden Maße geschnitten wurde. 29 dieser Elemente werden benötigt. Als nächstes werden die zuvor zugeschnittenen Holzblöcke mit Ziffern versehen. Um die Zahlen, trotz geringer Größe der Blöcke gut sichtbar darzustellen gibt es mehrere Methoden. Man kann sie mit dem Laisercutter eingravieren oder mit Aufklebern bestücken. Zum schluss werden die Ziffernblöcke werden abschließend an ihrer Auflagefläche mit Magneten versehen, dafür werden ebenfalls jeweils 5 Millimeter vom Rand zwei Löcher gebohrt und dort die Magneten eingesetzt.

Programierung[Bearbeiten]

Wenn alle bisher beschriebenen Elemente angefertigt, zusammengebaut und aufgestellt worden sind kann die Uhr mit dem im Kapitel „Implementierung“ oder auf Git bereitgestellten Code die Uhr in Betrieb genommen werden. Dafür muss die vom Hersteller bereitgestellte Software auf zwei Rechnern installiert und die Dobots angeschlossen werden. In einem neu erstellten Script wird der Code eingefügt, die Variable „aufbau“ muss dabei bei einem der beiden Programme auf FALSE gesetzt werden. Mit dem drücken der Starttaste werden Dobots aktiviert und führen ihre Aufgabe durch.


Dobot-Studio[Bearbeiten]

Der Dobot Magician Roboterarm besteht aus 4 Joint-Gelenken. Der Zugriff auf den Dobot erfolgt über die Open Source Software Dobot-Studio welche vom Entwickler zur Verfügung gestellt wird. Diese Software ermöglicht es Befehle an den Roboter zu übermitteln. Die Anwendung „Teaching&Playback“ lässt den Nutzer den Roboter von Hand an die gewünschten Stellen bewegen. Diese Positionen werden gespeichert und beim späteren Ablauf des Programms angesteuert. Mit der Anwendung „Leapmotion und Maussteuerung“ lässt sich der Roboter, allerdings nur sehr unpräzise, durch die Maus bewegen. Durch die Anwendung „Blocky“ und „Script“ lässt sich der Dobot Zielgesteuert bewegen. Bei ersterem handelt es sich um eine Benutzeroberfläche, in welcher Programmierbausteine benutzt werden um Nutzern die nicht mit Python vertraut sind trotzdem eine Möglichkeit zu geben einen präzise geplanten Ablauf aufzubauen. Mit der Script-Option lässt sich eine Programmierung der Roboterarme in der Programmiersprache Python umsetzten.

Implementierung[Bearbeiten]

Der Ablauf der Programme der beiden Roboterarme verläuft größtenteils gleich.

Header[Bearbeiten]

Für das folgende Programm wird zunächst die Bibliothek time importiert. Danach wird auf dem Unterdruck Greifarm des Dobots mit dem Befehl SetEndEffectorSucctionCup deaktiviert. Dies dient jedoch nur zur Sicherheit, sollte ein vorheriges Programm nicht ordnungsgemäß geschlossen worden sein kann der Unterdruckgreifer immer noch aktiv sein. Der nachfolgende PTPJumpParams-Befehl definiert für das Programm die Höhe einer beliebigen Bewegung. Der zweite Parameter gibt hierbei mit 50 die minimale Höhe und der dritte mit 90 die maximale Höhe an. Die 50 bzw. 90 sind hier keine Millimeterangaben, sie geben lediglich die internen Werte des Dobots auf der Z-Achse wieder. Der nachfolgende PTPCommenParams-Befehl gibt die Geschwindigkeit des Dobots an. Die Standardeinstellung des Dobots kann hier nach Wunsch geändert werden. Der zweite Parameter gibt die gewünschte Geschwindigkeit und der dritte die gewünschte Beschleunigung an. Die Variable „aufbau“ gibt an ob es sich um Dobot A oder Dobot B handelt. Die Anschließend erzeugte Variable t dient später der Nutzung der Zeit die Dobot A auf Dobot B pro Ziffernblock wartet.

Klasse Block()[Bearbeiten]

Nach diesem Header beginnt die erste und einzige Klasse des Programms namens Block. In dieser Klasse werden zunächst verschiedene Methoden erstellt deren Aufgabe darin besteht die Variablen die in der Funktion mit self angesprochen werden jederzeit aufrufen zu können. Funktionen mit einem set bzw. get vor dem Eigennamen sind die in der Objektorientierung benutzten getter- bzw. settermethoden. X, Y und Z stehen hierbei für die einzelnen Achsen, der Variablenname AV steht für availability bzw. Verfügbarkeit, welche Informationen über die Anwesenheit des Ziffernblockes gibt. Die Methoden get1h(h), get0h(h) geben den Stellenwert der Zehner bzw. Einser der Stunden wieder. Für 05:24 wird also nur der Wert 0, bzw. 5 für die Stunden zurückgegeben. Die Methoden get1m(m) und get0m(m) haben dieselbe Aufgabe, beziehen sich aber auf die Minuten. Die Methode setStartTime ermittelt mit den bisherigen Funktionen die aktuelle Uhrzeit und führt entsprechend für die Zehner und Einser Werte der Stunden bzw. der Minuten die Funktionen seth1Time(h1), seth0Time(h0), setm1Time(m1), setm0Time(m0) aus. Die Methode setTime() geht das Array der 30 Ziffernblockplätze durch und überprüft zunächst ob der aktuelle Ziffernblock mit dem Wert der aktuell überprüften Zeit übereinstimmt und ob der Block momentan verfügbar ist. Wenn die Variable „aufbau“ nun TRUE ist, wird der Roboterarm zur Position des Ziffernblocks geschickt, der Unterdrucksaugkopf aktiviert und die Verfügbarkeit dieses Ziffernblocks auf 0, also nicht mehr verfügbar, gesetzt. Anschließend bewegt sich der Roboterarm mit dem Ziffernblock zur geforderten Position der Anzeige und schaltet den Unterdruckgreifer wieder aus. Wenn die Variable „aufbau“ auf FALSE steht wird die Blockverfügbarkeit auf 0 gesetzt und der Arm wartet auf den nächsten Befehl. Die Methoden mit dem Namensinhalt resetTime geht ebenfalls zunächst das Array durch führt die Aktionen umgekehrt aus. Ist Der „aufbau" TRUE und FALSE unterschieden. Mit den Variablen xa, ya und za (für x-aufspannen, usw.) wird der Rechteckbereich zur Lagerung der Ziffernblöcke aufgespannt. Nachfolgend wird die Methode home() ausgeführt. Sie lässt den Dobot sich zu den entsprechenden Koordinaten bewegen.

Main Programm[Bearbeiten]

Das Array anzeige steht stellvertretend für die 4 Ziffernblöcke, welche die Uhrzeit repräsentieren. In der For-Schleife werden die Positionen der 4 Ziffernblöcke der Anzeige definiert, da sie alle in der ya-Richtung auf derselben Position stehen wird diese nicht verändert. Jedoch wird die xa Position um 35 Einheiten mal den Wert des aktuellen Feldes (0,1,2,3) weiter nach rechts verschoben. Dieser Faktor von 35 ist abhängig vom gewählten Abstand zwischen den Ziffernblockauflageflächen. Auf- und Abbau unterscheiden sich bei der Berechnung des x-Werts da von diesem i*35 bzw. -i*35 gerechnet wird. Das Array b füllt das Feld mit 32 potenziellen Ziffernblöcken und die nachfolgende dopplete For-Schleife läuft alle 32 Positionen ab. Wie bei der Anzeige werden dort die Positionen der Blöcke definiert. Diese werden abhängig von xi und yi mit dem entsprechenden abstand berechnet. In allen Fällen ist die za-Koordinate, welche sich auf die Höhe bezieht, gleich. Der Unterschied zwischen Auf und „abbau“ liegt auch hier wieder bei der Berechnung der x-Koordinate Dem Array b werden zwischen den Elementen 0 und 29 in aufsteigender Reihenfolge alle Ziffern zugeordnet die für die Uhrzeitanzeige benötigt werden. Die Variablen H und M werden mit der aktuellen Uhrzeit als Dezimalzahlen belegt. SetStartTime greift diese Werte auf und rechnet mit ihnen weiter. Die Variablen a1h, a0h, a1m und a0m (aktuelle-zehner-stunde, usw.) sind nach wie vor für die Zehner- bzw. Einserwerte der jeweiligen Uhrzeit zuständig und werden im folgenden zur Zwischenspeicherung der aktuellen Uhrzeit verwendet. In der nachfolgenden endlos-while-Schleife werden erneut H und M wie bereits zuvor belegt und die Uhrzeit in Stunden und Minuten in der Konsole ausgegeben. Danach wird zur Zwischenspeicherung der zuletzt genutzten (aktuellen) Uhrzeit alle entsprechenden Werte in o1h usw. abgespeichert und die Einserwerte der Minuten in der Konsole ausgegeben. Nun wird erneut die aktuelle Uhrzeit nach bereits bekanntem Verfahren ermittelt und ausgegeben. Als letzten Schritt wird überprüft das Programm ob die alte aktuelle Zeit mit der momentanen aktuellen Zeit übereinstimmt. Tut es das nicht werden die entsprechenden reset- und set-Methoden aufgerufen.  

Video[Bearbeiten]

Ausblick[Bearbeiten]

Die Roboteruhr kann als vollwertiges Projekt angesehen werden, aber nicht als formvollendet. Der Code kann optimiert werden, auch für den Aufbau oder die Materialien können noch alternativen gefunden werden, aber als Vorlage für darauf aufbauende Projekte kann die Dobot-Roboteruhr bereits genutzt werden. Die Tatsache das die Dobots jeweils auf einem eigenen Computer gestartet werden müssen ist weder praktikabel noch besonders schön. Denkbar hierfür wäre zum Beispiel „Rasberry pies“ die diese Aufgabe übernehmen. Im Sinne des 4.0 Ansatzes ist auch eine Steuerung über Alexa denkbar. So könnte per Sprachbefehl die komplette Uhr gestartet oder beendet werden.