Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose19:abotpublic:start

Dokumentation

Einleitung

AlboT ist ein auf die Sortierung von Wertstoffmüll spezialisierter Roboter. In die Wertstofftonne kommen in Berlin verschiedene Kunststoffe, Verbundstoffe und Metalle. Bevor diese Stoffe recycled werden können müssen sie nochmals sortiert werden. Für diese Aufgabe haben wir AlboT entwickelt. Für den Fall das mal was neben die Tonne geht ist AlboT außerdem in der Lage die Stoffe vom Boden aufzusammeln und direkt zu sortieren. Jedoch ist er nur für kleine und leichte Müllteile gemacht. Der Roboter besteht aus einem Fahrgestell auf das ein Finger zur Materialbestimmung, ein Greifarm sowie zwei Behältnisse montiert sind. In diese Behältnisse wird der jeweilige Wertstoff über den Greifarm einsortiert nachdem die Objekte vom Boden aufgesammelt wurden. Die Sortierung in die groben Kategorien Metall / Plastik geschieht durch die Unterschiedlichkeit der Materialien bezüglich der Leitfähigkeit. Nach der Sortierung können die Stoffe wieder dem Wertstoffkreislauf zugeführt werden und wiederverwendet werden. Der Name ist in Anlehnung auf ein großes Entsorgungsunternehmen entstanden.


Abbildung 1: Der Müllsortier- Roboter „AlboT“

In der Art des Aufbaus des Roboters ähnelt AlboT dem Projekt Wall-E aus dem Wintersemester 2018/19, welches den Müll jedoch nach Farbe sortiert. Informationen zu diesem Projekt sind hier zu finden: Wall-E
https://www.mintgruen.tu-berlin.de/robotikWiki/doku.php?id=projektewise18:wall-e:planung#sensoren

Im Verlauf der Dokumentation skizzieren wir die geplante Funktionsweise und beschreiben Probleme und Lösungen in der Arbeit an dem Projekt. Zum momentanen Entwicklungsstand weicht die reale Funktionsweise noch von der Planung ab, Gründe hierfür und weiteres vorgehen werden wir im Fazit diskutieren.

Umsetzung

Überblick über Funktionsweise und Konstruktion

Flowchart zur Funtionsweise

albot_doku_flowchart_1_.jpg
Abbildung 2: Visualisierung der Loop Funktion des Programms

Wenn AlboT gestartet wird beginnt der Roboter sich im Kreis zu drehen und sendet hierbei nach jedem Schritt ein Ultraschall-Signal aus, um Müll zu finden. Wenn ein Signal zurückkommt, fährt AlboT gerade auf die Stelle zu von der das Signal kam und fährt so direkt auf Objekt zu, welches das Signal reflektiert hat. Ist AlboT am Objekt angekommen, führt das Durchbrechen einer Lichtschranke am vorderen Teil des Roboters dazu das AlboT anhält. Zugleich wird das Objekt von dem „Finger“ berührt, der vorne an AlboT befestigt ist. Dieser Finger (Metal Touch Sensor) erkennt bei Berührung leitfähige Metalle, wodurch die Materialunterscheidung erfolgt. Als Nächstes Greift AlboT mit dem Greifarm das Objekt und sortiert das Objekt in den entsprechenden Behälter, wobei sich der Greifarm sich je nach Material in die eine oder andere Richtung bewegt. Auf Grund vieler Vereinfachungen ist AlboT nur in einer sehr idealisierten Umgebung einsetzbar.

Was AlboT nicht kann
  • AlboT kann sich bei dem momentanen Entwicklungsstand nicht im Raum orientieren. Alle Gegenstände - Ob Wand, Mensch oder Müll - Werden als potenzielles Müllobjekt erkannt und angefahren. Es können also keine Hindernisse umfahren werden.
  • AlboT kann nur in die groben Kategorien Mtall(leitfähig)/Plastik(nicht leitfähig) unterscheiden. Dabei wird ignoriert, dass auch andere Stoffe diese Leitfährigkeitseigenschaften erfüllen. Auch wird nicht weiter eingeteilt in unterschiedliche Polymere oder Metalle.
  • AlboT kann keine großen und schweren Objekte greifen, nur Objekte mit bestimmten Maßen.



Konstruktionsaufbau

albot_schraeg2_beschriftet3.jpg
Abbildung 3: Beschriftete Abbildung unseres Roboters

Der Roboter besteht aus zwei Ebenen, die mit Klettverschluss modular aufeinander aufgebaut sind. Die erste Ebene ist ein Fahrgestell mit Motoren, Rädern und Ultraschallsensor, also der Bewegungsapparat. Außerdem ist am vorderen Teil unter dem Ultraschallsensor der Metal Touch Sensor zur Materialbestimmung montiert (der „Finger“ des Roboters) sowie an zwei Einlenkflügeln eine Lichtschranke bestehend aus Infrarot LED und Infrarot Phototransistor.

Auf der zweiten Ebene sitzt auf einen Stepper montiert der Greifarm bestehend aus zwei Armteilen mit Servomotoren als Gelenke und einem Greifer der mit einem Servo auf und zu geht. Der Stepper ermöglicht die Drehbewegung auf der horizontalen Ebene.
Im Hinteren Bereich der zweiten Ebene sind jeweils seitlich die Materialbehälter angebracht.

Im Zwischenraum der beiden Ebenen sitzt die Elektronik.

Abbildung 4: Hier ist der Metal Touch Sensor gut zu sehen.

Abbildung 5: Seitenanicht

Bewegungsapparat

AlboT wird von zwei Stepper Motoren angetrieben, an die zwei Räder montiert sind. Die Motoren + Räder sind am Hinteren Teil von AlboT befestigt. Vorne ist ein bewegliches Rad angebracht. Als erstes hatten wir recherchiert und uns mit der Funktionsweise der Motoren auseinander gesetzt und wie wir die Motoren über Arduino ansprechen können. Die Funktionsweise eines Stepper Motors ist in diesem Video gut dargestellt: https://www.youtube.com/watch?v=VfqYN1eG9Zk (Ab Minute 1:30). Ein Stepper Motor macht einen Schritt, wenn der Step Pin von LOW auf HIGH und wieder auf LOW gestellt wird. Dazwischen sollte etwas Zeit für die Übertragung mit einprogrammiert sein. Der Direction Pin bestimmt die Richtung, jenachdem wie der Motor an den Treiber angeschlossen ist, ist LOW bzw HIGH vorwärts oder rückwärts. Der in AlboT verwendete Motor SY 42STH38-168 4A 1) hat einen Schrittwinkel von 1.8°. Für eine volle Radumdrehung sind also 200 Schritte nötig. Es lohnt sich sehr, von vorherein starke Motoren zu verwenden und bei der Planung das zukünftige Gesamtgewicht des Roboters zu beachten, dass von den Motoren getragen und bewegt werden muss.

Nachdem wir das Fahrgestell gebaut hatten haben wir verschiedene Bewegungsformen ausprobiert, erst geradeaus fahren, dann Schlangenbewegungen und Kreisbewegungen. Wie bereits erwähnt wird ein Step durch das Umschalten von LOW auf HIGH und zurück auf LOW ausgeführt. Dies sollte für einen bestimmten Zeitraum mehrmals hintereinander geschehen, wofür sich eine For-Schleife anbietet.

for(int n = 0; n<100 ; n++) {
  digitalWrite(step1, HIGH); 
  digitalWrite(step2, HIGH); 
  delay(1);
  digitalWrite(step1, LOW);
  digitalWrite(step2, LOW);
  delay(1)
  }

Die Variable n ist hierbei die Maximale Schrittanzahl die ausgeführt werden soll. In disem Fall soll nach 100 Schritten Schluss sein.

Lineare Bewegung

Hier sollen beide Motoren gleichförmig bewegt werden. Das heißt die Direction Pins müssen für beide Motoren so programmiert sein, dass sie den Motor in die selbe Richtung bewegen.

digitalWrite(dir1, HIGH); 
digitalWrite(dir2, HIGH);
Nicht Lineare Bewegung

Damit der Roboter im Kreis fährt müssen sich die Motoren in entgegengesetze Richtungen bewegen.

digitalWrite(dir1, HIGH); 
digitalWrite(dir2, LOW);
Objekterkennung

Für die Objektsuche und -Erkennung verwenden wir einen Ultraschallsensor des Typs HC-SR04. Dieser Wird an Arduino an Ground und der 5V Versorgung angeschlossen sowie an zwei Digitale Pins, den Trigger und den Echo Pin. Wenn der Sensor angesteuert wird bekommt der Trigger Sensor ein 5V Signal wodurch eine Ultraschallwelle ausgelöst wird. Befindet sich ein Gegenstand in Richtung der Schallausbreitung wird das Signal reflektiert und wird vom Sensor wahrgenommen und der Echo Pin sendet ein Signal an Arduino. Wir haben also ein Programm geschrieben, welches die Zeit die zwischen Aus- und Eingang der Signale vergeht in die Entfernung in cm umrechnet.

dauer = pulseIn(echo, HIGH); 
entfernung = (dauer/2) * 0.03432; 

Hierbei ist der Wert 0.03432 die Schallgeschwindigkeit in cm/µs. Das Ergebnis ist die Entfernung in Zentimetern.

 entfernung [cm] = (dauer [ms] / 2) * Schallgeschwindigkeit [cm/µs] 

Der Ultraschallsensor kann Entfernungen von etwa 1cm - 600cm wahrnehmen.

Wir haben Albot so programmiert, dass er nur nach Objekten innerhalb eines bestimmten Radius sucht, da wir keine Objekt/Hindernis unterscheidung eingebaut haben. Der momentane Suchradius beträgt 100cm. In diesem Bereich sollten sich also keine Hindernisse befinden.

Bewegung AlboT

Wir haben zwei Bewegungsfunktionen geschrieben, die wir in loop aufrufen können: „geradeaus“ und „drehen“. Die Funktion „drehen“ wird bei der Suche nach einem Objekt ausgeführt. Hier fährt Albot im Kreis. Wir haben AlboT so programmiert, das nach 5 Schritten der Funktion ein Ultraschallsignal abgesetzt wird um zu schauen, ob sich in dieser Richtung in einer Entfernung von Maximal 100cm ein Objekt befindet. Wenn dem so ist wird die Funktion „geradeaus“ aufgerufen und der Roboter fährt geradeaus auf das Objekt zu.

Materialunterscheidung

Hierfür haben wir den Metal Touch Sensor verwedent. Dies ist ein kapazitiver Sensor 2). Der Metaldraht am Sensor bildet mit dem Messobjekt ein Kondensator. Ist das Objekt leitfähig erfolgt eine Wertänderung infolge der sich ändernden Kapazität, anderenfalls bleiben die Werte konstant, da das Objekt dann wie ein Dilektrikum wirkt. Eine Gute Beschreibung des Sensors findet sich hier: http://sensorkit.en.joy-it.net/index.php?title=KY-036_Metal-touch_sensor_module

Die folgende Grafik zeigt den Plot der Messwerte vom Metal Touch Sensor.



Abbildung 6: Messwerte Metal Touch Sensor Screenshot Arduino Serial Plot

Um eine Wertänderung durch Metalberührung jederzeit zu erfassen muss im Code eine Interrupt Service Routine (ISR) verwendet werden. In der ISR haben wir eine Logik Variable eingebaut.

volatile boolean askMetal = false;

void setup() {
attachInterrupt(digitalPinToInterrupt(finger), metalTouch, FALLING);  
}

void loop() {
if (askMetal == true) {Serial.println("Metall");}
else {Serial.println("kein Metall");}
askMetal == false;                                      // reset Flag
}

// Interrupt Service Routine (ISR) für Metalldetektion
void metalTouch() {
  askMetal = true;  
}

Um diese Information im Loop abrufen zu können verweden wir ein Flag. Wichtig ist, dass am Ende des Loop der Wert wieder zurückgesetzt wird, da sonst für alle weiteren Loop-Durchläufe der Wert unverändert bleibt - auch wenn der Wert in der ISR sich ändert.

Zu beginn hatten wir für die Materialunterscheidung ein Programm geschriben, welches - ähnlich zu dem Lichtschrankenprogramm - einen bestimmten kritischen Wert hatte und ein Material als Metall einteilte wenn dieser Wert unterschritten wurde. Jedoch wird dann nicht jede Metallberührung detektiert. So würde mit einem solchen Programm beispielsweise eine Messung an dem in Abb. 6 orange Makierten Messzeitpunkt fälschlich „Plastik“ ausgeben. Dies hat uns verdeutlicht, dass die Messung zu einem zufälligen Moment, der nur den Bruchteil einer Sekunde dauert stattfindet und gegebenenfalls nicht dann, wenn das Ereignis stattfindet. Deswegen ist es sehr wichtig interrupts zuverwenden.

Lichtschranke

