HSG |
|
task main() { Wait(1000); OnFwd(OUT_AB,75); Wait(4000); Off(OUT_AB); }
Die beiden Parameter von 'OnFwd' geben die angesprochenen Motoren und die gewählte Leistung an. Die Motorkombinationen A, B, C, AB, AC, BC, ABC werden mit den ganzen Zahlen 0, 1, 2, 3, 4, 5, 6 codiert. Diese Zahlen sind als Konstanten OUT_A, OUT_B, OUT_C, OUT_AB, OUT_AC, OUT_BC, OUT_ABC verfügbar. Die Leistung kann von 0 bis 100 ( % ) eingestellt werden.
task main() { int n; ResetRotationCount(OUT_C); // hier eigentlich unnötig while (true) { n = MotorRotationCount(OUT_C); TextOut(50,30,NumToStr(n)+" "); }; }
Jeder NXT-Motor hat einen Lagesensor eingebaut, der über eine Gabellichtschranke und eine Schlitzscheibe realisiert wurde. Die überstrichenen Schlitzkanten können gezählt und der aktuelle Stand über 'MotorRotationCount' ausgelesen werden. Eine ganze Umdrehung entspricht dabei 360 Impulsen. Beim Programmstart hat der Zähler den Wert 0. Durch Verdrehen der orangenen Scheibe kann man die Funktion überprüfen. NumToStr(n)+" " ist ein String, der durch Zusammenhängen der beiden Strings NumToStr(n) und " " entsteht. Warum macht man das hier?
#define umdr 5 task main() { Wait(1000); ResetRotationCount(OUT_A); OnFwdReg(OUT_AB,40,OUT_REGMODE_SYNC); while (MotorRotationCount(OUT_A)Das #define-Kommando definiert hier die Konstante umdr auf den Wert 5. Bei einem längeren Programm mit mehrerem Auftreten der Konstanten können so die Werte bequem gleichzeitig geändert werden. Außerdem verbessert sich durch 'sprechende Namen' die Lesbarkeit. 'OnFwdReg' wendet eine Regelung auf die Motoren an, dh. der Lauf der Motoren wird über die Drehencoder überwacht. Der dritte Parameter, hier: 'OUT_REGMODE_SYNC', legt die Art der Regelung fest. Im Beispiel werden die Motoren auf strikten Gleichlauf geregelt. Das kann man überprüfen, wenn man einen der Motoren bremst oder gar anhält. Der zweite Motor wird dem ersten genau folgen. Die while-schleife hat hier gar keinen Schleifenkörper. Sie wird erst verlassen, wenn die vorgegebenen Umdrehungen erreicht sind. Erst dann kann der letzte Befehl die Motoren abschalten.
Aufgabe
Schreibe ein Programm, das den Roboter genau eine in cm vorgegebene Strecke durchfahren lässt. Dazu ist zunächst möglichst genau zu ermitteln, wie weit sich ein Rad bei einer Umdrehung dreht.
Kurven, p12.nxc
Wenn sich eines der beiden Räder langsamer als das andere dreht, so wird eine Kurve gefahren.
Achtung: vorläufig!
#define g 205 task main() { Wait(1000); ResetRotationCount(OUT_B); OnFwdSync(OUT_AB,50,100); while (MotorRotationCount(OUT_B)Drehen auf der Stelle, p13.nxc
#define g 210 task main() { Wait(1000); RotateMotorEx(OUT_AB,50,g,100,true,true); }RotateMotorEx(Ausgang,Leistung,Drehwinkel,turnratio,bSync,bStop) lässt die Motoren solange drehen, bis der 'Drehwinkel' erreicht ist. Der Parameter 'turnratio' stellt ein festes Verhältnis zwischen den Motoren ein. Ein Wert von 100 sorgt dafür, dass sich die Motoren gegenläufig drehen. bSync = true bewirkt eine exakte Synchronisation. bStop = true stoppt die Motoren hart.