Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise20:schluesselpublic:start

Projekdokumentation Schlüsselbot

Einleitung

Zu Beginn unseres Projekts haben wir die Aufgabenstellung unseres Roboters auf ein simples „Such einen Schlüssel“ begrenzt. Im weiteren Verlauf ist uns aufgefallen, dass aus dieser einzelnen Hauptaufgabe viele Unterkategorien entstanden sind, die wiederum die Hauptaufgabe beeinflussten, sodass der Roboter zum aktuellen Stand des Projekts nun Objekte finden und sogar erkennen kann. Das wiederum bedeutet, dass sich die Hauptaufgabe unseres Roboters von „Such einen Schlüssel“ zu „Such meinen Schlüssel“ entwickelt hat. Dabei fährt der Roboter auf einem Tisch unbestimmter Größe herum und sucht nach dem richtigen Gegenstand, indem er jedes Objekt auf dem Tisch untersucht. In unserer Projektarbeit hatten wir das Glück, eine Gruppe aus dem letzten Semester zu finden, die einzelne Schritte ähnlich wie wir angegangen sind, sodass wir uns dort einzelne Problemstellungen und deren Lösungsansätze anschauen konnten. Hierbei ist die Rede vom ReMix-Roboter:

https://www.mintgruen.tu-berlin.de/robotikWiki/doku.php?id=projektewise1617:remixpublic:start#projektdokumentation.

Überblick über das Gesamtsystem

Aufgaben

Die wichtigsten Aufgaben bestanden darin, den Roboter fahren zu lassen, ihn Gegenstände erkennen zu lassen und zwischen richtigen und falschen Gegenständen zu unterscheiden. Außerdem wollten wir verhindern, dass er Kanten hinunterfallen könnte.

Aufbau

roboteroben.jpg
Abbildung 1: Roboter von oben
robotervorne.jpg
Abbildung 2: Roboter von vorne
Gestell

Zu Beginn unseres Projekts haben wir uns entschieden, ein bereits vorhandenes Gestell eines anderen Roboters zu nutzen, anstatt ein neues zu bauen, um direkt mit der aufgabenspezifischen Arbeit anfangen und Zeit im Labor sparen zu können. Dieses Gestell besteht aus zwei (nahezu) runden Holzplatten, die übereinander angebracht wurden. Dazwischen befanden sich bereits zwei Schrittmotoren, die die beiden gesteuerten Räder bewegen, die links und rechts angebracht sind. An der vorderen Unterseite befindet sich ein zusätzliches, nicht ansteuerbares Rädchen, das der Stabilisation dient.

Elektronik

Der Roboter wird mit einem Arduino Nano gesteuert, einem sehr kompakten Microcontroller, der durch verschiedene analoge und digitale Ein- und Ausgänge (Pins) die unterschiedlichen Bauteile ansteuern kann. Ein Programmcode, der in der dazugehörigen Software Arduino geschrieben wurde, reguliert die Spannung an den entsprechenden Pins, die entweder 0 oder 5 Volt betragen kann, wodurch die Bauteile gesteuert werden. Diese sind alle über ein Breadbord mit dem Arduino verbunden, welches sich mittig oben auf unserem Roboter befindet.

Akku und LiPo - Batteriewächter

Ebenfalls an das Breadbord angeschlossen ist ein 7,4 Volt – LiPo - Akku, welcher für die nötige Stromversorgung sorgt und es dem Roboter ermöglicht, sich frei zu bewegen, ohne an ein Netzteil angeschlossen zu sein. Er liefert außerdem die nötige Spannung für die Motoren, für die die 5 Volt des Arduinos nicht ausreichen. Zur Kontrolle des Akkustands und Schutz vor Tiefenentladung ist ein LiPo – Batteriewächter am Akku angebracht.

Die Motoren, Räder und Treiber

