Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektews2013:wwsr:start:projektdokumentation

Projektdokumentation

Autoren:
  • Yuri Gbur
  • Florian Beier

1. Aufgabenstellung

Der WWSR soll per Antenne eine WLAN-Quelle orten und sich in Richtung der Quelle bewegen können, mit dem Ziel einem mobilen WLAN-Gerät z.B. einem Handy zu folgen. Zudem soll der WWSR seine Umgebung per Ultraschall wahrnehmen und somit Hindernissen auf dem Weg zur WLAN-Quelle ausweichen. Im Fall der Umgebungswahrnehmung soll beachtet werden, dass der Roboter kleine Hindernisse, wie z.B Kabel, nicht als Grund zum ausweichen betrachtet. Optional, je nach Zeit und Möglichkeiten, soll der WWSR eine Ladefläche besitzen, mit der er kleine Gegenstände transportieren kann und einen zweiten WLAN-Modus, mit dem man ihm über eine mobile Application Befehle zur Fahrtrichtung geben kann.

2. Allgemeiner Ablauf

Als erstes haben wir uns die WLAN-Antenne vorgenommen, sodass sie die WLAN-Stärke in eine Richtung verstärkt wahrnehmen kann. Der nächste Punkt war dann eine Möglichkeit zu finden, bei der wir die WLAN-Antenne um 360° rotieren lassen können. Danach haben wir angefangen das Robotergerüst zu bauen. Darauf folgte dann die Montierung der Räder mit den dazugehörigen Motoren. Zum Schluss wurden dann der Ultraschallentfernungsmesser (mit Servo) zusammen mit dem Arduino, der WLAN-Antenne und weiterem Zubehör am Robotergerüst befestigt. Momentan beschäftigen wir uns mit der Handy-Applikation.

3. Teilschritte

3.1 Roboter-Gerüst

Wir verwenden als Material hauptsächlich Holz, da wir damit die besten Möglichkeiten erzielen stabil und gleichzeitig flexibel zu bauen. Zum aktuellen Zeitpunkt haben wir die Stepper-Motoren mit jeweils vier M3 Schrauben an ein trapezförmiges Holzbrett geschraubt und diese wiederum mit kleinen Holzklötzen an die Hauptfläche montiert. Die Hauptfläche ist 8-eckig, allerdings nicht durchgehend symmetrisch. Zur Frontrichtung haben wir die Grundfläche etwas länger gemacht, um ein drittes Rad befestigen zu können. Die verlängerte Spitze gewährleistet auch, dass der Roboter beim drehen an anderen Stellen nirgends hängen bleibt. Die komplette Konstruktion ist ungefähr 30cm lang, 20cm breit und die Grundplatte ist c.a. 8cm vom Boden entfernt (dort wo die Motoren sind ist die Höhe geringer). Die Kabel für die Motoren sind durch Löcher nach oben auf die Grundplatte geführt.

(Längenangaben sind nicht zu 100% genau!)

3.1.1 Materialien:
  • Holzplatte DIN A4 für die Grundplatte
  • 2x Holzplatte trapezförmig zur Befestigung der Räder
  • 4x Holzklotz zur Befestigung der Radkonstruktion
  • Bewegliches Rad am besten gleichgroß wie die anderen beiden Räder
  • Entsprechend Schrauben, Unterlegscheiben und Muttern

3.2 WLAN-Antenne:

3.2.1 Integrierung des WiFly-Chips:

Als erstes haben wir versucht, das WLAN-Modul („RN-XV WiFly Modul“) über den Arduino einzustellen und eine Verbindung zu einem zweiten WLAN-Gerät herzustellen. Das größte Problem dabei war die Einstellung der Baudraten, um die Kommunikation die jeweiligen Komponenten zu gewährleisten. Besonders sollte man hier darauf achten, dass der verwendete Microcontroller die benötigten Baudraten unterstützt. Gewählt haben wir eine Baudrate von 115200, das ermöglicht eine Datenübertragungsrate von 11520 byte/s bzw. 11,52KB/s. Wir haben uns für den Arduino Mega entschieden, da dieser alle notwendigen Baudraten unterstützt und zu dem eine serielle Schnittstelle auf Hardware-Basis besitzt, die sich für die Verbindung zum WiFly-Modul anbietet. Zudem ist die von uns verwendete „WiFly“ Bibliothek sehr groß und verursacht unerklärliche Abstürze, wenn der Speicher voll ist, was bei kleinerem Microcontrollern (wie z.B. dem Arduino Nano) durchaus passieren kann.

3.2.2 Die Yagi-Uda-Richtantenne:

Nach erfolgreichem Einrichten einer WLAN-Verbindung zwischen dem Arduino und einem Netzwerk, haben wir uns überlegt, wie wir die Antenne so modifizieren können, dass wir die Möglichkeit haben die Richtung des Signalursprungs zu ermitteln. Die Grundüberlegung die wir hatten, war eine sich im Kreis drehende Richtantenne (ähnlich wie ein Radar), da wir nur mit einer Antenne die Richtung bestimmen wollen und nicht den Ursprung über mehrere Antennen anpeilen müssen. Nach einigem Recherchieren haben wir dann die sogenannte „0-Euro-Antenne“ gefunden (http://www.heise.de/netze/artikel/Die-0-Euro-Antenne-223704.html). Dieser Antennenaufbau lässt sich mit geringen Materialkosten und gut zugänglichen Materialien bauen. Mit einem Styropor-Block und den Kupferdrähten eines Starkstromkabels haben wir den Aufbau umgesetzt. Dabei traten die Probleme auf, dass erstens die Abstände und die Länge der Drähte sehr genau abgemessen werden müssen und zweitens die Antenne der Standardausführung des RN-XV zu kurz ist, um die Richtantenne sinnvoll daran zu montieren. Ein weiteres Hindernis war, dass das uns bis dahin zugängliche Treiber-Shield zusätzlich noch einen Motortreiber für Schrittmotoren hatte, dessen Kühlkörper viel Platz weggenommen hat. Inzwischen verwenden wir 2 neue Komponenten, einen neuen WLAN-Chip (RN-XV mit SMA-Connector für eine größere Antenne) und ein neues Shield nur für WLAN-Chips, welche den Aufbau vereinfacht haben und unter anderem mit einer weiteren, platzsparenden zweiten Version der Antenne, die Richtungsbestimmung präziser ermöglicht haben. Achtung, die Abstände der Pins auf dem neuen Shield sind kleiner als die Pins der sonst im Labor verwendeten Komponenten. Wenn man die Kontakte Löten möchte, empfiehlt es sich die Kabel ein zweites mal zu befestigen, damit die Verbindungsstellen beim drehen der Antenne nicht so stark belastet werden. Aus Erfahrung lohnt es sich nicht die Kontakte zu isolieren, da so, gerade durch die hohe Belastung,leicht nun nicht mehr sichtbare Kontaktbrüche entstehen können.

3.2.3 Abschluss:

Die ganze Konstruktion haben wir dann probeweise auf einem Servo-Motor montiert, um zu testen, ob sich die Antenne auch automatisch in die richtige Position ausrichtet. Das hat ohne große weitere Modifikationen der Antenne schnell funktioniert und wir konnten anfangen die Antenne auf einen Stepper-Motor mit 360° Drehwinkel zu montieren (Auf die Stepper-Motoren gehe ich später bei der Einstellung der Räder genauer ein). Da wir keine Schleifringe zu Verfügung haben, die uns die Möglichkeit gegeben hätten kontinuierlich die Antenne im Kreis zu drehen, haben wir den Quellcode so geschrieben, dass der Stepper-Motor nach 360° die Richtung wechselt und wieder zurück läuft, um ein Aufwickeln der Kabel zu verhindern ( Quellcode).

Hier sieht man das Ergebnis einer 360° Messung (Linksklick zum vergrößern). Dabei haben wir den Steppermotor auf dem die Richtfunkantenne befestigt ist, sechs Minuten lang mit einem Grad pro Sekunde drehen lassen. Der auf dem Bild dargestellte gelbe Kreis zeigt eine sehr starke Intensität (-43dB)1) und der rote Kreis eine sehr schwache Intensität (-65dB). Die stärkste Intensität findet sich auf ca. einem Achtel des Kreises wieder, was für die Antenne eine horizontale Streuung von knapp 40° bedeutet. Es ist klar, dass der Roboter nicht bei jedem Einschalten und zur Neuorientierung ganze 6 Minuten „setup-time“ benötigen darf. Dahingehend werden wir weiter experimentieren, wie schnell der Steppermotor maximal sein darf, bis die Messwerte zu stark abweichen.

