BREMEN MITTE. Lokalisierung eines Roboters innerhalb eines Raumes. ZfP-Sonderpreis der DGZfP beim Regionalwettbewerb Jugend forscht.

Ähnliche Dokumente
Fakultät für Informatik, Institut für Robotik Lego Mindstorms NXT - Programmierung mit JAVA Einführung

Roboterprojekt Bluetooth RC Car

Fakultät für Informatik, Institut für Robotik EV3 - Laborpraktikum I Einführung in die Programmierung mit JAVA

Fakultät für Informatik, Institut für Robotik EV3 - Laborpraktikum II Programmierung mit JAVA

Fakultät für Informatik, Institut für Robotik Laborpraktikum I Legorobotik in JAVA

Programmierung der Lego Mindstorms NXT- Roboter mit lejos!

Arbeit_Roboter. Setze einen Haken bei den Fragen, die du für richtig hältst: Bei Textantworten oder Lückentexten gib jeweils das Ergebnis an.

Inhaltsverzeichnis. 1 Anfang 2. 2 Erste Schritte 3. 3 Schleifen repeat while(true) Die if()-schleife... 5.

Probeklausur Informatik 2 Sommersemester 2013

Seite 1/6. ModellFerienPass.pdf).

Fakultät für Informatik, Institut für Robotik Laborpraktikum I Legorobotik graphische Programmierung

Fakultät für Informatik, Institut für Robotik Laborpraktikum I - Medizinarena Legorobotik in C EV3

8.6 Visualisierung der Sortieralgorithmen

Probeklausur: Programmierung WS04/05

Arbeitsblatt zu Methoden

Programmieren des NXT-Roboters mit LabView 2010

(b.) Welche Möglichkeit gibt es, die Methode run so zu verändern, dass Bora Bora IMMER zuletzt ausgegeben wird?

Arbeitsblatt: Berührungssensor (Posten 1)

Fakultät für Informatik, Institut für Robotik Laborpraktikum I Legorobotik in JAVA EV3

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

System.out.println("TEXT");

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Postenblatt 1: Berührungssensor

Fakultät für Informatik, Institut für Robotik Laborpraktikum I - Medizinarena Legorobotik in JAVA EV3

Objektorientierte Programmierung

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

Vorlesung Informatik II

Aufgabenblatt 8 Musterlösung

Computeranwendung und Programmierung (CuP)

3. Das erste eigene Programm mit Greenfoot: Litte Crab

Einstein-Constructors

Die Denkschule 1 Reto Speerli

Aufgabe Im Quadrat fahren

Einstieg in die Informatik mit Java

Einfache Sortierverfahren in Java, 2. Version

Beispielprüfung CuP WS 2015/2016

Einstieg in die Informatik mit Java

Einfache Sortierverfahren in Java, 1. Version

Eclipse Tutorial.doc

parallele Prozesse auf sequenziellen Prozessoren Ein Process ist ein typisches Programm, mit eigenem Addressraum im Speicher.

Computeranwendung und Programmierung (CuP)

Programmieren in Java -Eingangstest-

Fragebogen zur Programmierung mit Aseba / VPL

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Wie können See how wir far Enchanting away something mitteilen, is. dass am NXT der Lichtsensor an Port 3 angeschlossen ist?

Prozesszustände (1a)

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Technologie. NXT-Hauptmenü My Files

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

OOP: Nebenläufigkeiten Threads. Dipl.-Inform. Arnold Willemer

Früh übt sich, wer ein Meister werden will!

Messungen mit dem Lichtsensor

C# - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue

Programmieren mit RoboLab Bauen mit Lego