Für die Lichtschranke haben wir eine Infrarot Lichtemittierende Diode (LED) und einen Infrarot Phototransistor (PT) genommen. Infrarotlicht aus dem Grund, damit Streulicht die Messung nicht beeinflusst und verfälscht. Infrarotlicht kann vom menschlichen Auge nicht wahrgenommen werden, es kann jedoch durch eine Handykamera sichtbar gemacht werden um zu testen ob es an ist. Die beiden Bauteile sind in einem Abstand von 10cm an den Flüglen am vorderen Teil von AlboT gegenüber voneinenander befestigt. Das einfallende Licht des infraroten Spektrums lässt im Phototransitor durch photoelektrische Prozesse 3) einen geringen Strom fließen welcher vom Phototransistor um einen festen Wert vertärkt wird. Somit gilt: Desto stärker die einfallende Lichtintensität desto höher der Strom desto höher der von Arduino ausgegebene Wert.

In dem von uns angebrachten Abstand beträgt der gemessene Wert nie unter 20cm, wenn die Lichtschranke undruchbrochen ist. Diesen Wert haben wir daher in unserem Programm als den Wert messungNormal deklariert. Fällt der Messwert unter diesen Wert, bedeutet das für Arduino, dass die Lichtschranke durchbrochen ist wodurch wie im Funktionsdiagramm ersichtlich, die Materialmessung und Greifarmfunktionen ausgelöst werden. Da die Flügel jedoch bis zu diesem Zeitpunkt noch wackeln kommt es jedoch durch die Vibration der Bewegung häufig zu einer Veränderung des Abstandes der Flügel, wodurch sich LED und PT weiter von einander entfernen und in Folge dessen die Lichtintenstiät sinkt, ohne das ein Objekt die Schranke durchbricht. Auch hierdurch kann der Wert messungNormal unterschritten werden und die nachfolgenden Funktionen werden fälschlicherweise ausgelöst, obwohl kein Objekt da ist.

Greifarm

Mit dem Greifarm soll AlboT nach den gefundenen Objekten greifen, sie aufheben, über den entsprechenden Behälter transportieren und dort ablegen und loslassen. Der Arm ist in drei Teile gegliedert:
greifarm_albot_schema.jpg
Abbildung 7: Beschriftete schematische Abbildung des Greifarms

Servoarm1 wird durch Servo1 von 0° bis 90° bewegt. Servoarm2 wird druch Servo2 von 130 bis 100° bewegt. Servogreifarm wird durch Servo3 bewegt, wodurch die Greifzange geöffnet bzw. geschlossen wird um Objekte zu greifen. Die Bewegung ist von 160° bis 0° Wie genau sich die Armteile bewegen müssen um das Objekt zu greifen wurde durch Schätzungen ermittelt und durch ausprobieren verfeinert. Der Arm bestehend aus den beschrieben Gliedern ist auf einen Stepper Motor montiert, der sich, nachdem der Arm ein Objekt aufgehoben hat, für Metall um 89 steps nach rechts, und für Plasik um 178 Steps nach links bewegt. Damit ist der Greifer dann über dem entsprechenden Behälter und das Objekt wird losgelassen. Dann bewegt sich der Stepper um 178 Steps zurück in die Grundposition.
winkel_albot.jpg
Abbildung 8: Schematische Draufsicht / Darstellung des Winkels alpha

Die Stepanzahl 89 ermittelt sich aus dem Winkel α zwischen dem Mittelpunkt der Behälter und der Grundposition des Greifarms. Der Winkel α = 160°. Geteilt durch den Stepwinkel β = 0.9° ergibt sich gerundet die Stepanzahl.

α    : β    = Stepanzahl 
160° : 0.9° = 177.77 

Für die Greifarmbewegung haben wir die Funktionen „greifen“ und „loslassen“ und für die horizontale Drehbegung die Funktionen „drehenLinks“ und „drehenRechts“ geschrieben.

Videoaufnahme

Technische Daten

Verwendete Bauteile

Bauteil/Material Anzahl
Arduino Nano 1
Stepper Motor 1,8° Stepwinkel 2
Stepper Motor 0,9° Stepwinkel 1
Stepper Motor Treiber Polulu A4988 3
Ultraschall Sensor 1
Metal Touch Sensor 1
Lichtschranke (IR LED & IR Phototransistor) 1 (1&1)
Servo Motoren 3
Breadboard 2
Holz
Klett
Kabel
Isolierband

Arduino Pin Belegung