3.2.4 Materialien:
  • Styropor-Block (c.a 15cm x 5cm x 2cm)
  • RN-XV Chip mit SMA-Connector
  • Antenne mindestens 7cm lang
  • Wlan-Chip-Shield
  • Stepper-Motor
  • Motortreiber
  • Kondensator
  • Holzklotz in Größe des Shields
  • Pappe zur Stabilisation der Antenne
  • Holzklotz als Sockel für die Antenne
  • Gewindestäbe (lang genug, um den StepperMotor mit dem Sockel zu befestigen) sowie Unterlegscheiben und Muttern

3.3 Räder / Stepper-Motoren:

Ein Steppermotor (auf deutsch Schrittmotor) ist ein Motor, der ein elektromagnetisches Feld erzeugt, wodurch sich der Rotor dreht. Insgesamt sind im Roboter drei dieser Motoren verbaut (1 für die Antenne und 2 für die Räder). Dieser Motor eignet sich gut für die Antenne, da er in der Lage ist sich um 360° zu drehen, was für die hier zwingend notwendig ist. Noch essentieller sind die Motoren für die Räder, da sie sich theoretisch ewig in eine Richtung drehen können ohne, dass sich Kabel aufwickeln.

Die Motoren werden nicht direkt an den Arduino, sondern stattdessen über einen sogenannten Treiberchip (A4988 - siehe Rechts). Dieser bietet uns ein einfaches Interface zum Einstellen der Geschwindigkeit und der Drehrichtung.

Das Anschließen der Stepper-Motoren sollte hier präzise nach Anleitung vorgenommen werden, da wir hier zu der vom Arduino unterstützen 5.5V Stromversorgung noch eine Stromquelle mit höhere Spannung benötigen (Wir verwenden 12V, was unter ungünstigen umständen durchaus einen USB-Port am PC/Laptop beschädigen könnte).Deshalb ist hier auch die Einstellung des Treiberchip und des Schaltkreises besonders wichtig (Siehe: http://www.pololu.com/product/1182). Die Stepper sind so eingestellt, dass eine 360° Drehung in 200 „steps“ also Schritten erfolgt. Für unsere Räder haben wir diese Einstellung nicht weiter verändert. Unsere Antenne jedoch, wurde so eingestellt, dass eine 360°-Drehung in 1600 steps erfolgt. Dadurch verläuft die Bewegung der Antenne wesentlich flüssiger.

3.3.1 Materialien:
  • 2x Stepper-Motor
  • 2x Räder, Durchmesser 9cm
  • 2x Motorentreiber
  • 2x Kondensator

3.4 Ultraschallsender / -empfänger:

Zur Raumwahrnehmung des Roboters benutzen wir das Ultraschallwellen-Modul HC-SR04. Dieses Modul sendet ein Ultraschallsignal aus, welches auf ein Objekt trifft, reflektiert wird und es wieder auffängt. Das Modul errechnet aus der Zeit die das Schallsignal benötigt hat die Entfernung zum Objekt aus.

Wir haben unter anderem ein paar kurze Tests vorgenommen, um die maximale/minimale Reichweite zu testen, die Messgenauigkeit zu bestimmen und den ungefähren Winkel (die im Datenblatt genannten 15° sind leider sehr ungenau) in dem das Ultraschallgerät Gegenstände wahrnimmt zu ermitteln. Es empfiehlt sich bei der Standardausführung des Moduls den 5V-Pin und den Ground-Pin mit einem Kondensator zu verbinden, um einen kontinuierlichen Stromfluss zu gewährleisten.

Eine weitere Überlegung zur Umgebungswahrnehmung war, ob man mehrere Sensoren verwendet oder ob sich ein schwenkbarer Sensor mit Hilfe eines Servos eher anbietet. Wir haben uns für letzteres entschieden, um nicht noch mehr Messwerte zu erzeugen, die man abgleichen müsste. Eine erste, theoretische Code Version dafür: Quellcode und eine Einführung in die Servosteuerung bei mit Arduinos: http://arduino.cc/de/Reference/Servo.

3.4.1 Materialien:
  • HC-SR04 Sonar-Modul
  • Servomotor mit 180°
  • Holzklotz zur Befestigung des Moduls am Servo

4. Fernsteuerung per WLAN/Android Applikation

Dieser Prozess ist noch in Bearbeitung. Ersteinmal haben wir ein zweites WiFly-Modul an den Arduino angeschlossen. Dies ist essentiell, da der WiFly zum Messen der WLAN-Stärke in einen anderen Modus als zum Senden/Empfangen von Daten sein muss. Die Umsellung von einem Modus (finishCommand() - Messen der WLAN-Stärke, startCommand() - Senden/Empfangen von Daten) in den anderen dauert ca. 500ms. Diese Wartezeit macht eine „Realtime“-Scannung nicht möglich. Daher benutzen wir zwei WiFly-Module, eins das konstant in der Lage ist zu senden/empfangen und eins der dauerhaft die WLAN-Stärke messen kann. Bisher haben wir es geschafft die Daten der 360° WLAN-Scannung auf dem Handy zu empfangen und in einem sich selbst aktualisierenden und skalierenden Graph darzustellen. Rechts ein Foto zur Veranschaulichung.

5. Der Algorithmus

5.1. Die Initialisierungen

Als erstes importieren wir die Notwendigen Header-Dateien. Danach werden die Instanzen für unsere Komponenten erstellt so wie einige Variablen die später für den Algorithmus im Loop notwendig sind. In unsrem aktuellen Aufbau werden für die Räder die Pins 26|28|30|32 verwendet und für die Stepperantenne die Pins 22|24. Die Komponenten die nicht in der WWSR.ino Dateien initialisiert werden, werden in den einzelnen Klassen von den Konstruktoren instanziiert.

5.2. Das Setup

Im Setup wird die Baudrate für den Serial-Monitor auf 115200 gesetzt. Allerdings dienen die die Ausgaben über den Monitor, seit wir die WLAN-Übertragung der Daten mit dem zweiten Chip eingebaut haben, nur noch dem Debugging. Als zweites werden die beiden WLAN-Chips mit einem Router oder einem anderen Hot-Spot verbunden. Wichtig ist dabei, dass die Richtantenne mit dem WLAN-Gerät verbunden wird, zu dem der Roboter fahren soll. Die Einstellungen dazu werden in der connect() Methode der Stepper-Antenne vorgenommen. Die Zeilen für Name, Passwort usw. sind in der Methode durch entsprechende Kommentare gekennzeichnet. Anschließend wird der Servo einem Pin zugewiesen (wir verwenden den Pin 42) und auf 90 Grad ausgerichtet, damit der Schallsensor in Fahrtrichtung ausgerichtet ist. Die 99, die über den Serial-Monitor ausgegeben wird, ist nur für das Processing Programm relevant mit dem wir die graphische Darstellung der Messwerte erzeugen. Als letztes wird im Setup bereits die erste Ausrichtung durchgeführt. Die Methode roboterAusrichtung() funktioniert wie folgt: Die Richtantenne dreht sich gegen den Uhrzeigersinn um 360 Grad. Während der Drehung misst sie immer wieder die Signalstärke zum mit sich verbundenen Router. Der höchste gemessenen Wert wird in einer Variable gespeichert zusammen mit der Step-Anzahl die an dem Punkt der höchsten Messung zurück gelegt wurde. Diese Step-Anzahl wird dann einer Methode übergeben, die diese umrechnet in die Anzahl der Steps, die die Räder drehen müssen damit sich der Roboter im richtigen Winkel ausrichtet.

5.3. Der Loop

Am beginn des Loops wird davon ausgegangen, dass der Roboter bereits Ausgerichtet ist. Das passiert entweder im Setup oder am Ende eines Loop-Durchgangs. Der Loop beginnt damit, dass der Roboter geradeaus fährt. Während er in die Richtung fährt in die er sich ausgerichtet hat, überprüft er regelmäßig ob der Ultraschallsensor Gegenstände, die in Fahrtrichtung stehen, ortet und/oder ob die „Bumper“ an den Flügeln vor den Rädern betätigt sind. Wenn der Ultraschallsensor einen Gegenstand ortet, wird die ausweichen Methode aufgerufen und wenn einer der „Bumper“ reagiert, setzt der Roboter ein Stück zurück und weicht entgegengesetzt der Richtung des ausgelösten „Bumpers aus. Die Ausweichmethode hat beginnt damit, dass der auf dem Servo montierte Ultraschallsensor nach rechts und links um 90 Grad geschwenkt wird, dabei wird überprüft in welcher der beiden Richtungen mehr platz ist. Je nach Ergebnis der Messungen reagiert der Roboter unterschiedlich. Sollte in eine der Richtungen mehr als 50 cm platz sein dreht sich der Roboter in diese Richtung und fährt gerade aus. Die Maximale Distanz bis zum nächsten Hindernis wird in einer Variable gespeichert und der Roboter fährt obwohl er mit dem Ultraschallsensor in die Ursprüngliche Fahrtrichtung misst nicht gegen ein anderes Hindernis. Falls der Roboter während diesem Schritt eine Lücke findet, dreht er sich in die ursprüngliche Fahrtrichtung und führt eine erneute Messung durch. Sollte der Fall nicht gegeben sein misst der Roboter direkt neu. Der zweite Fall ist, dass der Roboter in eine Richtung weniger als 50 cm hat, aber mehr als 20 cm. dann dreht der Roboter um und fährt in die entgegengesetzte Richtung um dann mit dem oberen Schritten weiter zu machen. Im dritten Fall, fährt der Roboter Rückwärts, wenn er rechts und links zu wenig Platz hat um zu drehen und verfährt dann wie in den anderen Fällen. Ein weiterer wichtiger Bestandteil beim Seitwärts zu einer Wand fahren nach dem ersten Ausweichen ist die Möglichkeit des Roboters geringfügig die Fahrtrichtung zu korrigieren, wenn die Wand dem Schallsensor zu nahe kommt. Ein weitere Bestandteil der auf Grund der Zeit nicht mehr zustande gekommen ist, wäre die „Bumper“ auch während des Ausweichens sinnvoll zu integrieren um das Ausweichen zu optimieren und die Kollisionsgefahr zu verringern.

6. Aktueller Stand/Ergebnis

29.03.2014 | 02:41

Bis jetzt haben wir den Roboter weitestgehend fertig. Der WWSR ist in der Lage das WLAN-Signal auf mittlere Distanz (~5 meter) zu orten und sich dementsprechend auszurichten. Er fährt auf diese Quelle zu bis er auf ein Objekt trifft, und weicht daraufhin intelligent aus. Nach dem Ausweichen richtet sich der Roboter erneut aus. Als nächstes werden wir noch einen „Stoßsensor“ vorne anbauen, für den Fall, dass der Roboter an ein Objekt stößt. Sollte dies der Fall sein soll der WWSR dieses Objekt umfahren. Dieser „Bumper“ ist vorallendingen dann notwendig wenn, das im Weg stehende Objekt zu niedrig für den Entfernungsmesser ist. Desweiteren arbeiten wir noch an einer Handy-Applikation, die es uns erlaubt die Daten der Sensoren auszulesen bzw. den Roboter selber zu steuern.

6.1 Fotostrecke zur Entwicklung des WWSR

7. Pintabelle des Arduino

Art Pin Verwendungszweck
Communication Serial3 (TX) WiFlychip I - RX (Antenne)
Communication Serial3 (RX) WiFlychip I - TX (Antenne)
Communication Serial2 (TX) WiFlychip II - RX (Fernsteuerung)
Communication Serial2 (RX) WiFlychip II - TX (Fernsteuerung)
Digital 22 Steppermotor der Antenne - DIR
Digital 24 Steppermotor der Antenne - DIR
Digital 26 Steppermotor des rechten Rades - STEP
Digital 28 Steppermotor des rechten Rades - DIR
Digital 30 Steppermotor des linken Rades - STEP
Digital 32 Steppermotor des linken Rades - DIR
Digital 34 Ultraschallentfernungsmesser - Trigger
Digital 36 Ultraschallentfernungsmesser - Echo
Digital 42 Servo - Digitalpin (orange)
Digital 46 Linker „Bumper“ - Digitalpin
Digital 48 Rechter „Bumper“ - Digitalpin
Power 5V Logikstrom (5V)
Power GND Ground
Power VIN 12V (Batterie)

Es ist anzumerken, dass sämtliche Quellcodes für das Verständnis der einzelnen Funktionsweisen des Roboters dienen. Das komplette Programm findet ihr unter dem Namen Robotik.zip im Quellcodes-Verzeichnis. Das Programm wurde objektorientiert programmiert, das heißt das es in mehrere Klassen aufgeteilt ist. Falls es selbst nach genauerer Betrachtung Schwierigkeiten im Verständnis gibt, verweisen wir auf die einzelnen Quellcodes und diesen Artikel: Klassen und Objekte.

1) In der Nachrichtentechnik verwendet man oft die Maßeinheit Dezibel (dB). Das Dezibel ist ein logarithmisches Maß und vereinfacht die Berechnung der Verstärkung bzw. Dämpfung komplexer Systeme.
projektews2013/wwsr/start/projektdokumentation.txt · Zuletzt geändert: 2016/01/21 12:45 (Externe Bearbeitung)