[Lego Mindstorm RCX] NQC - Funktioniert dieser Quellcode ?

Nordmende

Semiprofi
Thread Starter
Mitglied seit
03.05.2006
Beiträge
2.054
Ort
Terra Incognita
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

Grüße
'Nordmende

P.S.: Schaut mal in meine Sig, suche noch einen RCX2 !
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Hi,

wenn ich Zeit finde, kann ich deinen Code mal testen, doch leider hab ich diese Woche ziemlich viel stress in der Arbeit.

PS.:mail: - Ich habe noch ein RCX2.0 bzw. das Robotics Invention System + Mindstorms Mars (oder so ähnlich) + Ultimate Builder und noch ein kleineres Zusatzpack, bei dem - glaube ich zumindest - diese Lichtschranke dabei war.

Gruß
 
sieht erstmal soweit gut aus. Ich glaube du kannst die Main auch ganz nach oben hauen. Sollte trotzdem funktionieren aber genau weiß ich das auch nicht mehr.

Aus Erfahrung kann ich dir noch folgenden Rat geben.

#define unterwert 100 // RAW-Wert für Taster - Werte anpassen !
#define lichtwert 750 // RAW-Wert für Lichtsensor - Werte anpassen !

Mach mal das Licht im Raum an. Am nächsten Tag scheint noch zusätzlich die Sonne. Du musst ständig dein Programm anpassen. Ich hab damals einen Roboter programmiert einer schwarzen Linie zu folgen. Hab dann einfach nach dem Initialisieren der Sensoren den aktuellen Wert von Schwart (Roboter wurde startet auf der Linie) in eine Variable gespeichert. Dazu noch einen Toleranzwert, der nicht über oder unterschirtten werden darf. Den Toleranzwert muss man einmal richtig austesten aber dann funktioniert es unabhängig von den Lichtverältnissen.

mw = Random(1);
Steht auserhalb der Schleife. In der Schleife wird er sich also immer für die gleiche Richtung entscheiden. Besser vor dem Aufruf der _lr Methode die Zeile einfügen.

if (SENSOR_1+SENSOR_3 <unterwert)
Sicher, dass er nicht die 2 Werte Addiert und dann vergleicht? Besser Sensor_1 < unterwert && Sensor_3 < unterwert usw.

Davon mal abgesehen. Ich behaupte jetzt mal, dass es keine Gute Idee ist den Lichtsensor und den Tastsensor über einen Ausgang zu jagen. Bei einer total Schwarzen Unterlage müsste der Lichtsensor doch 0 liefern. Den Tastsensor hab ich auch nie im RAW Modus laufen lassen. Sollte der nicht eigentlich 1(00) liefern beim drücken. Dann macht Sensor_X < unterwert keinen Sinn. Das würde bedeuten, dass der Sensor nicht gedrückt ist. Ist bei mir aber schon ne weile her, desshalb bin ich mir das nicht so sicher.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh