Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise21:laderoboterpublic:start

Ladimir

Einleitung

Unser Projekt “Ladimir” stellt eine mobile Ladestation dar. Er ist in der Lage nach Aufruf durch eine Handyapplikation zu dem Nutzer zu fahren und ihm eine Auflademöglichkeit bereitzustellen.

Er empfängt über eine Webcam an der Decke via Bluetooth ein Signal mit der Information wo sich der Nutzer befindet. Dies funktioniert, indem die Webcam ein Bild an einen Computer sendet, dieser das Bild dann durch eine Farberkennungssoftware analysiert und daraufhin berechnet wohin der Laderoboter fahren muss. Der Roboter hat zwei Farben (Blau, Gelb) das Ziel hat eine rote Mütze auf und die Ladestation hat die Farbe Grün.

Nach der Berechnung fährt der Laderoboter auf dem kürzesten Weg zum Zielort. Wenn er auf dem Weg auf ein Hindernis trifft, welches durch seine Abstandssensoren erkannt wird, umfährt er dieses und erhält erneut ein Signal mit Wegbeschreibung. Wenn er am Ziel ist wartet er auf ein erneutes Signal der Handyapplikation um wieder zurück zur Ladestation zu fahren.

Methodenteil

Überblick über das Gesamtsystem

In diesem Teil stellen wir unser Projekt in Bezug auf die einzelnen Bestandteile und Arbeitsschritte vor, die wir während der Fertigstellung des Roboters abgearbeitet haben.

Baugruppen

Zu lösende Aufgaben

  • Schaltkreis für Steppermotoren erstellen
  • Fahrbewegung programmieren
  • Programm für Hindernisumfahrung schreiben
  • Schaltkreis für Abstandssensoren erstellen
  • Programm für die Abstandsmessung programmieren
  • Farberkennungsprogramm schreiben
  • Holzplatte und -säulen sägen
  • Bluetooth Modul konfigurieren und entsprechendes Programm zur Kommunikation schreiben
  • Fahrgestell zusammenbauen
  • Steuerung der einzelnen Programme durch ein allumfassendes Programm erstellen

Bewusstes Ausklammern von Aufgaben

  • eine Hebebühne für die Powerbank bauen und programmieren
  • Herausreichen des Kabels durch den Roboter
  • Lokalisieren des Handys durch Bluetooth Signal
  • Person darf sich nicht konstant bewegen (nur wenn ein Hindernis vor dem Roboter liegt, da er dadurch eine neue Wegbeschreibung erhält)

Skizzen/Fotos des Gesamtsystems

Abschnitte zur Beschreibung von Details der einzelnen Systembestandteile

Farberkennungsprogramm

Da der Laderoboter eine Wegbeschreibung zum Zielort braucht brauchten wir eine Lösung, wie wir das realisieren konnten. Daraufhin ist uns eingefallen, dass wir das Problem mittels Farberkennung lösen können, indem wir jedem relevanten Objekt eine markante Farbe zugewiesen haben. Umgesetzt haben wir das durch die verschiedenen RGB-Werte der Farben Rot, Grün, Blau und Gelb, weil diese sehr unterschiedlich in ihren RGB-Werten sind. Das Programm stellt sich das von der Webcam erhaltene Bild wie ein dreidimensionales Koordinatensystem vor und prüft systematisch den Abstand zwischen dem Wert des aktuellen Pixels und dem der gesuchten Farbe. Jede Farbe hat im 3D RGB Koordinatensystem eine bestimmte Position. Dadurch gilt der Abstand zur gesuchten RGB-Position als Skala wie sehr sich die Farben unterscheiden.

Da es auch einzelne Pixel im Bild gibt, die auch eine der Farben entsprechen, werden Durchschnittswerte gebildet, die ermitteln sollen, wo sich die meisten Pixel der Farbe befinden, damit die Position nicht zu stark schwankt.

Dieser Prozess wird vier mal durchlaufen, damit die Positionen aller Farben lokalisiert werden. Anschließend wird basierend auf den Positionen der Farben ein Winkel berechnet, um wie viel Grad sich der Roboter drehen muss, um gerade auf den Zielort zu gucken, damit er nur noch geradeaus fahren muss. Der Winkel wird durch den Kosinussatz berechnet wie in folgender Abbildung dargestellt:

Bluetooth Kommunikation

Wir haben zwei verschiedene Module verwendet: Zum einen ein HC-05 Bluetooth Modul für die Kommunikation zwischen Handy und Arduino, zum anderen ein HC-06 Bluetooth Modul für die Kommunikation zwischen Processing und Arduino. Die Module wurden mit dem Arduino zusammen auf eine Steckplatine gesteckt. Pro Modul waren jeweils vier Pins zu verwenden: Den fünf Volt Pin von dem Modul mit dem fünf Volt Pin des Arduinos, den Ground Pin mit dem Ground Pin des Arduinos, den Transmitter Pin mit einem beliebigen digitalen Pin und den receiver Pin mit einem beliebigen digitalen Pin.

Der receiver Pin musste über Widerstände mit dem Arduino verbunden werden, da die Spannung zwischen Arduino und dem Modul unterschiedlich ist und bei längerer Verwendung würde eine der beiden Komponenten kaputt gehen. Die Handykommunikation dient zum starten des Fahrvorgangs, entweder zum Ziel oder zur Ladestation der Power Bank. Dafür haben wir eine Applikation rausgesucht, auf der zwei Buttons einzustellen waren, ein Button für die Hinfahrt und einer für die Rückfahrt zur Ladestation.

Processing dient zur Berechnung des Fahrwinkels entweder zur Ladestation oder zum Menschen. Unser Code für die Bluetooth Kommunikation beider Bluetooth Module startet mit der Klasse #include <SoftwareSerial.h>. Sie erlaubt der Arduino IDE Bluetooth Objekte zu entwickeln und auch mit diesen zu arbeiten. In dem darauffolgenden Setup haben wir die Kommunikation zwischen Processing und Arduino und zwischen dem Handy und Arduino gestartet. Außerdem haben wir Objekte erstellt, einmal Bluetooth Handy und Bluetooth Processing . Im Setup werden diese Objekte genutzt, um somit eine Serielle Kommunikation zu starten. Diese Objekte werden auch in zwei Funktionen verwendet, in Bluetooth Handy (btHandy) und Bluetooth Processing (btProcessing).

Beide Funktionen laufen ungefähr gleich ab. Bluetooth Handy erstellt eine Variable mit dem Datentyp “char”, da die Applikation den Buchstaben H oder Z ausgibt. H steht für die Person und Z ist die Ladestation. Die Variable “machen” wird dann mit dem abgeglichen was rauskommt, bei H kommt “hello world” und bei Z “hello” als Kommunikation. Bei Bluetooth Processing wird ebenfalls ein Variable erstellt, diese hat aber den Datentypen “string”, da es eine längere Nachricht ist, die von Processing kommt, eben der ausgerechnete Winkel. Der Winkel wird von Processing an Arduino geschickt. Arduino kann diesen Winkel nutzen, um damit zu entscheiden, wohin er als nächstes fahren muss.

Entfernungsmessung

In dem Programm für die Entfernungsmessung werden die Messwerte von zwei Entfernungssensoren berechnet. Das Programm beginnt mit der Zuteilung der Analogen Pins zu den jeweiligen Echo- und Trigger-Pins der Sensoren. Der Trigger-Pin aktiviert eine Ultraschallwelle, die Solange im Raum umherwandert, bis diese auf ein Hindernis stößt. Die Ultraschallwelle wird dann reflektiert und in Richtung des Sensors zurückgeworfen. Dieser nimmt dieses Signal dann mit dem Echo-Pin auf. Im Programm wird im ‘void setup’ der Serielle Monitor mit ‘Serial.begin(9600)’ gestartet. Desweiteren werden den Trigger- und Echo-Pins ihre Aufgaben mitgeteilt. Daraufhin wird dann mit dem “wichtigen” Teil des Programms fortgefahren: Dem ‘void loop’. Im ‘void loop’ wird ein Programm-Block zweimal geschrieben, weil die beiden Sensoren das gleiche ausführen. Beginnend mit der Deklarierung zweier Variablen ‘duration 1’ und ’entfernung 1’ mit dem Datentypen long -Die eins steht hier für den ersten Sensor -. Danach wird der Trigger-Pin, mit Verzögerungen von 2 und 10 Mikrosekunden, an, aus und dann wieder ausgeschaltet. Das initiiert das aussenden des Ultraschalls. Die Variable ‘duration 1’ wird mit dem anschalten des Echo-Pins gleichgestellt, was dazu führt, dass die Dauer, die das Ultraschall von Trigger-Pin zum Hindernis und wieder zurück gebraucht hat in einer Variable gespeichert ist mit der wir dann die Entfernung berechnen können. In ‘entfernung 1’ wird dann eben diese Entfernung berechnet mit der Formel: (duration 1 / 2) * 0.03432. ‘duration 1’ wird hier durch zwei geteilt, weil der Ultraschall die doppelte Strecke zum Hindernis braucht, weil es sich hin und her bewegt. Die Multiplikation mit der kleinen Zahl 0.03432 ist die Schallgeschwindigkeit. Nach Berechnung der Entfernung wird ein If-Else-Statement gestartet: Wenn ‘entfernung 1 >= 500’ dann ist das Hindernis nicht in einem für uns relevanten Bereich. Wenn dieser Fall jedoch nicht eintreten sollte wird uns ‘entfernung 1’ über den Seriellen Monitor angegeben.

Fahrbewegung

Die Klasse Fahrbewegung hat drei Methoden (geradeausFahren, drehungNachLinks und drehungNachRechts). Die Parameter der Methoden sind immer die übergeben Schritte mit dem Datentyp integer. In den drei Methoden ist jeweils eine for-Schleife die durch die Abbruchbedingung ‘schritte>0’ automatisch ausschließt, dass es zu einer unendlich laufenden for-Schleife kommt falls ein negativer Wert für die Variable ‘schritte’ übergeben wird. Die Update-Bedingung aller for-Schleifen ist ‘schritte–’.

In der Methode ‘geradeausFahren’ wird abwechselnd das linke und rechte Rad nach vorne gedreht. Am Ende der Schleife wird die Entfernung durch den Methodenaufruf ‘messeEntfernung’ gemessen, damit der Roboter nicht gegen ein Hindernis fährt, während er die for-Schleife durchgeht. Falls er kein Hindernis entdeckt, geht er die for-Schleife weiter durch. Falls er ein Hindernis entdeckt ruft er die Methode ‘umfahreHindernisse’ auf. Die Methode ‘drehungNachLinks’ ist ähnlich aufgebaut. Wie stark sich der Roboter drehen soll wird über die Variable ‘schritte’ geregelt (desto größer diese ist, desto mehr dreht sich der Roboter). Allerdings wird hier am Ende nicht die Methode ‘messeEntfernung’ aufgerufen, da er sich ja nicht nach vorne bewegt und somit nicht gegen ein Hindernis fahren kann. In der Methode dreht sich abwechselnd das linke Rad vorwärts und das rechte Rad rückwärts, wodurch eine Drehbewegung entsteht.

Die Methode ‘drehungNachRechts’ ist gleich aufgebaut wie ‘drehungNachLinks’, nur dass sich hier das linke Rad vorwärts und das rechte Rad rückwärts dreht.

Hindernisumfahrung

Die Hindernisumfahrung wird durch die Methode ‘umfahreHindernisse’ in der Datei ‘umfahreHindernisse’ realisiert. In dieser Methode wird die Methode ‘drehungNachRechts’ aus der Datei ‘Fahrbewegung’ aufgerufen und die Anzahl an Schritten, die man für eine 75 Grad Drehung braucht, werden der Methode übergeben. Danach wird die Methode ‘geradeausFahren’ ebenfalls aus der Datei ‘Fahrbewegung’ aufgerufen. Hiernach wird die Entfernung durch die Methode ‘messeEntfernung’ aus der Datei ‘messeEntfernung’ aufgerufen.

Als Letztes wird durch den Methodenaufruf ‘btProcessing’ eine neue Route/Wegbeschreibung erfragt, weil der Roboter danach ja in eine andere Richtung schaut.

Allumfassendes Programm

Das allumfassende Programm ‘Ladimir’ verbindet alle Arduino und Processing Programme miteinander. Anfangs werden die PIN’s des Motors und des Abstandssensors festgelegt. Danach werden Variablen für die verschiedenen Programme deklariert. Außerdem werden die Receiver und Transmitter PIN’s für die Bluetooth Kommunikation festgelegt. Anschließend werden in der setup Funktion die Motor PIN’s als Output gesetzt. Dann werden die Trigger PIN’s für die Abstandsmessung auf Output gesetzt und die Echo PIN’s auf Input. Zudem wird die Baud Rate auf 9600 bits pro Sekunde gesetzt.

Darüber hinaus werden Einstellungen für die Bluetooth Kommunikation vorgenommen. Als letztes wird die loop Funktion aufgerufen. In dieser wird die Kommunikation zwischen Handy und Arduino sowie Processing und Arduino ermöglicht (wie im vorherigen Abschnitt Bluetooth Kommunikation erwähnt). Zusätzlich wird die Methode ‘geradeausFahren’ aus der Datei ‘Fahrbewegung’ mit 100 Schritten aufgerufen. Das wird dann solange wiederholt bis der Roboter an seinem Ziel angekommen ist. Bau des Fahrgestells

Wir haben uns für das Fahrgestell für einen runden Körper entschieden, da er eine sichere Tragfläche für die Powerbank darstellt und Wegänderungen und Kurven leicht meistern kann. Aufgrund unserer mangelnden handwerklichen Fähigkeiten war der Bau des Fahrgestells eine der größten Herausforderungen und hat auch verhältnismäßig viel Zeit in Anspruch genommen.

Erstellen der Schaltkreise

Unser Projekt beinhaltet verschiedene Schaltkreise, die in der Theorie einfach zu verarbeiten waren, aber in der Praxis zu Verzweiflung führten. Es wurden Schaltkreise für die Entfernungssensoren, Steppermotoren und Bluetooth Kommunikation gemacht. von Links nach Rechts ihrer Schwierigkeit her gelistet. Der Schaltkreis für die Steppermotoren stellte kein Problem dar, weil dieser sehr einfach im Internet zum nachbauen zu finden war. Bei dem Steppermotoren-Schaltkreis sah es jedoch ganz anders aus. Erstmal mussten wir feststellen, dass wir mehr Energie für die Motoren brauchten als der Arduino liefern hätte können. Also mussten wir 8V Schaltkreis installieren mit sogenannten Treibern. Diese Treiber haben den Arduino mit den Motoren verbunden während diese noch Strom von einer anderen Quelle bekommen haben, damit sie das ausführen konnten, was im Programm steht, was sie ausführen sollen. Zu guter letzt kommt also noch die Bluetooth-Kommunikation-Schaltung. Diese war besonders schwer zu bauen, weil sich keiner in unserer Gruppe besonders gut mit Widerständen auskannte und es viel Zeit gekostet hat die richtigen Widerstände heraus zu suchen. Widerstände waren von Nöten, weil die Bluetooth-Modul(e) und der Arduino mit verschiedenen Spannungen funktionieren und wenn man die Widerstände rausgelassen hätte wäre einer dieser Komponenten mit Sicherheit über längere Zeit hinweg Kaputt gegangen. Die Schaltkreise der Entfernungssensoren und der Steppermotoren schlussendlich zusammen zu bringen war auch eine anstrengende Arbeit.

Ergebnisse

  • Schaltkreis für Steppermotoren
  • Fahrbewegung programmieren
  • Schaltkreis für Abstandssensoren
  • Programm für die Abstandsmessung programmieren
  • Programm für Hindernisumfahrung
  • Farberkennungsprogramm schreiben (Wegbeschreibung)
  • Holzplatte und -säulen sägen
  • Schaltkreis für Bluetoothmodule
  • Bluetoothmodul konfigurieren und entsprechendes Programm zur Kommunikationschreiben
  • Fahrgestell zusammenbauen
  • Steuerung der einzelnen Programme durch ein allumfassendes Programm erstellen
  • Allumfassende Testläufe

Die obigen Stichpunkte demonstrieren unsere Ergebnisse, wobei Grün die Dinge demonstriert, die wir bereits geschafft haben, Gelb diese, an denen wir gearbeitet haben, welche jedoch noch nicht fertig geworden sind. Wir sind durch die gelben Stichpunkte zu noch keinem endgültig fertigen und funktionsfähigen Programm gekommen, weshalb es uns nicht möglich ist, allumfassende Testläufe mit dem Roboter zu machen.

Code

Fazit

Im Hinblick auf die nächsten Wochen wollen wir die Bluetooth Kommunikation optimieren, zum Beispiel im Arduino Programm Kanäle zu wechseln. Im Farberkennungsprogramm gibt es ebenfalls noch Verbesserungspotenzial, hier müsste man beide Winkel gleichzeitig übergeben, damit vom Arduino aus entschieden werden kann, ob der Weg zum Signalsender gesucht wird oder der Weg zur Ladestation. Zusätzlich haben wir in dem zusammengeschriebenen Programmcode noch nicht implementiert, ab wann der Arduino weiß, dass er sein Ziel (z.B. Person oder Ladestation) erreicht hat. Abschließend sind Testläufe geplant.

Für die langfristige Weiterentwicklung ist der Bau der Wireless Charging Station der Powerbank eine Option. Zusätzlich gibt es die Möglichkeit, eine Hebebühne anzubauen, wodurch die Powerbank auf die Höhe der Person gehoben wird und einen Arm anzubauen, der die gewünschten Kabel für die Person herausgibt. Außerdem kann man die Position der Kamera ebenfalls noch verbessern, indem man sie auf dem Roboter befestigt und nicht an der Decke, somit wäre es dann dem Roboter auch möglich, unter Tischen hindurch zu fahren.

projektewise21/laderoboterpublic/start.txt · Zuletzt geändert: 2022/05/14 19:26 von d.golovko