Nordmende
Semiprofi
Hallo !
Ich habe, erstmal noch ohne RCX, einen Quellcode in NQC geschrieben.
Folgendes soll der Roboter machen:
Er soll auf einem Tisch fahren, wenn er an den Rand kommt, soll er zurückfahren, dann sich drehen und weiterfahren.
Wenn er irgendwas mit den Tastsensoren berührt, soll er darauf reagieren (noch nicht implementiert!).
Kennt sich jemand vll. mit NQC aus oder hat sogar einen RCX und kann das überprüfen ?
Lichtsensoren und Tastsensoren sind übrigens an jeweils einen Sensor-Eingang geschaltet. Als Tutorial hab ich dieses Dokument benutzt.
Der Quellcode:
(ist es richtig das ich die voids vor dem task main () geschrieben habe ?)
(die Kommentare sind 1. zur Übersicht und 2. für die anderen aus meiner Gruppe zum besseren Verständnis)
Grüße
'Nordmende
P.S.: Schaut mal in meine Sig, suche noch einen RCX2 !
Ich habe, erstmal noch ohne RCX, einen Quellcode in NQC geschrieben.
Folgendes soll der Roboter machen:
Er soll auf einem Tisch fahren, wenn er an den Rand kommt, soll er zurückfahren, dann sich drehen und weiterfahren.
Wenn er irgendwas mit den Tastsensoren berührt, soll er darauf reagieren (noch nicht implementiert!).
Kennt sich jemand vll. mit NQC aus oder hat sogar einen RCX und kann das überprüfen ?
Lichtsensoren und Tastsensoren sind übrigens an jeweils einen Sensor-Eingang geschaltet. Als Tutorial hab ich dieses Dokument benutzt.
Der Quellcode:
(ist es richtig das ich die voids vor dem task main () geschrieben habe ?)
(die Kommentare sind 1. zur Übersicht und 2. für die anderen aus meiner Gruppe zum besseren Verständnis)
Code:
#define unterwert 100 // RAW-Wert für Taster - Werte anpassen !
#define lichtwert 750 // RAW-Wert für Lichtsensor - Werte anpassen !
int drehzeit,mw;
// Nähe Erklärung zu Voids siehe
// "Programming the Lego Robots using NQC" Kaptil 6.3
void abgrund_l ()
{
SetWatch(2,0);
OnRev(OUT_A+OUT_C); // Rückwärts fahren um Abstand zur Kante zu gewinnen
Wait (300);
OnRev(OUT_A); // Richtung bei Bedarf korrigieren
Wait(drehzeit);
}
void abgrund_r ()
{
SetWatch(3,0);
OnRev(OUT_A+OUT_C);
Wait(300);
OnRev(OUT_C);
Wait(drehzeit);
}
void abgrund_lr (int mw)
{
SetWatch(4,0);
OnRev(OUT_A+OUT_C);
Wait(300);
if (mw == 0)
{
SetWatch(4,1);
OnRev(OUT_A); // Nach links drehen wenn Var mw = 0
Wait(160); // Zeiten müssen noch angepaßt werden !
}
else
{
SetWatch(4,2);
OnRev(OUT_C); // Wenn mw nicht 0 (sondern 1), dann nach rechts drehen
Wait(160);
}
}
task main ()
{
// Sensoren festlegen
// Auf Sensor 1 und 3 sind jeweils ein
// Licht und Tastsensor > gleichzeitig < geschaltet
// Unterscheidung anhand der RAW-Werte
// Licht ist nie unter 100
SetWatch(0,0);
Wait(200); // bei Robo Einsatz verkleinern
SetSensorType(SENSOR_1,SENSOR_TYPE_LIGHT);
SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
SetSensorType(SENSOR_3,SENSOR_TYPE_LIGHT);
SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
// Globalen Drehzeit-Wert definieren
// Wert wird um 150, also 1,5s vergrößert
// um sehr kleine Werte wie 0,01s zu vermeiden
drehzeit = Random(300)+150;
SetWatch(0,1);
Wait(200);
// Variable mw ist 1 oder 0
// bestimmt zufällige Drehrichtung
// wenn der Robo gerade auf einen Abgrund zukommt
mw = Random(1);
SetWatch (0,2);
Wait(200);
// Fahre gerade aus, starte bestimmte Aufgabe
// wenn einer der Sensoren oder beide einen
// Lichtwert kleiner als definiert melden
// oder ein oder beide Tastsensoren gedrückt sind
while(true)
{
OnFwd(OUT_A+OUT_C); // erstmal losfahren
SetWatch(1,0); // Zeigt Uhrzeit 10:00 zur Orientierung an
// Linker Sensor
if (SENSOR_1 < unterwert)
{
//das machen wenn links gedrückt wird
}
if (SENSOR_1 < lichtwert && SENSOR_1 > unterwert)
{
Off(OUT_A+OUT_C); // Robo bleibt stehen, mit Bremse
Wait(20);
abgrund_l(); // führt unten definierte Inline-Funktionen (Voids) aus
}
// Rechter Sensor
if (SENSOR_3 < unterwert)
{
// das machen wenn rechts gedrückt wird
}
if (SENSOR_3 < lichtwert && SENSOR_3 > unterwert)
{
Off(OUT_A+OUT_C);
Wait(20);
abgrund_r();
}
// Beide Sensoren
if (SENSOR_1+SENSOR_3 <unterwert)
{
// das machen wenn beide gedrückt sind
}
if (SENSOR_1+SENSOR_3 < lichtwert && SENSOR_1+SENSOR_3 > unterwert)
{
Off(OUT_A+OUT_C);
Wait(20);
abgrund_lr(mw); // Variable mw wird an die Inline-Fkt. übergeben
}
} // ende while-Schleife
} // ende task main
Grüße
'Nordmende
P.S.: Schaut mal in meine Sig, suche noch einen RCX2 !
Zuletzt bearbeitet: