Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise1617:colordecisionpublic:start

Dokumentation

Die Aufgabe des Labyrinthors ist, wie der Name es schon andeutet, sich in einem Labyrinth zurecht zu finden. Dabei wird mithilfe von einem RGB-Sensor und Farbigen Wänden bestimmt, wann er in welche Richtung abbiegen soll. Der Farbsensor ist an der Vorderseite des Roboters angebracht. Von dort aus kann er immer rechtzeitig das entsprechende Signal zum Abbiegen weitergeben. Durch die geraden Gänge bewegt sich der Labyrinthor mittels zweier Abstandsmesser, welche auf der linken Seite des Roboters montiert sind. Sie messen in bestimmten Intervallen den Abstand zur Linken Wand an zwei Punkten und sorgen wenn nötig für eine Korrektur der Fahrtrichtung des Roboters um eine Kollision zu verhindern.

Ähnliche Projekte:
Mit drei Ultraschall-Abstandsmessern
Roboter der Linien Labyrinthe löst

Überblick

Baugruppen des Roboters

Grundplatte: Die Bestandteile des Roboters sind auf und unter einer länglichen, achteckigen Grundplatte aus Holz angebracht. Dazu sind zusätzlich noch einige Holzklötze für die Sensoren und das zweite Breadboard montiert worden.

Sensorik: Auf der Linken Seite befinden sich zwei Ultraschallabstandsmesser (blau umrandet) und an der Front ein RGB-Farbsensor (rot umrandet). Unter dem Farbsensor ist eine Taschenlampe mit einem Drahtgestell befestigt.

Verkabelung: Die Breadboards auf denen alles zusammengesteckt ist (gelb umrandet) sitzen mit dem Arduino Nano relativ sicher vor Erschütterungen (o.ä.) mittig auf dem Roboter.

Stromquelle: Auf dem hinteren Ende der Grundplatte sind ein Lithium-Ionen Akku und ein Batteriewächter (orange umrandet) angebracht.

Fahrwerk: Die Schrittmotoren (grün umrandet) sind an der Unterseite der Grundplatte rechts und links mittig angebracht. Am Heck befindet sich noch ein Rad ohne Motor, das für Gleichgewicht sorgt.

Teilprobleme

Kollisionsfreies und gerades Fahren: Damit der Roboter nicht auf den geraden Passagen des Labyrinths an einer Wand hängen bleibt und damit er im geraden Kurs auf die Farbkarten zufährt, muss sicher gestellt werden, dass er sich an den geraden Wänden des Labyrinths orientiert und sich in einem festen Abstand zu ihnen bewegt.

Abbiegen: Wenn der Roboter auf eine Kurve zufährt an deren Ende sich ein farbiger Karton befindet, muss er sich drehen und in einer geraden Linie weiter fahren. Besonders problematisch sind dabei Linkskurven, da der Roboter aufgrund der Position der Abstandsmesser auf der linken Seite keine Möglichkeit hat, sich an einer Wand zu orientieren.

Kollisionsschutz rechte Wand: Dadurch, dass sich auf der rechten Seite keine Sensoren befinden, kann es zu einer Kollision kommen.

Ultraschall und flüssige Fahrt: In vorherigen Versionen haben die Abstandsmesser mit ihren Messungen (die eine gewisse Zeit dauern) die Schrittmotoren negativ beeinflusst.

Ausgeklammerte Teilprobleme

Lichtverhältnisse: Die Fahrt des Roboters muss unter bestimmten Lichtverhältnissen stattfinden, da sonst die Messewerte des RGB-Sensors zu sehr abweichen. Wenn der Roboter in Richtung des Tageslichts fährt macht er unberechenbare Dinge, wie zum Beispiel eine plötzliche 90° Drehungnach rechts oder links. Selbst mit erneuter Kalibrierung vor jeder Fahrt kann nicht exakt auf Schatten oder direkte Sonne reagiert werden. Deshalb muss jegliche Fahrt bei zugezogenen Vorhängen und angeschalteter Raumbeleuchtung ausgeführt werden.

Details Systembestandteile

Ansteuerung Motoren

Bei der Ansteuerung der Motoren ergaben sich mehrere Probleme; Die Arduino Stepper Library erwies sich als wenig nützlich, da es mit ihr nicht möglich ist die Motoren jeweils einzeln anzusteuern und damit die Räder unterschiedlich schnell fahren zu lassen. Das ist für den Roboter aber durchaus wichtig, also ist schlussendlich die Accelstepper Library zum Einsatz gekommen. Hiermit ergab sich dann die Problematik eine 90° Drehung zu implementieren, da es bei Accelstepper nur zwei Möglichkeiten zur Verwendung gibt:

* Mit Beschleunigung und festem Bewegungsziel: Hierbei schreibt man im Setup:
> Stepper.setMaxSpeed(float Zahl);
> Stepper.setAcceleration(float Zahl);
> Stepper.moveTo(long Zahl);
Im Loop schreibt man dann:
> Stepper.run();
Um den Roboter dann flüssig fahren zu lassen muss diese Funktion immer wieder so oft und schnell wie möglich hintereinander aufgerufen werden.

  • konstantes Fahren:

In den Setup schreibt man folgendes:
> Stepper.setMaxSpeed(float Zahl);
> Stepper.setSpeed(float Zahl);
In den Loop schreibt man dann:
> Stepper.runSpeed();
Das funktioniert dann ähnlich wie run();, muss also auch immer wieder aufgerufen werden, bewegt den Roboter aber ohne Weiteres zu keinem bestimmten Ziel und gibt auch immer nur die Möglichkeit einen Schritt zu machen, wenn der Motor ausreichend Zeit dazu hat.

Im Programm wurde letzere genutzt. Beide Möglichkeiten miteinander zu kombinieren war bisher nicht möglich. Daher sind die oben genannten Funktionen move(), und moveTo(); nicht nutzbar.

Jetzt erfüllt das Blink-Programm (für die Motoren angepasst) in einer for-Schleife die Aufgabe. Hierfür müssen die mit den Motoren verbundenen Pins im Setup auf pinMode(Pin, OUTPUT) gesetzt und in die loop-Funktion dann die gewünschte HIGH-LOW Reihenfolge für die jeweiligen Pins in die Schleife geschrieben werden. Es ist zu empfehlen sich an dieser Stelle klar zu machen, welcher der Direction-Pin und welcher der Step-Pin ist.
Das kann man an der Unterseite der Treiber sehen:

Messung Farbe

Der Farbsensor misst bei jedem Aufruf die Farbanteile (Rot, Grün, Blau) der Fläche, bzw. Umgebung vor ihm. Die Schwierigkeit hier ist der Einfluss von verschiedenen Lichtverhältnissen auf die Ergebnisse der Messung. Da die Werte unter verschiedenen Lichteinflüssen stark schwanken war es schwierig passende Grenzwerte im Program fest zu legen. Die Werte der Farben untereinander zu vergleichen war auch keine zufriedenstellende Lösung, da diese nicht ganz proportional zueinander sind.

Am Ende funktionierte es am besten ein bestimmtes Lichtverhältnis auszuwählen und die Schwankungen bei Änderungen desselben außer Acht zu lassen. Der Farbsensor misst nun für sein Program am geeignetesten, wenn kein (oder nur wenig) Tageslicht vorhanden, aber die Raumbeleuchtung eingeschaltet ist.

Die Grenzwerte wurden dem Durchschnitt einer bei den oben genannten Verhältinssen durchgeführten Messung entnommen. Nach Rundung der Werte ergaben sich für Rot 10 und für Blau 13. Grün hat keinen Schwellenwert, da diese Farbe im Proramm nicht genutzt wird.

Die Messergebnisse:

Auf diesen Abbildungen ist gut zu erkennen, wie sehr die Werte, trotz des sich nicht verändernden Umfeldes, schwanken. Außerdem ist zu erkennen, dass die Werte der jeweils vorliegenden, bzw. gemessenen Farbe in der Regel niedriger sind als die der anderen.

Links: blaue Pappe, Rechts: rote Pappe

Eine Art Kollisionsschutz ergibt sich für den Roboter daraus, dass er bei weißen Wänden nur sehr niedrige Farbwerte misst. Dadurch dreht er sich bei Kontakt mit einer solchen um 90° und kann dann ungehindert weiter fahren. Besteht also die Rechte Wand nur aus weißem, oder generell sehr hellem Material, sollte er ungestört das Labyrinth durchqueren können.

Die Ansteuerung des TCS3200 läuft so ab, dass je nach dem welcher Farbanteil gemessen werden soll, die Pins S2 und S3 HIGH bzw. LOW geschrieben werden. Dadurch filtert der Sensor die Farbanteile und gibt die Werte dazu aus. Mit S0 und S1 werden die Werte skaliert; bei 100% (S0 -HIGH und S1-HIGH] gehen die Werte bis maximal 255, bei 20% (S0-HIGH, S1-LOW) sind die Werte niedriger. Hier ein Link zu einem Datasheet mit den vollständigen Tabellen und noch einigen Zusatzinformationen: TCS3200

Schrittzahl 90 grad Drehung

Für die Berechnung der Schrittzahl einer 90 grad Drehung werden zunächst folgende Angaben benötigt:

Raddurchmesser = 9cm

Abstand Rad-zu-Rad = 25,2cm

Schrittzahl für 360 grad Drehung eines Rades = 200 (Kann von bei verschiedenen Schrittmotoren variieren)

Bei der Drehung des Roboters bewegen sich die Motoren mit gleicher Geschwindigkeit in entgegengesetze Richtungen. Der Drehpunkt liegt daher in der Mitte zwischen den Rädern, woraus sich ergibt:
Dreh-Radius = 25,2 / 2 = 12,6 cm.

Nun wird die Strecke berechnet, welche ein Rad bei der 90 grad Drehung des Roboters zurücklegt:
Strecke = 2*π*Dreh-Radius/4 = 19,792 cm.

Als nächstes wird der Umfang eines Rades berechnet:
Radumfang = 2*π*Radradius = 28,2743 cm.

Damit kann nun die benötigte Anzahl der Raddrehungen bestimmt werden:
Anz.Raddrehungen = Strecke / Radumfang = 19,792 / 28,2743 = 0,6999.

Nun ist es möglich die Schrittzahl für eine 90 grad Drehung auszurechnen:
Anz.Raddrehungen*200 = 139,8 ≈ 140 Steps.

Messung Abstand

Die Abstandsmesser funktionieren folgendermaßen: Wird der Trig-Pin (Trigger) HIGH geschrieben, sendet der Abstandsmesser für eine Zeitspanne ein Ultraschallsignal aus. Dieses trifft z.B. auf eine Wand und wird zurückgeworfen. Der Echo-Pin fängt diese Reflektion auf und liest die Zeit, die der Impuls hin und zurück gebraucht hat, in Mikrosekunden aus. Die Umrechnung in Zentimeter erfolgt dann mithile der Schallgeschwindigkeit in der Rechnung: Zeit/ 29.1/ 2. (29.1µs/cm ist die Lichtgeschwindigkeit)

Die beiden Abstandsmesser sind mit einem gewissen Abstand auf der linken Seite des Roboters angeordnet. Sie messen dabei parallel zueinander, wobei die Position der Sensoren so gewählt wurde, dass sie sich beim Messen nicht in die Quere kommen.

Der vordere und der hintere Sensor messen gleichzeitig alle 100 Millisekunden den Abstand zu der linken Wand. Dafür wird die millis-Funktion genutzt. Bei jeder Messung wird gespeichert, wann diese stattgefunden hat, und es wird erst dann wieder gemessen, wenn 100 Millisekunden seit der letzten Messung vergangen sind.

Nun wird die Differenz zwischen dem vorderen und dem hinteren Wert ausgewertet. Ist der vordere Wert kleiner als der hintere, bewegt sich das Fahrzeug auf die linke Wand zu. Also wird das linke Rad beschleunigt und das rechte verlangsamt um den Kurs zu korrigieren. Ist der hintere Wert kleiner als der vordere wird das rechte Rad beschleunigt und das linke verlangsamt.

Um eine Beschleunigung zu erreichen, die der Abweichung von der Strecke angemessen ist, wird mit Proportionalität gearbeitet. Die Differenz wird mit einem Korrekturfaktor multipliziert und, solange die Wände einen geringeren Abstand als 30 Zentimeter haben, vorzeichenrichtig auf die Geschwindigkeit der Motoren addiert. Diese Begrenzung ist darin begründet, dass der Roboter sonst bei Linkskurven versagen würde, da die Abstandsmesser mangels Wand keine richtigen Ergebnisse zurückgeben.

Je nachdem welches Vorzeichen die Differenz hat, wird das entsprechende Rad beschleunigt bzw. verlangsamt und je größer der Betrag der Differenz ist, desto stärker wird die Geschwindigkeit des entsprechenden Motors geändert. Mit dieser Methode wird der Kurs ständig angepasst und es wird sichergestellt, dass der Roboter mit keiner Wand kollidiert.