Analog Pin Funktion Bezeichnung Pin Mode
A0 Direction Pin Stepper 1 dir1 Output
A1 Step Pin Stepper 1 step1 Output
A2 Direction Pin Stepper 2 dir2 Output
A3 Step Pin Stepper 2 step2 Output
A5 IR Phototransistor PT Input
A6 Direction Pin Stepper 3 dir3 Output
A7 Step Pin Stepper 3 step3 Output
Digital Pin Funktion Bezeichnung Pin Mode
3 Metal Touch Sensor / Interrupt Pin finger Input
4 IR LED LED Output
6Ultraschall Sensor Trigger Pin trigger Output
7Ultraschall Sensor Echo Pin echo Input
8 Servo Arm 1 servoArm1
9 Servo Arm 2 servoArm2
10Servo Greifarm servoGreifarm

Ergebnis und Diskussion

In der vorgesehenen Zeit haben wir eigentlich alles geschafft was wir in der Planung als „Must have“ vorgesehen hatten, allerdings funktioniert AlboT nicht zuverlässig. AlboT bewegt sich (wenn auch stockend) wie vorgesehen, kann (manchmal) Objekte anfahren und kann durch den Metal Touch Sensor Objekte in die Kategorien Plastik und Metall unterscheiden. Auch das Greifen funktioniert mittlerweile, jedoch kann sich der Greifarm noch nicht auf der Horizontalen Ebene drehen.

Ursachen für die Unzuverlässigkeit sind unter anderem, dass die Flügel an die die Lichtschranke befestigt ist wackelig ist, wodurch schnell der Wert für die Lichtschranke unterschritten wird, wodurch AlbOT diese als durchbrochen wahrnimmt und in folge dessen Anhalt und das Objekt greifen möchte, auch wenn gar keines da ist. Die lässt sich aber vermutlich durch leichte bauliche Verbesserungen beheben, die wir im Blockkurs noch vornehmen möchten.

Anfangs war geplant, das AlboT sich über Sensoren im Raum orientieren kann und Hindernisse von Müllobjekten unterscheiden und umfahren kann, was wir aber bald verworfen haben, da wir bemerkten, dass allein das Anfahren der Objekte viel Zeit in Anspruch genommen hatte, denn viel zu lange hatten wir Probleme mit der Bewegung von AlboT, was daran lag, dass wir den Potentiometer an den Stepper Treibern lange nicht richtig eingestellt hatten.

Eine Sache die wir nicht bedacht hatten ist wie das Eigengewicht des Greifarms die eigene Bewegung behindert. Wir haben viel Zeit verloren, da wir lange zu schwache Motoren verwendet haben. Ein weiteres Problem hier war, dass wir den Arm fertig gebaut haben und erst dann die Einzelheiten getestet haben. Dies ist auch der Grund, weshalb das Drehen nicht funktioniert, da der verwendete Stepper zu schwach ist. Auch das möchten wir in der verbleibenden Zeit noch verbessern, testen, korrigieren.

Diese Fehler hätten durch Umfangreichere Testphasen nach jeden Teilschritt und umfangreichere Recherchen vermieden werden können. Leider haben wir teilweise auch unpräzise gebaut und nur grob abgeschätzt anstatt genau zu messen. Der Ultraschallsensor wird zum Beispiel vom Metal Touch Sensor gestört, wodurch die Messungen verfälscht werden. Ebenso stört der Metal Touch Sensor teilweise die Lichtschranke.

Eine Mögliche Weiterentwicklung wäre das Anbringen weiterer Sensoren zur Orierntierung im Raum, wofür die Ergebnisse des Projekts MaPBot aus diesem Semester sicher interessant wären. Die Unterscheidung zwischen Müllobjekten und Hindernissen könnte beispielsweise anhand der Größe geschehen oder anhand bestimmter Farbcodes, wofür jeodoch eine Kamera und damit Rasberry Pi verwendet werden müsste.

Alles in Allem sind wir trotz Fehlern zufrieden mit unserem Projekt, wir hatten eine sehr gute Teamarbeit und haben viel gelernt. Wir freuen uns auf letzte Verbesserungen im Blockkurs.

Code

Zip mit dem Code (Stand 17.07.2019)
albot_programm_doku.rar

Quellen

Abildung 2 wurde mit draw.io erstellt.

Zu Interrupt und Flags:

Zu Ultraschall Entfernungsmessung:

Zu Stepper Motor & Treiber:

Zu Metal Touch Sensor:

projektesose19/abotpublic/start.txt · Zuletzt geändert: 2020/02/25 17:23 von d.golovko