Programmierung des Lego NXT in C (NXC) - Fakultät für Informatik ...
Programmierung des Lego NXT in C (NXC) - Fakultät für Informatik ...
Programmierung des Lego NXT in C (NXC) - Fakultät für Informatik ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Programmierung</strong><br />
<strong>des</strong> <strong>Lego</strong> <strong>NXT</strong><br />
<strong>in</strong> C<br />
Hochschule Mannheim<br />
Fakultät für <strong>Informatik</strong>
Der <strong>NXT</strong> Ste<strong>in</strong><br />
Technische Daten<br />
• 32-bit ARM7 Microcontroller<br />
• 256 Kbytes FLASH, 64 Kbytes RAM<br />
• 8-bit AVR microcontroller<br />
• 4 Kbytes FLASH, 512 Byte RAM<br />
• Bluetooth Kommunication (drahtlos)<br />
• USB Anschluß (12 Mbit/s)<br />
• 4 E<strong>in</strong>gänge<br />
• 3 Ausgäne<br />
• Es können bis zu 3 Ste<strong>in</strong>e mite<strong>in</strong>ander<br />
verbunden werden (Kommunikation ist nur<br />
mit e<strong>in</strong>em Ste<strong>in</strong> möglich)<br />
• 100 x 64 pixel LCD Display (graphisch)<br />
• Lautsprecher
Motoren und Sensoren für den <strong>NXT</strong><br />
Der <strong>NXT</strong> Motor<br />
- Servo-Motor<br />
- verfügt über <strong>in</strong>tegrierten Rotationssensor<br />
- Rotationssensor<br />
- misst Geschw<strong>in</strong>digkeit und Abstand<br />
- leitet Ergebnisse an <strong>in</strong>telligenten <strong>NXT</strong> Ste<strong>in</strong> weiter<br />
- Motoren können auf e<strong>in</strong> Grad genau gesteuert werden<br />
- Mehrere Motoren können komb<strong>in</strong>iert werden und mit<br />
derselben Geschw<strong>in</strong>digkeit arbeiten
C – <strong>Programmierung</strong><br />
<strong>des</strong> <strong>NXT</strong> mit <strong>NXC</strong>
Not eXactly C (<strong>NXC</strong>)<br />
E<strong>in</strong>führung<br />
- Programmiersprache zur <strong>Programmierung</strong> <strong>des</strong> <strong>NXT</strong><br />
- enthält die lexikalischen Regeln für den Compiler, die Programmstruktur,<br />
Befehle und Ausdrücke und die Operationen <strong>des</strong> Preprozessors<br />
- ist abhängig von Groß- und Kle<strong>in</strong>schreibung
Kommentare<br />
<strong>NXC</strong> - Sprachelemente<br />
- Es gibt es 2 Arten der Darstellung von Kommentare<br />
- Die erste Darstellungsweise basiert auf die Darstellung von Kommentaren <strong>in</strong> C<br />
- Kommentar beg<strong>in</strong>nt mit /*<br />
- Kommentar endet mit */<br />
- Kommentare können sich über mehrere Zeilen erstrecken<br />
- Beispiel 1:<br />
/* Das ist e<strong>in</strong> Kommentar */<br />
- Beispiel 2::<br />
/* Das ist e<strong>in</strong> Kommentar, der sich<br />
über 2 Zeilen erstreckt */<br />
- Die zweite Darstellungsweise basiert auf die Darstellung <strong>in</strong> C++<br />
- Jede Kommentarzeile beg<strong>in</strong>nt mit //<br />
- Beispiel 1:<br />
// Das ist e<strong>in</strong> Kommentar<br />
- Beispiel 2::<br />
// Das ist e<strong>in</strong> Kommentar, der sich<br />
// über 2 Zeilen erstreckt<br />
6
Whitespace<br />
<strong>NXC</strong> - Sprachelemente<br />
- Whitespace s<strong>in</strong>d Leerzeichen, Tabulatoren und Zeilenumbrüche<br />
- Verwendung zur Teilung von Token und um e<strong>in</strong> Programm lesbar zu machen<br />
- Leerzeichen <strong>in</strong> Ausdrücken für die Addition und Substruktion haben ke<strong>in</strong>en<br />
E<strong>in</strong>fluss auf das Programm<br />
- Beispiel:<br />
x=2;<br />
x = 2;<br />
Beide Ausdrücke weisen der Variablen x die Zahl 2 zu.<br />
- Es gibt Operanten, die aus 2 oder mehr Zeichen s<strong>in</strong>d, <strong>in</strong> diesen darf ke<strong>in</strong><br />
zusätzliches Leerzeichen e<strong>in</strong>gefügt werden<br />
- Beispiel:<br />
x = 1 >> 4; //setzt x auf 1 rechts ausgerichtet mit 4 bits<br />
x = 1 > > 4; // Fehler
Numerische Konstante<br />
<strong>NXC</strong> - Sprachelemente<br />
- Können entweder <strong>in</strong> dezimaler oder <strong>in</strong> hexadezimaler Form geschrieben werden<br />
- Dezimale Konstanten bestehen aus e<strong>in</strong>er oder mehreren dezimalen Stellen<br />
- Hexadezimale Zahlen beg<strong>in</strong>nen mit 0x oder 0X, gefolgt durch e<strong>in</strong>e oder mehrere<br />
hexadezimale Stellen<br />
- Beispiel:<br />
x = 10;<br />
// ordnet x die Zahl 10 zu (dezimal)<br />
x = 0x10; // setzt x auf 16 (10 hexadezimal)<br />
Zeichenketten Konstante<br />
- Zeichenketten werden <strong>in</strong> doppelte Anführungsstriche gesetzt<br />
- Beispiel für Ausgabe auf dem LCD <strong>des</strong> <strong>NXT</strong>:<br />
TextOut(0, LCD_LINE1, „test<strong>in</strong>g“);
<strong>NXC</strong> - Sprachelemente<br />
Bezeichnungen und Schlüsselwörter<br />
- Bezeichner werden für Variablen, Aufgaben, Funktionen und Unterprogrammnamen<br />
benutzt<br />
- das erste Zeichen <strong>in</strong> e<strong>in</strong>em Bezeichner muss e<strong>in</strong> Buchstabe (groß oder kle<strong>in</strong>) oder<br />
e<strong>in</strong> Unterstrich (_) se<strong>in</strong>.<br />
- E<strong>in</strong>e Reihe von Bezeichnern wird von <strong>NXC</strong> selbst reserviert<br />
- Bezeichner von <strong>NXC</strong>
Variablen<br />
<strong>NXC</strong> - Sprachelemente<br />
- Folgende Variablentypen können z. B. verwendet werden:<br />
<strong>in</strong>t<br />
char<br />
bool<br />
str<strong>in</strong>g<br />
long<br />
short<br />
-Variablen werden deklariert durch<br />
- Schlüsselwort für den Typ,<br />
- Liste von Variablen getrennt durch Komma<br />
- ggf. e<strong>in</strong>em Startwert<br />
- beendet mit e<strong>in</strong>em Semikolon<br />
- Beispiel:<br />
<strong>in</strong>t x;<br />
// deklariert x als <strong>in</strong>teger Zahl<br />
bool x,y; // deklariert x und y als boolesche Zahl<br />
long a=1,b; // deklariert a mit Startwert 1, und b
Motoren
Motorensteuerung<br />
4 grundlegende Arten der Motorensteuerung<br />
1. E<strong>in</strong>- und Ausschalten der Motoren jegliche Festlegungen<br />
(unregulierter Modus);<br />
2. Festlegung der Motorengeschw<strong>in</strong>digkeit (Geschw<strong>in</strong>digsregulierter Modus)<br />
3. Paarung von Motoren, sie laufen dann mit der selben Geschw<strong>in</strong>digkeit<br />
(Synchronisierte Motorregelung)<br />
4. Steuerung von e<strong>in</strong>em oder e<strong>in</strong>em Set von Motoren über e<strong>in</strong> Ziel oder<br />
Entfernung, dass/die erreicht werden muss (Tachometer begrenzter Modus)
Unregulierte Motorensteuerung<br />
Motorensteuerung<br />
Kommandos:<br />
OnFwd und OnRev<br />
Off<br />
Funktionsweise der Befehle<br />
- E<strong>in</strong>schalten der Motoren<br />
- Bremsen s<strong>in</strong>d aktiviert<br />
- Regulierungsmodus ist nicht <strong>in</strong> Betrieb (idle)<br />
- Führt e<strong>in</strong> Reset auf den Block und das Tachometer aus<br />
(möchte man ke<strong>in</strong> Reset ausführen, so verwendet man OnFwdEx und OnRevEx<br />
Syntax:<br />
OnFwd(OUT_ABC, Geschw<strong>in</strong>digkeits%);<br />
OnRev(OUT_ABC, Geschw<strong>in</strong>digkeits%);<br />
Off(OUT_ABC);
Unregulierte Motorensteuerung<br />
Beispiel:<br />
task ma<strong>in</strong>()<br />
{<br />
OnFwd(OUT_ABC,75);<br />
Wait(5000);<br />
OnRev(OUT_AC, 75);<br />
Wait(5000);<br />
Off(OUT_ABC);<br />
Wait(5000);<br />
}<br />
Motorensteuerung
Motorensteuerung<br />
Geschw<strong>in</strong>digkeitsregulierte Motorensteuerung<br />
Kommandos:<br />
OnFwdReg und OnRevReg<br />
Off<br />
Funktionsweise der Befehle<br />
- Arbeitsweise wird besonders im niedrigen Geschw<strong>in</strong>digkeitsbereich sichtbar<br />
- Firmware hat hier mehr Möglichkeiten Justierungen auszuführen<br />
- Regulierungsmodus ist <strong>in</strong> Betrieb (speed)<br />
- Führt e<strong>in</strong> Reset auf den Block und das Tachometer aus<br />
(möchte man ke<strong>in</strong> Reset ausführen, so verwendet man<br />
OnFwdRegEx und OnRevRegEx<br />
Syntax:<br />
OnFwdReg(OUT_ABC, Geschw<strong>in</strong>digkeits%, Geschw<strong>in</strong>digkeitsmodus);<br />
OnRevReg(OUT_ABC, Geschw<strong>in</strong>digkeits%, Geschw<strong>in</strong>digkeitsmodus);<br />
Off(OUT_ABC);
Geschw<strong>in</strong>digkeitsregulierte Motorensteuerung<br />
- Beispiel -<br />
task MotorStatus()<br />
{<br />
while (true)<br />
{<br />
NumOut(0, LCD_LINE1, MotorActualSpeed(OUT_A));<br />
NumOut(0, LCD_LINE2, MotorActualSpeed(OUT_C));<br />
}<br />
}<br />
task ma<strong>in</strong>()<br />
{<br />
start MotorStatus;<br />
OnFwdReg(OUT_ABC, 40, OUT_REGMODE_IDLE);<br />
Wait(5000);<br />
OnRevReg(OUT_AC, 40, OUT_REGMODE_SPEED);<br />
Wait(5000);<br />
Off(OUT_ABC);<br />
StopAllTasks();<br />
}
Synchronisierte Motorensteuerung<br />
Motorensteuerung<br />
Kommandos:<br />
OnFwdSync und OnRevSync<br />
Off<br />
Funktionsweise der Befehle<br />
- Bezieht sich auf e<strong>in</strong> Motorenpaar (jeweils auf 2 Motoren)<br />
- Kann nicht für e<strong>in</strong>en oder alle drei Motoren genutzt werden<br />
- Lässt die 2 ausgewählten Motoren mit der selben Rate (synchron) laufen<br />
- Führt e<strong>in</strong> Reset auf den Block und das Tachometer aus<br />
(möchte man ke<strong>in</strong> Reset ausführen, so verwendet man<br />
OnFwdSyncEx und OnRevSyncEx<br />
Syntax:<br />
OnFwdSync(OUT_AC, Geschw<strong>in</strong>digkeits%, Drehung <strong>in</strong> %);<br />
OnRevSync(OUT_AC, Geschw<strong>in</strong>digkeits%, Drehung <strong>in</strong> %);<br />
Off(OUT_ABC);<br />
Geschw<strong>in</strong>digkeits% 0…100<br />
Drehung <strong>in</strong> % -100…100
Synchronisierte Motorensteuerung<br />
- Beispiel -<br />
Beispiel: Geradeaus Fahren<br />
task ma<strong>in</strong>()<br />
{<br />
OnFwdSync(OUT_AC, 75, 0);<br />
Wait(5000);<br />
OnRevSync(OUT_AC, 75, 0);<br />
Wait(5000);<br />
Off(OUT_ABC);<br />
}
Tachometer begrenzte Motorensteuerung<br />
Kommandos:<br />
RotateMotor<br />
Motorensteuerung<br />
Funktionsweise der Befehle<br />
- Der e<strong>in</strong>gebaute Rotationssensor gibt dem <strong>NXT</strong> Auskunft über Schnelligkeit und<br />
und wie weit weg sich der Roboter bewegt hat<br />
- Man kann dem Roboter sagen, nach welcher Anzahl von Drehungen er stoppen soll<br />
- Weit mehr E<strong>in</strong>stellungen s<strong>in</strong>d z. B. <strong>in</strong> der RotateMotorEx möglich<br />
Syntax:<br />
RotateMotor(OUT_AC, Geschw<strong>in</strong>digkeits%, WertRotationssensor);<br />
RotateMotor(OUT_AC, Geschw<strong>in</strong>digkeits%, WertRotationssensor,<br />
Drehung%, MotorSynchron, MotorenBremse);
Tachometer begrenzte Motorensteuerung<br />
- Beispiel -<br />
task ma<strong>in</strong>()<br />
{<br />
RotateMotor(OUT_AC, 75, 1000);<br />
}
Sensoren
Initialisierung <strong>des</strong> Berührungssensors<br />
SetSensor(S1, SENSOR_TOUCH);<br />
oder<br />
SetSensorTouch(S1);<br />
Berührungssensor<br />
Abfrage <strong>des</strong> Berührungssensors<br />
- gefragt wird, ob der Berührungssensor gedrückt ist oder nicht<br />
- ist der Berührungssensor nicht gedrückt, so hat der den Wert 0 (false)<br />
- ist der gedrückt, so hat er e<strong>in</strong>en von Null verschiedenen Wert
task ma<strong>in</strong>()<br />
{<br />
SetSensor(S1,SENSOR_TOUCH);<br />
OnFwd(OUT_AC, 75);<br />
while (true) //Endlosschleife<br />
{<br />
if (SENSOR_1 == 1)<br />
{<br />
OnRev(OUT_AC, 75);<br />
Wait(300);<br />
OnFwd(OUT_A, 75);<br />
Wait(300);<br />
OnFwd(OUT_AC, 75);<br />
}<br />
}<br />
}<br />
Berührungssensor<br />
- Beispiel -