Im vorherigen Build des Roboters (Abstandsmesser links und Rechts) ergab sich das Problem, dass die Abstandsmesser die Fahrt des Labyrinthors beeinträchtigten. Inzwischen ist dies zwar nicht mehr so, allerdings sind in der Nachfolgenden Textdatei nochmal einige Möglichkeiten zur Behebung dieses Problems aufgelistet:
ultraschallproblem.docx

Ablauf der Programms

Fährt der Roboter nun, arbeiten all diese Programmbausteine zusammen. Der Labyrinthor misst ständig die Farbwerte um rechtzeitig abzubiegen und vergleicht alle 100 Millisekunden die Abstände zur linken Wand um sich den Gang entlang zu bewegen. Trifft er auf eine blaue oder rote Karte führt er automatisch eine 90 grad Drehung aus und kehrt wieder zu dem normalen Ablauf zurück.

Technische Daten

Bauteile:

  • 1 Arduino Nano
  • 1 RGB Farbsensor TCS3200
  • 2 Utraschall-Abstandsmesser HY-SRF05
  • 2 Bipolare Schrittmotoren + Räder
  • 2 A4988 Pololu Treiber
  • 2 Kondensatoren: beide mit der Kapazität von 100uF, einer mit der Spannungsfestigkeit von 16V und der andere mit einer von 25V
  • 1 Lithium-Ionen Akku
  • 1 Batterie Wächter
  • 2 Breadboards
  • Diverse Kabel, Schrauben, Gummiringe und Kleber
  • Holz

Pinbelegung (Tabellarisch) :

pinverteilung.pdf

Schaltplan:

Ergebnis und Diskussion

Aufbaubedingungen

1. Das Labyrinth muss von Tageslicht abgeschirmt werden, durch zugezogene Gardinen und eingeschaltete Raumbeleuchtung

2. Die Wände müssen einen Abstand haben, der dem Roboter eine volle Drehung erlaubt

3. Am Ende eines Gangs, dass heißt in einer Kurve, muss sich eine rote oder blaue Karte befinden, welche die gesamte Fläche der Wand bedeckt

Optional 4. Die rechte Wand kann weiß oder grau sein, um zu garantieren, dass der Roboter dort nicht hängen bleibt.

Ergebnis

Werden die Aufbaubedingungen erfüllt, arbeitet der Roboter sehr zuverlässig. Es gilt nur den Roboter in seine Ausgangsposition am Anfang des Labyrinths zu bringen und den Akku zu verbinden, den Rest erledigt er selbst. Er behält eine gerade Fahrtrichtung bei und kollidiert nicht mit den Wänden. Kommt er an einer Kurve an, kann er sich neu ausrichten und seinen Weg durch den nächsten Gang fortsetzen.

Diskussion

Wie man an den Aufbaubedingungen erkennt, liegt das größte Problem bei dem Farbsensor.

Die Messung der Farbwerte fanden unter Bedingungen statt, die einfach zu rekonstruieren waren, um für Konsistenz zu sorgen. So war es möglich sicher zu gehen, dass der Roboter sich mit diesen Werten im Labyrinth zurecht findet. Sonneneinstrahlung und daraus resultierende Schatten verfälschen die Farbwerte so stark, dass es nicht prognostizierbar ist, was der Roboter misst. Der Roboter führt dann Bewegungen aus, die zu Kollisionen mit den Wänden führen und kann somit nicht mehr zuverlässig arbeiten.

Außerdem muss der Roboter sehr nah an die farbigen Karten heran fahren, um eine Farbe zu registrieren. Dies bewirkt, dass der Roboter nur wenig Platz zum Drehen hat und die Karten entsprechend groß sein müssen, damit sicher gestellt wird, dass der Roboter, egal in welchem Winkel und Abstand er in die Kurve fährt, auf die Karte trifft. Dieses Problem lässt sich teilweise durch die Verwendung einer Taschenlampe lösen, welche die Rechweite des RGB-Sensors erhöhen kann. Jedoch sollte berücksichtigt werden, dass diese nicht zu hell sein darf um die Werte nicht zu sehr zu verfälschen und zu vermeiden, dass der Roboter sich durchgehend auf der Stelle dreht.

Präsentation

Quellcode

Frühere Versionen des Programms und Code-Fragmente:

diverse_programme.zip
test_programme.zip

Das Hauptprogramm mit verwendeten Librarys:

haupt_programm.zip

Bilder

Vorheriger Build

Jetziger Build

projektewise1617/colordecisionpublic/start.txt · Zuletzt geändert: 2017/05/24 16:14 von c.jaedicke