Wie bereits erwähnt, bewegt sich der Roboter mit zwei Schrittmotoren, an die Räder befestigt sind, fort. So kann man über einzelne „Schritte“ der Motoren die Räder sehr genau steuern und nach vorne oder hinten drehen. Für die Kontrolle der Motoren werden Treiber benötigt, die zwischen dem Arduino und den Motoren geschaltet sind.

Die Ultraschallsensoren

Insgesamt haben wir drei Ultraschallsensoren an unserem Roboter angebracht. Einen nach vorne gerichteten, um Gegenstände zu erkennen, und zwei nach unten gerichtete, um Höhenunterschiede zu erkennen und den Roboter so davor zu schützen, eine Kante hinunterzufallen. Der erste Ultraschallsensor befindet sich 3,5 cm über dem Boden in der Spitze einer V-förmigen Konstruktion, die für die richtige Platzierung des Gegenstands sorgt. Die anderen beiden Ultraschallsensoren haben wir mit Aluminiumplatten an den vorderen beiden Seiten des Roboters in 8,5 cm Höhe angebracht, sodass sie etwas über die Kante hinausragen. So messen sie die Tiefe etwas vor den Rädern. Auf diese Weise kann der Roboter anhalten, bevor die Räder über eine Kante fahren.

RFID - Modul

Um einen speziellen Gegenstand unter vielen zu erkennen, nutzen wir einen RFID – Leser, der am Roboter angebracht ist, und einen RFID – Chip, der nur am richtigen Gegenstand befestigt ist. So kann der Roboter zwischen richtigem und falschem Objekt unterscheiden, indem er nach einem RFID – Signal sucht. Dabei befindet sich der RFID - Leser direkt über der V-förmigen Spitze, um in ausreichender Nähe des Gegenstands zu sein und ein mögliches Signal empfangen zu können.

Was der Schlüsselbot bewusst nicht kann

Wir haben uns entschieden, den Roboter nicht zwischen Wänden und Gegenständen unterscheiden zu lassen, da in der aktuellen Situation Wände keine Rolle spielen. Wenn er nun auf eine Wand treffen würde, könnte es also dazu führen, dass er diese für einen Gegenstand hält und versucht, sie zu untersuchen. Des Weiteren ist es mit den genutzten Ultraschallsensoren nicht möglich, Gegenstände jeder Größe und Höhe zu identifizieren, zu flache Objekte oder solche mit geringem Volumen werden nicht erkannt. Für unsere Zwecke reicht es jedoch. Außerdem kann der Schlüsselbot nicht zwischen mehreren Objekten mit RFID–Chip unterscheiden. Sobald er einen Chip findet, geht er davon aus, dass es der richtige ist. Eine weitere, nicht verwirklichte Überlegung war es auch, einen Elektromagneten an den Roboter anzubringen, um den Schlüssel aufzuheben.

einzelne Systembestandteile

Arbeit mit den Sensoren

Ultraschallsensoren um Entfernungen zu messen
Abbildung 3: Funktionsweise Ultraschallsensor

https://www.mymakerstuff.de/2016/05/24/arduino-tutorial-der-ultraschallsensor/

Die Ultraschallsensoren arbeiten grundsätzlich alle gleich. Einer seiner Pins, der Trigger – Pin, wird durch den Arduino auf HIGH gestellt. Er sendet eine Ultraschallwelle aus, ähnlich wie eine Fledermaus, die sich so lange ausbreitet, bis sie auf ein Objekt trifft und zurückgeworfen wird. Die zurückkommende Welle trifft wieder auf den Ultraschallsensor und dieser sendet über den Echo – Pin ein HIGH – Signal. Mithilfe der Methode pulseIn können wir die Zeit t, die die Welle gebraucht hat um zurück zu kommen, in einer Variablen speichern. Wenn man diese Variable durch zwei teilt, erhält man die Zeit, die die Welle für die Hälfte der Strecke benötigt hat, also einmal zu dem Objekt hin. Da eine Ultraschallwelle 29,1 Millisekunden braucht um sich einen cm fortzubewegen, kann man die Dauer noch einmal durch diesen Wert teilen, um die zurückgelegten Zentimeter zu berechnen und so den Abstand des Objekts zu erhalten. Somit erhält man die folgende Formel für den Abstand s eines Objekts zum Ultraschallsensor:

s = (t / 2) / 29.1 ms

Dabei sind Ultraschallsensoren jedoch in ihrer Reichweite eingeschränkt, zu große oder zu kleine Distanzen können sie nicht messen und geben falsche Entfernungen zurück. Richtige Messwerte werden ca. zwischen 2 und 300 cm erreicht.

Höhenunterschiede erkennen

Die beiden seitlich vorne angebrachten Ultraschallsensoren dienen dazu, den Abstand zum Boden zu kontrollieren und bei einer zu starken Vergrößerung den Schlüsselbot den Befehl zum Drehen zu geben. In jedem loop()-Durchlauf misst sowohl der linke als auch der rechte Ultraschallsensor die Distanz zum Untergrund, auf dem der Roboter fährt und vergleicht diese mit dem Wert, der am Anfang ein mal gemessen wurde. Ist der neue Wert mehr als 5 cm größer als der vorher gemessene, ist der Abgrund zu hoch und der Roboter muss sich von der Kante entfernen. Wir haben diese beiden Ultraschallsensoren mit Aluminiumleisten an der oberen Platte des Roboters angebracht, diese sind etwas schräg nach außen gerichtet und reichen bis knapp vor die Räder. So messen sie die Höhe schräg vor den Rädern und können sowohl seitliche als auch sich vor ihnen befindende Höhenunterschiede wahrnehmen und ein Signal zum Wenden auslösen, bevor die Räder über eine Kante gefahren sind.

Gegenstände erkennen

Der nach vorne gerichtete Ultraschallsensor hat die Aufgabe, Objekte zu erkennen. Er misst in jedem loop()-Durchlauf, ob sich ein Objekt in direkter Nähe vor ihm befindet. Die „direkte Nähe“ ist im Code frei wählbar, wir haben uns für zwei cm entschieden, da der Ultraschallsensor kleinere Distanzen nicht richtig messen kann. Wenn sich ein Gegenstand in dieser Entfernung befindet, hält der Roboter an und aktiviert den RFID–Leser. Wenn nicht, fährt er weiter. Dies wird mithilfe eines if()-Konstrukts und des zuvor berechneten Abstands ausgeführt.

RFID: den richtigen Gegenstand erkennen

Der RFID – Leser ist direkt über dem vorderen Ultraschallsensor angebaut, sodass wenn er aktiviert wird, sich das Objekt direkt unter ihm befindet. Da er keine große Reichweite besitzt und sich der Chip höchstens auf 2 cm Entfernung befinden darf um zuverlässig erkannt zu werden, sorgt zusätzlich die V–förmige Spitze aus Aluminiumleisten für die richtige Platzierung des Objekts unter dem RFID-Leser. Wird der RFID-Leser aktiviert und erkennt einen Chip, wird durch ein if()– else()– Konstrukt die Information weitergegeben, dass die Suche erfolgreich war und das Ziel erreicht ist. Ansonsten sucht der Schlüsselbot nach dem nächsten Objekt.

Abbildung 4: Verlaufsdiagramm Schlüsselbot

Fahren