import java.applet.applet; import java.awt.*; public class Grow extends Applet { public void start() { setbackground(color.orange); } public void

Parallele Prozesse. Prozeß wartet

Parallele Prozesse Prozeß Parallele Prozesse verzahnte Prozesse Nebenläufige Prozesse: Threads Vorlesung Software-Entwicklung / Folie 131 Ziele:

2 Eine einfache Programmiersprache

Informatik Hochschule Mainz Geoinformatik und Vermessung. Wiederholung. Frohes Fest und Guten Rutsch!

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Lebenszyklus von Threads

Vorkurs Informatik WiSe 16/17

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Ausnahmen

2 Eine einfache Programmiersprache

(C) Sortieren und Suchen mit Java.-AWT Seite 1

pue13 January 28, 2017

Ausnahmebehandlung in Java

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

M3 M4 M7 VORNAME: Gewinnt VERTIEFUNG:

Aufgabenblatt 6 Musterlösung

Je nach Bauweise des Roboters muss forward und backward vertrauscht werden.

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Musterübung 09: Vererbung und Dynamische Bindung

Zentralübung Grundlagen der Programmierung

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II

Informatik II. Semesterklausur

Klausur: Java (Liste P)

double size[][] = {{10.0, 400.0, 20.0, 160.0, 20.0, 400.0, 10.0}, // Columns {10.0, 500.0, 20.0, 180.0, 10.0}}; // Rows

Programmierstarthilfe SS 2010 Fakultät für Ingenieurwissenschaften und Informatik 2. Blatt Für die Woche vom 3.5. bis zum 7.5.

Test-Klausuraufgaben Softwaretechnik Fachbereich BW, für WINFO

Erste Schritte zum Start findest du hier:

2 Eine einfache Programmiersprache

Kurzanleitung RMI-Beispiel: gettime Seite 1 / 7. RMI Projekt gettime 1

Vorkurs Informatik WiSe 17/18

9. Ausnahmebehandlung

Softwarepraktikum Teamrobotik SS 2007

Klausur Software-Entwicklung März 01

Übung 09: Vererbung und Dynamische Bindung

Kapitel 1: Die ersten Schritte 1

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Klausur Software-Entwicklung September 00

Transkript:

ZfP-Sonderpreis der DGZfP beim Regionalwettbewerb Jugend forscht BREMEN MITTE Lokalisierung eines Roboters innerhalb eines Raumes Marco Schuster Schule: Oberschule Habenhausen Jugend forscht 2012

Wichtiger Hinweis: Es ist gestattet diese Arbeit als Grundlage für eine weitere Arbeit zu nutzen, allerdings nur, wenn mein Name und dieses Projekt erwähnt werden. Niemand darf dieses Projekt als sein eigenes betiteln. Lokalisierung eines Roboters innerhalb eines Raumes Jugend forscht 2011/2012 von Marco Schuster (Klasse 8F), Oberschule Habenhausen, Projektbetreuer: Frau Anusche Jalali und Frau Susanne Burchardt 1

Inhaltsverzeichnis Überschrift Seite Titelblatt 1 Inhaltsverzeichnis 2 Einleitung 3 Material und Konstruktion 3-5 Daten 6 Recherchen 6 Grundplan 6-7 Tests und Probleme 7-9 Quelltext 9-15 Aktueller Stand 16 Danksagungen 16 2

Einleitung: Beim Brainstorming in der Schule kam ich auf die Idee einen Kellner-Roboter zu bauen. Dieser sollte in einem Raum seine Position bestimmen können und zu einem bestimmten Tisch fahren können. Also war mein erstes Ziel eine Art Indoor-GPS in einen Roboter zu integrieren. Der zweite Schritt wäre dann die Realisierung einer Transportmöglichkeit auf einem entsprechend größeren Roboter. Material und Konstruktion: Da das Konstruieren und Programmieren damit relativ einfach ist, entschied ich mich für mein Projekt, den LEGO Mindstorms NXT zu verwenden. Diesen musste ich auch nicht kaufen, da ich diesen schon besaß. Dann begann ich einen Roboter mit zwei Motoren, einem Lichtsensor, einem Berührungssensor, sowie einem Ultraschallsensor zu bauen (siehe Bilder). Die Funktion wird später erläutert. Ansicht von vorne Wichtiger Hinweis: Es ist gestattet diese Arbeit als Grundlage für eine weitere 3

Ansicht von links Ansicht von hinten Wichtiger Hinweis: Es ist gestattet diese Arbeit als Grundlage für eine weitere 4

Ansicht von rechts Ansicht von oben 5

Daten: Länge: 20 cm Breite: 15 cm Höhe: 14 cm Anschlüsse: Berührungssensor = Sensoranschluss 1; Lichtsensor = Sensoranschluss 3; Ultraschallsensor = Sensoranschluss 4; Motor links = Motoranschluss C; Motor rechts = Motoranschluss B Recherchen: Zunächst jedoch habe ich mich im Internet über Techniken zur Ortung innerhalb eines Raumes informiert. Das sind die Möglichkeiten inklusive Begründungen für oder gegen diese Techniken: 1. Lasertechnik: Ich habe mich gegen diese Technik entschieden, weil dies viel zu teuer geworden wäre, weil es keine entsprechenden Sensoren für den LEGO Mindstorms NXT gibt und weil Lasertechnik bei Jugend forscht nicht zugelassen ist. 2. Infrarottechnik: Für diese Technik hätte es zwar einen Sensor gegeben, allerdings hätte man aktive Infrarotsender benötigt, die wiederum zu teuer gewesen wären. 3. Ultraschalltechnik: Schließlich habe ich mich für diese Technik entschieden, da ein Ultraschallsensor bereits bei dem LEGO Mindstorms NXT dabei war und weil man keine weiteren aktiven Sender benötigt. Grundplan: Um das Ziel zu erreichen, sah der Plan wie folgt aus: Zunächst gibt man über die Tasten am Roboter eine Zahl für die anzufahrende Koordinate zwischen 1 und 9 ein. Der Roboter fährt anschließend vorwärts gegen die Wand, stoppt dort und durch den Lichtsensor wird die Farbe erkannt. Da alle Wände unterschiedliche Farben haben, kennt der Roboter nun seine Ausrichtung im Raum. Danach fährt der Roboter rückwärts, bis der gewünschte Abstand zu der Wand erreicht ist. Dies wird durch den Ultraschallsensor festgestellt. Nun dreht sich der Roboter 90 um die eigene Achse und fährt entsprechend weit vorwärts oder rückwärts je nach Abstandsmessung. Damit ist dann die gewünschte Position erreicht. Um sich das Testgelände vorstellen zu können, wirde dies in der folgenden Abbildung dargestellt. 6

Testgelände: 1-9 sind die erwähnten Koordinatenpunkte. Die farbigen Kreise definieren Farben der jeweiligen Wände Die 15 cm Randabstand sind realisiert worden, da so der Roboter jederzeit wenden kann. Damit die Ungenauigkeit des Ultraschallsensors nicht stört, sind die weiteren Abstände zwischen den Koordinatenpunkten 25 cm groß. Somit ist das Testgelände 80 cm x 80 cm groß. Tests und Probleme: 1. Entwicklungsumgebung Zunächst arbeitete ich mit der 30 Tage Demoversion von Robot C Developement Enviroment, um eine vernünftige Programmiersprache nutzen zu können. Sonst hätten ich die "Blockprogrammierung" der Originalsoftware des LEGO Mindstorms NXT nutzen müssen. 7

Da, wie der Name schon sagt, diese Version nach Ablauf der 30 Tage Testphase etwas gekostet hätte, sah ich mich auch nach Alternativen um. Dabei entdeckte ich die Erweiterung lejos NXJ für das Programm eclipse. Nach einigem Aufwand der Installation funktionierte diese auch und ich musste den Quelltext von C nach Java übersetzen. Dadurch hatten ich eine kostenlose Entwicklungsumgebung für den LEGO Mindstorms NXT. 2. Test zur Feststellung der Werte des Lichtsensors Material: farbige Wand des Testgeländes, Roboter Versuchsaufbau: Man lässt den Roboter mehrmals und unter verschiedenen Lichtverhältnissen gegen die farbige Testwand fahren und liest die Werte ab, die der Lichtsensor zurückgibt. Dadurch kann auch unabhängig vom Licht eine zuverlässige Bewertung der Farbe der Wand gewährleistet werden. Werte: weiße Wand: 28-39 schwarze Wand: 19-23 hellgraue Wand: 26-33 Ergebnis: Wie deutlich an den Werten abzulesen ist, ist leider nur eine Unterscheidung zwischen schwarz und weiß möglich. Somit kann nicht mehr jede Ausrichtung ermittelt werden, sondern nur 2 Richtungen, nämlich auf die schwarze und die weiße Wand. Deshalb ist die anfängliche Ausrichtung des Roboters nun bestimmter als in dem Grundplan. 3. Test zur Feststellung der Werte des Ultraschallsensors Material: Wand, Koordinatenraster, Roboter Versuchsaufbau: Man stellt den Roboter mehrmals auf den gewünschten Abstand zur Wand und liest die Werte ab, die der Ultraschallsensor zurückgibt. Auch hier wird dadurch eine zuverlässige Messung gewährleistet. Werte: 15 cm Abstand: 25-26 40 cm Abstand: 40-41 ca. 75 cm Abstand: 59-60 Ergebnis: Bei dem Test fiel auf, dass es beim Abstand von 15 cm es nicht möglich ist die Radachse auf dem Koordinatenpunkt zu plazieren, da in diesem Fall kein Wert zurückgegeben wird. Deshalb entschied ich mich, bei diesem Abstand sowie dem 40 cm Abstand, die Vorderkante des Ultraschallsensors, anstatt der Radachse, auf dieser Position zu positionieren. Der Roboter fährt anschließend noch die verbleibenden Centimeter vorwärts. Außerdem entschied ich mich für folgende Werte zur Implementierung in das Programm: 15 cm Abstand: 24-28 40 cm Abstand: 39-42 ca. 65 cm Abstand: 57-60 8

4. Problem bei der Abstandsmessung Ich hatte das Problem, dass der Roboter trotz genügend Abstand zur Wand nicht stehen blieb. Nach reichlich ausprobieren kam ich zu dem Schluss, dass etwas mit dem Vergleichsoperator nicht stimmt. Also sucht ich im Internet, doch fand nichts. So stellte ich die Frage im lejos- Forum. Dort stellte sich heraus, dass ich nur die Anzeige des Roboters falsch angesteuert hatten und somit mir falsche Vergleichswerte notierte. Als nach dieser Erkenntnis das Problem behoben war, funktionierte alles wieder. Quelltext: package test1; public class Programm /** * @param args */ public static void main(string[] args) NxtControl nxtcontrol = new NxtControl(); nxtcontrol.getdestination( 1 ); package test1; import lejos.nxt.button; import lejos.nxt.lcd; import lejos.nxt.lightsensor; import lejos.nxt.motor; import lejos.nxt.sensorport; import lejos.nxt.sound; import lejos.nxt.touchsensor; import lejos.nxt.ultrasonicsensor; public class NxtControl public class LeftMotorRotate extends Thread protected int MotorAngle = 0; public void setangle( int Angle ) MotorAngle = Angle; // MotorAngle wird festgelegt. public void run() Motor.C.resetTachoCount(); Motor.C.rotateTo(MotorAngle); // Motor C dreht bis zur gewünschten Position. public class RightMotorRotate extends Thread protected int MotorAngle = 0; public void setangle ( int Angle ) 9

MotorAngle = Angle; // MotorAngle wird festgelegt. public void run() Motor.B.resetTachoCount(); Motor.B.rotateTo(MotorAngle); // Motor B dreht bis zur gewünschten Position. public class LeftMotorStop extends Thread public void run() Motor.C.stop(); public class RightMotorStop extends Thread public void run() Motor.B.stop(); void Wait(int Length) try Thread.sleep(Length); catch (InterruptedException e) void Turn (int AngleB, int AngleC) LeftMotorRotate lmr2 = new LeftMotorRotate(); RightMotorRotate rmr2 = new RightMotorRotate(); // Objekte werden erzeugt. rmr2.setangle(angleb); lmr2.setangle(anglec); lmr2.start(); rmr2.start(); while( rmr2.isalive() lmr2.isalive() ) // Der Roboter dreht sich um 90 um die eigene Achse. void MoveTo(int destinationmin, int destinationmax, boolean Additional) UltrasonicSensor ultrasonicsensor = new UltrasonicSensor(SensorPort.S4); int currentdistance = ultrasonicsensor.getdistance(); RightMotorStop rms = new RightMotorStop(); LeftMotorStop lms = new LeftMotorStop(); RightMotorRotate rmr = new RightMotorRotate(); LeftMotorRotate lmr = new LeftMotorRotate(); // Objekte werden erzeugt. Motor.B.setSpeed(200); Motor.C.setSpeed(200); 10

currentdistance = ultrasonicsensor.getdistance(); if (currentdistance == 255) LCD.drawString("Fehler! Bitte \n neu posi- \n tionieren.", 0, 0); Sound.twoBeeps(); Wait(2000); System.exit(1); // Wenn ein Fehler auftritt, beendet sich das Programm. else if (destinationmin == 30) destinationmin = 24; // Wenn es sich um einen 15cm Abstand handelt, wird statt 30 24 benutzt. // Dies hat sich in Tests als äußerst Vorteilhaft herausgestellt. if (currentdistance > destinationmin) Motor.B.forward(); Motor.C.forward(); // Der Roboter fährt vorwärts, wenn er zu weit von der Wand entfernt ist. do currentdistance = ultrasonicsensor.getdistance(); while (currentdistance > destinationmin); lms.start(); rms.start(); else while( rms.isalive() lms.isalive() ) // Und stoppt, wenn er sich im gewünschten Bereich befindet. if (destinationmax == 60) destinationmax = 62; // Wenn es sich um einen 65cm Abstand handelt, wird statt 60 62 benutzt. // Dies hat sich in Tests als äußerst Vorteilhaft herausgestellt. if (currentdistance < destinationmax) Motor.B.backward(); Motor.C.backward(); // Der Roboter fährt rückwärts, wenn er zu nah an der Wand ist. do currentdistance = ultrasonicsensor.getdistance(); while (currentdistance < destinationmax); lms.start(); rms.start(); while( rms.isalive() lms.isalive() ) 11

// Und stoppt, wenn er sich im gewünschten Bereich befindet. if (Additional) rmr.setangle(150); lmr.setangle(150); rmr.start(); lmr.start(); // Wenn nötig, wird die Zusatzbewegung ausgeführt. void MoveBackward( int destination, boolean Add) LCD.clear(); Motor.B.backward(); Motor.C.backward(); // Roboter fährt rückwärts. boolean continuemove = false, stopmoving = false; UltrasonicSensor ultrasonicsensor = new UltrasonicSensor(SensorPort.S4); int exceptioncount = 0; LeftMotorStop lms = new LeftMotorStop(); RightMotorStop rms = new RightMotorStop(); LeftMotorRotate lmr1 = new LeftMotorRotate(); RightMotorRotate rmr1 = new RightMotorRotate(); // Variablen und Objekte werden festgelegt. do int currentdistance = ultrasonicsensor.getdistance(); // currentdistance wird auf die gemessene Distanz festgelegt. if (currentdistance == 255) continuemove = true; exceptioncount++; // Wenn nichts erkannt wurde, wird die Schleife weitergeführt. else continuemove = currentdistance < destination; // Ansonsten wird die Schleife je nach Verhältnis zwischen // Entfernung und dem Zielabstand weitergeführt. stopmoving = Button.ESCAPE.isPressed(); while(continuemove &&!stopmoving); // Schleife wird beendet wenn die gewünschte Position erreicht oder ESCAPE gedrückt wurde. lms.start(); rms.start(); while( rms.isalive() lms.isalive() ) // Roboter stoppt. LCD.clear(); LCD.drawInt(exceptionCount, 0, 1); if (Add) rmr1.setangle(150); lmr1.setangle(150); 12

rmr1.start(); lmr1.start(); while( rmr1.isalive() lmr1.isalive() ) // Wenn nötig, wird die Zusatzbewegung ausgeführt. void Move(int koordinates, boolean direction) int[] xmaxarray = new int[10]; int[] xminarray = new int[10]; int[] ymaxarray = new int[10]; int[] yminarray = new int[10]; boolean[] AddXArray = new boolean[10]; boolean[] AddYArray = new boolean[10]; // Variablen werden festgelegt. xmaxarray[1] = 60; xmaxarray[2] = 42; xmaxarray[3] = 28; xmaxarray[4] = 60; xmaxarray[5] = 42; xmaxarray[6] = 28; xmaxarray[7] = 60; xmaxarray[8] = 42; xmaxarray[9] = 28; xminarray[1] = 57; xminarray[2] = 39; xminarray[3] = 24; xminarray[4] = 57; xminarray[5] = 39; xminarray[6] = 24; xminarray[7] = 57; xminarray[8] = 39; xminarray[9] = 24; ymaxarray[1] = 28; ymaxarray[2] = 28; ymaxarray[3] = 28; ymaxarray[4] = 42; ymaxarray[5] = 42; ymaxarray[6] = 42; ymaxarray[7] = 60; ymaxarray[8] = 60; ymaxarray[9] = 60; yminarray[1] = 24; yminarray[2] = 24; yminarray[3] = 24; yminarray[4] = 39; yminarray[5] = 39; yminarray[6] = 39; yminarray[7] = 57; yminarray[8] = 57; yminarray[9] = 57; AddXArray[1] = false; AddXArray[2] = true; AddXArray[3] = true; AddXArray[4] = false; AddXArray[5] = true; AddXArray[6] = true; AddXArray[7] = false; AddXArray[8] = true; AddXArray[9] = true; 13

AddYArray[1] = true; AddYArray[2] = true; AddYArray[3] = true; AddYArray[4] = true; AddYArray[5] = true; AddYArray[6] = true; AddYArray[7] = false; AddYArray[8] = false; AddYArray[9] = false; // Je nach Zielkoordinate werden die gewünschten Wandabstände und die eventuelle Zusatzbewegung festgelegt. LCD.clear(); if (direction) MoveBackward( xmaxarray[koordinates], AddXArray[koordinates]); // Wenn der Roboter auf der X-Achse ist, wird MoveBackward mit xmin aufgerufen. Turn (200,-200); // Der Roboter dreht sich nach links. MoveTo(yminArray[koordinates], ymaxarray[koordinates], AddYArray[koordinates]); // Move To wird aufgerufen und die benötigten Daten werden übergeben. else MoveBackward( ymaxarray[koordinates], AddYArray[koordinates] ); // Wenn der Roboter auf der Y-Achse ist, wird MoveBackward mit ymin aufgerufen. Turn (-200, 200); // Der Roboter dreht sich nach rechts. MoveTo(xminArray[koordinates], xmaxarray[koordinates], AddXArray[koordinates]); // Move To wird aufgerufen und die benötigten Daten werden übergeben. void getdirection(int koordinates) // zum Ermitteln der Ausrichtung Boolean direction = true; LightSensor lightsensor = new LightSensor(SensorPort.S3, true); TouchSensor touchsensor = new TouchSensor(SensorPort.S1); // Variablen und Objekte werden festgelegt. Motor.B.setSpeed(200); Motor.C.setSpeed(200); Motor.B.forward(); Motor.C.forward(); // Der Roboter fährt vorwärts. while (!touchsensor.ispressed()) Motor.B.stop(); Motor.C.stop(); // Wenn der Roboter gegen die Wand fährt, bleibt er stehen. if (lightsensor.readvalue() < 45 && lightsensor.readvalue() > 26) direction = true; // Wenn die Wand weiß ist, ist direction=true. if (lightsensor.readvalue() < 25 && lightsensor.readvalue() > 15) direction = false; // Wenn die Wand schwarz ist, ist direction=false. 14

if (lightsensor.readvalue() > 45) Sound.beep(); LCD.drawString("Fehler bei der \n Farberkennung. \n Bitte versuchen \n Sie es erneut.", 0, 2); Button.waitForPress(); LCD.clear(); System.exit(1); // Im Falle eines Fehlers wird eine Fehlermeldung ausgegeben und das Programm beendet. Move(koordinates, direction); // Move wird aufgerufen und die Zielkoordinaten sowie die Ausrichtung werden übergeben. void getdestination(int koordinates) // zum Ermitteln der Zielkoordinate while (Button.ENTER.isPressed()) // auf das Loslassen des ENTER-Knopfes warten Wait(100); while (!Button.ENTER.isPressed()) // Wiederholen, bis die Zahl bestätigt wird. try Thread.sleep(100); // 0,1 Sekunden warten catch (InterruptedException e) LCD.drawInt(koordinates, 3, 4); // Zahl wird angezeigt. if(button.right.ispressed() && koordinates < 9) while(button.right.ispressed()) Wait(100); koordinates++; LCD.drawInt(koordinates, 3, 4); // Wenn der rechte Pfeil gedrückt wird, wird die Zahl um 1 erhöht //solange diese kleiner als 9 ist und anschließend wird die Zahl angezeigt. if(button.left.ispressed() && koordinates > 1) while(button.left.ispressed()) Wait(100); koordinates--; LCD.drawInt(koordinates, 3, 4); // Wenn der linke Pfeil gedrückt wird, wird die Zahl um 1 vermindert //solange diese größer als 1 ist und anschließend wird die Zahl angezeigt. getdirection(koordinates); // getdirection wird aufgerufen und die ermittelte Zahl wird übergeben. 15

Aktueller Stand: Der Roboter kann seine Zielpostition relativ zuverlässig anfahren. Manchmal kommt es allerdings zu Abweichungen, da der Ultraschallsensor nicht hundertprozentige Werte liefert. Diese Fehlerquote hängt unter anderem davon ab, wie das Testgelände im Raum platziert ist. Danksagungen: Ich möchte Andree Schuster danken für die Unterstützung beim Programmieren. Ich möchte Horst Schuster danken für das Material und die Anfertigung der Testgeländeumrandung. Wichtiger Hinweis: Es ist gestattet diese Arbeit als Grundlage für eine weitere Arbeit zu nutzen, allerdings nur, wenn mein Name und dieses Projekt erwähnt werden. Niemand darf dieses Projekt als sein eigenes betiteln. 16