[Lego Mindstorm RCX] NQC - Funktioniert dieser Quellcode ?

Zin-Azshari

Ensign
Registriert
März 2007
Beiträge
188
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)
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


P.S.: Suche selber das RCX Starterset 3804 !
 
Zurück
Oben