Eine Große Hürde für unseren Roboter war das Fahren, da viele Probleme beim Fahren begannen und ohne diesen Schritt der Roboter nicht einsatzbereit war. Nachdem wir festgelegt hatten, dass der Roboter aus zwei Rädern mit jeweils einem Stepper Motor bestand, sowie einem beweglichem extra Rad, machten wir uns an die Programmierung. Wir fingen damit an, die Bewegungsabläufe in verschiedene Kategorien zu gliedern, um so das Problem besser lösen zu können. Zuerst sollte der Schüsselbot geradeaus- und rückwärts fahren, danach links und rechts. Beim geradeaus und rückwärts fahren bewegen sich die beiden Motoren synchron in eine Richtung und beim links und rechts drehen synchron in die entgegengesetzte Richtung. Nach diversen Problemen mit den Treibern und der Spannung und einem Fehler im Code ist unser Schlüsselbot dann letztendlich gefahren. Nun mussten wir nur noch die Bewegungsmuster kalibrieren. Danach bearbeiteten wir die Probleme, die beim Fahren geschehen konnten, wie z.B. Runterfallen oder das Absuchen auf dem Tisch. Um unseren Roboter gegen das Runterfallen zu schützen hatten wir die Idee, unsere Ultraschallsensoren bei einer zu großen Differenz zum vorherigen Wert eine Meldung auszugeben, diese führt zu einem direkten Stopp der beiden Stepper Motoren. Nach einem kleinen Delay bewegt er sich rückwärts und dreht sich dann um 120°, um wieder geradeaus fahren kann und einen anderen Winkel abzusuchen zu können. Der Vorteil bei dieser Suchmethode ist, dass der Roboter von überall starten kann. Diesen Vorgang wiederholt er dann solange, bis er das Objekt gefunden hat. Bei einem falschen Objekt bewegt er sich wieder rückwärts und fährt am Objekt vorbei. So haben wir es geschafft den Runterfall-Algorithmus mit unserem Suchalgorithmus zu verbinden. Zur Kalibrierung der verschiedenen Bewegungsmechanismen waren zum einen die Treiber wichtig, die die nötige Spannung übermitteln, andererseits mussten wir auch berechnen, wie weit der Roboter bei einer Radumdrehung fährt und es auf den Code übertragen. Die Radumdrehung haben wir mit dieser Formel berechnet:

s = r * p
Angaben Werte
Rotationswinkel (p) 125°
Radius ® 4,50 cm
Strecke (s) 56,25 cm

Abbildung 5: Rechenweg Fahren

Daraufhin haben wir in verschieden Tests ausprobiert, wie viele Schritte im Code nötig waren, damit sich das Rad ein mal dreht. Dies haben wir dann in weiteren Versuchen getestet, indem wir den Roboter verschiedene Strecken abfahren lassen haben, sodass sich alle Werte proportional in der Ausführung verändern.

Code Fahrverhalten
400 Schritte Eine Radumdrehung
655 Schritte 360° Drehung des Roboters um die eigene Achse
182 Schritte 100° Drehung des Roboters um die eigene Achse

Abbildung 6: Code Fahrtwerte

Bei der Drehung nach links und lechts traten Fehler auf, da die ausgerechneten Werte durch Krümmungen im Gestell und leichte Produktfehler am Rad nicht genau waren. Nach einigen Test am Roboter haben wir das Problem jedoch annähernd gelöst.
Ein Video des fertigen, fahrenden Roboters ist unter dem Punkt „Ergebnis und Diskussion“ verfügbar.

Technische Daten, Bauteile, Pins

Verwendete Bauteile:
  • Gestell
  • 1x Arduino Nano
  • Kabel
  • 1x Breadboard
  • 3x Ultraschallsensoren HC-SR04
  • 1x RFID Lesegerät RC522 und Chip
  • 2x Steppermotoren
  • 1x LiPo-Akku und LiPo-Akkuwächter
  • 2x Steppermotortreiber
  • 3x Räder
  • 1x Piezo-Lautsprecher

Pinbelegungstabelle:

