Unterrichtseinsichten - Schuljahr 2011/2012 - Informatik-AG
Anmelden von Motoren, Sensoren und weiteren Komponenten
- Importieren der benötigten Klassen
Beim Start bringt Java schon einige Klassen mit, die für einfache Programme ausreichen.
Die Klassen für den NXT-Baustein sind aber gesondert zusammengefasst und müssen importiert werden.
Die Zeilen für den Import werden direkt unter der Zeile "package ..." am Anfang des Programms eingefügt.
import lejos.nxt.*;
// wird immer
benötigt
import lejos.robotics.navigation.*; // wird
benötigt für den Differentialpiloten und den Navigator (siehe
unten)
- Bildschirm des NXT-Bausteins
Es gibt Befehle, um die Tasten des Bedienfeldes anzusprechen.
Angemeldet werden muss die Klasse "Button" nicht.
Button.ENTER // Zentrale Taste (orange, quadratisch)
Button.ESCAPE // untere graue rechteckige Taste
Button.LEFT // linke dreieckige Taste
Button.RIGHT // rechte dreieckige Taste
Meist ist es wichtig, die Tasten auf einen Tastendruck abzufragen:
Button.LEFT.isDown(); // fragt ab, ob die linke Taste gedrückt ist
!Button.RIGHT.isDown(); // fragt ab, ob die rechte Taste nicht (wegen des Ausrufezeichens !) gedrückt ist
Will man zu Beginn oder zwischendurch den Roboter so lange anhalten,
bis eine bestimmte Taste gedrückt ist, geht das gut mit der
while-("während" oder "solange")-Anweisung:
while (!Button.LEFT.isDown()) { }; //
solange die Links-Taste nicht gedrückt ist, tue das, was in den
geschweiften Klammern steht (also hier nichts)
- Bildschirmausgabe
Der Bildschirm des NXT-Bausteins kann mit LCD angesprochen werden. Eine Anmeldung ist nicht nötig.
Mit dem Befehl "drawString" kann Text an einer bestimmten Stelle des Bildschirms ausgegeben werden.
LCD.drawString("Hallo!",2,5); //
gibt den Text "Hallo!" ab der 2. Spalte und der 5. Zeile aus
LCD.drawString(""+472,4,1);
// gibt die Zahl 472 ab der 4. Spalte und der 1. Zeile aus; ""+ wandelt
dabei die nachfolgende Zahl in Text um
- Motoren
Motoren müssen nicht angemeldet werden.
Es stehen zur Verfügung "Motor.A", "Motor.B" und "Motor.C"
Beispiele für den Programmtext:
Motor.A.forward(); // Motor A fährt vorwärts
Motor.B.setSpeed(200); // Die Geschwindigkeit des Motor B wird auf 200 gesetzt
Motor.C.stop(); // Motor C wird gestoppt
- Berührungssensor
Der Berührungssensor heißt "TouchSensor" und muss so angemeldet werden:
TouchSensor <name> = new TouchSensor(<Sensor-Anschluss>);
Beispiel:
TouchSensor ts = new
TouchSensor(SensorPort.S1); // nun hat man einen
Berührungssensor, der ts heißt und am Anschluss 1
angeschlossen ist
Beispiel für folgende Aufgabe: Wenn der Berührungssensor
gedrückt ("isPressed") wurde, soll auf dem Bildschirm "Taste"
ausgegeben werden
if (ts.isPressed())
{
LCD.drawString("Taste",3,5);
}
- Lichtsensor
Der Lichtsensor heißt "ColorSensor" und muss so angemeldet werden:
ColorSensor <name> = new ColorSensor(<Sensor-Anschluss>);
Beispiel:
ColorSensor cs = new
ColorSensor(SensorPort.S2); // nun hat man einen
Lichtsensor, der cs heißt und am Anschluss 2 angeschlossen ist
Beispiel für folgende Aufgabe: Der Lichtsensor soll die Lichtstärke messen und auf dem Bildschirm ausgeben
int
helligkeit;
// eine Variable "hell" wird eingerichtet, um eine natürliche Zahl
(=int oder integer) speichern zu können
helligkeit=cs.getRawLightValue(); // die
Lichtstärke wird gemessen und der Wert wird in der Variable
"helligkeit" gespeichert
LCD.drawString(""+helligkeit,1,1); // der
Wert, der in "helligkeit" gespeichert ist, wird auf dem Bildschirm oben
links ausgegeben
- Ultraschallsensor
Der Ultraschallsensor heißt "UltrasonicSensor" und muss so angemeldet werden:
UltrasonicSensor <name> = new UltrasonicSensor(<Sensor-Anschluss>);
Beispiel:
UltrasonicSensor us = new
UltrasconicSensor(SensorPort.S3); // nun hat man einen
Ultraschallsensor, der us heißt und am Anschluss 3 angeschlossen
ist
Beispiel für folgende Aufgabe: Der Roboter soll losfahren und dann
stoppen, wenn der Ultraschallsensor anzeigt, dass in weniger als 15 cm
Entfernung ein Hindernis steht
Motor.B.forward();
// Motor B fährt vorwärts
while (us.getDistance() > 15) { }; // wenn
der Abstand größer als 15 cm ist, warte ab (und fahre weiter)
Motor.B.stop();
// stoppe den Motor B, weil jetzt der Abstand nicht mehr
größer als 15 cm ist
Beim Ultraschallsensor gibt es folgendes Problem:
Nach dem Aufruf muss man einen Moment warten, damit das
ausgesandte Signal gesendet und wieder empfangen und danach ausgewertet
werden kann.
Wieviel ein "Moment" ist, ist mir nicht ganz klar. Es dürften aber 10 ms bis 20 ms reichen.
Die "warte"-Anweisung kann durch folgende Methode
(innerhalb der Klasse, außerhalb der main-Methode) erreicht
werden, wobei die Systemuhr abgerufen wird:
public void warte(long zeit) //Zeit ist die Wartezeit in Millisekunden
{
long jetzt=System.currentTimeMillis();
while (System.currentTimeMillis()<jetzt+zeit){}
}
Das oben beschriebene Programm kann dann mit einer do-while-Schleife so geschrieben werden:
Motor.B.forward();
// Motor B fährt vorwärts
int abstand;
do { abstand=us.getDistance(); warte(15);}
while (abstand <=
15);
// wenn
der Abstand kleiner als 15 cm oder gleich 15 cm ist, fahre nicht weiter
Motor.B.stop();
// stoppe den Motor B, weil jetzt der Abstand nicht mehr
größer als 15 cm ist
- Treiber für Fahrzeuge mit 2 Motoren
Um die beiden Motoren zu synchronisieren (= aufeinander abzustimmen),
benötigt man ein Überwachungsprogramm, das
"DifferentialPilot" heißt.
Bei Autos wird mit Differentialgetrieben erreicht, dass die Räder
an einer Achse bei Kurvenfahrten unterschiedlich schnell laufen
können und nicht über den Boden rutschen müssen.
Dieser "DifferentialPilot" muss so angemeldet werden:
DifferentialPilot <name> = new
DifferentialPilot(<Raddurchmesser>, <Achsenlänge von
Radmitte bis Radmitte>, <Motor links>, <Motor rechts>);
Beispiel:
DifferentialPilot dp = new DifferentialPilot(4.3f, 12.7f,
Motor.A, Motor.B); // Man hat nun einen Differentialpiloten, der dp
heißt und der einen Wagen steuert, dessen Räder den
Durchmesser 4,3 cm und den Radabstand 12,7 cm haben und dessen linkes
Rad vom Motor A und dessen rechtes Rad vom Motor B angetrieben wird.
Beispiel für folgende Aufgabe: Der Roboter soll auf einer Bahn fahren, die an eine 400m-Laufbahn erinnert
dp.travel(50); // der Roboter fährt 50 cm geradeaus
dp.arc(20,180); // der Roboter fährt einen Halbkreis (=180°) mit dem Radius 20 cm
dp.travel(50); // der Roboter fährt 50 cm geradeaus
dp.arc(20,180); // der Roboter fährt einen Halbkreis (=180°) mit dem Radius 20 cm
- Navigation im x-y-Koordinatensystem
Mit Hilfe des Navigators kann man Punkte in einem x-y-Koordinatensystem
direkt anfahren, ohne sich um Winkel oder Fahrstrecken kümmern zu
müssen.
Der "Navigator" muss so angemeldet werden:
Navigator <name> = new Navigator(<Name eines Differentialpiloten>);
Beispiel:
Navigator navi = new Navigator(dp);
Beispiel für folgende Aufgabe: Es soll ein rechtwinkliges Dreieck
ABC vom Wagen abgefahren werden, dessen Eckpunkte folgende Koordinaten
besitzen:
A(10/30), B(60/30), C(60/70) (Einheiten in cm, bzw. in der
Einheit, die beim Differentialpiloten für den Raddurchmesser und
die Achslänge benutzt wurden)
Die Eckpunkte werden zunächst als Waypoint definiert und dann wird
der Befehl zum Abfahren der Strecke gegeben. Da der Start am Punkt
(0/0) liegt, wird der Wagen zunächst zum Punkt A fahren und dann
mit der Fahrt auf den Dreieckseiten beginnen.
navi.addWaypoint(10,30); // fahre zum Punkt A
navi.addWaypoint(60,30); // fahre die Strecke AB
navi.addWaypoint(60,70); // fahre die Strecke BC
navi.addWaypoint(10,30); // fahre die Strecke CA
navi.followPath();
// beginne nun mit der Fahrt