30.01.2014 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 -

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!