Pin am Arduino: Funktion/Verbindung:
Digital 2 Direction Pin des rechten Steppermotors
Digital 3 Stepper Pin des rechten Steppermotors
Digital 4 Direction Pin des linken Steppermotors
Digital 5 Stepper Pin des linken Steppermotors
Digital 6 Echo Pin des rechten Ultraschallsensors zur Absturzerkennung
Digital 7 Echo Pin des Ultraschallsensors, um Gegenstände zu erkennen
Digital 8 Echo Pin des linken Ultraschallsensors zur Absturzerkennung
Digital 9 RST Pin des RFID Lesegeräts
Digital 10 NSS Pin des RFID Lesegeräts
Digital 11 MOSI Pin des RFID Lesegeräts
Digital 12 MISO Pin des RFID Lesegeräts
Digital 13 SCK Pin des RFID Lesegeräts
Analog 1 Trigger Pin des linken Ultraschallsensors zur Absturzerkennung
Analog 2 Trigger Pin des rechten Ultraschallsensors zur Absturzerkennung
Analog 3 Trigger Pin des Ultraschallsensors, um Gegenstände zu erkennen
Analog 4 Piezo-Lautsprecher

Abbildung 7: Pinbelegung

Ergebnis und Diskussion

Abbildung 8: Video fertiger Roboter

Der Roboter ist so weit in einem fertigen Zustand. Im Moment kann er sich gut über den Tisch/die Fläche bewegen und dabei Objekte aufspüren und sich auf diese zubewegen. Ebenfalls kann er erkennen, ob er das richtige Objekt gefunden hat, indem er sein RFID-Lesegerät einschaltet und sich versichert, ob er den Chip am Schlüssel auslesen kann oder nicht. Falls dies der Fall ist, gibt er ein akustisches Signal aus und das Programm wird beendet, und falls nicht, sucht er nach weiteren Objekten. Bei der Suche kann es dazu kommen, dass er auf einen Abgrund oder eine zu große Kante stößt, sich daher um 100° dreht und seine Suche fortsetzt. Im Moment kann er aber nicht zwischen einer Wand und einem Objekt bzw. möglichem Schlüssel unterscheiden. Außerdem kann er nicht feststellen, ob es der gesuchte Schlüssel ist, wenn dieser zu niedrig ist oder der Chip am Schlüssel falsch liegt.

Es gibt viele Verbesserungsvorschläge oder Erweiterungsmöglichkeiten für andere Gruppen, die wir leider nicht umsetzen konnten. Man könnte den Prozess der Sensoren möglicherweise optimieren, indem man zum Beispiel andere Sensoren wie Infrarot-Sensoren einsetzt. Ebenfalls könnte man das Erkennungssystem verbessern, indem der Roboter zwischen Wänden und Objekten unterscheidet und so mehr Einsatzmöglichkeiten hat. Eine weitere Verbesserungsmöglichkeit wäre es, auch den RFID-Sensor anders anzubauen, um die Erkennung des Chips nicht abhängig von der richtigen Höhe und Position zu machen. Den Roboter könnte man zudem auch mit einem Elektromagneten (oder ähnlichem) ausstatten, um den Schlüssel aufzuheben und zu einem bestimmten Ort zu bringen. Es wäre auch möglich, zwischendurch eine sichtbare Rückmeldung ins Programm einzubauen, unabhängig vom Elektromagneten.

Nach diesem besonderen ersten Semester sind wir fast fertig geworden mit unserem Projekt. Manche Dinge konnten wir nicht verwirklichen, da wir wegen des verkürzten Semesters nicht so viel Zeit hatten und auch nicht die ganze Zeit in der Uni sein durften. Als erstes haben wir ein bereits fertiges Gestell erhalten, dass uns sonst viel Zeit gekostet hätte. Dadurch konnten wir uns auf andere Dinge mehr konzentrieren. Außerdem hatten wir die Möglichkeit, den Roboter mit nach Hause zu nehmen und dort abwechselnd weiterzuarbeiten, was uns etwas voran brachte, aber deutlich schwieriger war. Letztenendes haben wir die wichtigsten Aufgaben des Roboters fertig stellen können, es besteht aber noch großes Potential für Verbesserungen.

Code

projektewise20/schluesselpublic/start.txt · Zuletzt geändert: 2021/04/23 18:15 von d.golovko