Programm Ãœberholen in NXC

Mindstorms im Unterricht. Ideen, Vorstellungen

Moderator: Moderatoren

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 31. Okt 2010 15:51

Code: Alles auswählen

#define Abstand 50

int Strecke

task main ()
{
SetSensorLowspeed(IN_1);
SetSensorLowspeed(IN_2);
SetSensorMode(IN_2, SENSOR_MODE_BOOL);

until(SensorUS(IN_1)<Abstand) //solange vorwärtsfahren bis kleiner abstand
{
OnFwdReg(OUT_AB, 50, OUT_REGMODE_SYNC);
Wait(1000);
}

RotateMotor(OUT_A,50,-100);      //um 30 grad nach links drehen
RotateMotor(OUT_B,50,100);
ODER (RotateMotorEx (OUT_AB,50,-30,0,True,False);  )

ResetRotationCount(OUT_A); //rotationen count zurücksetzen

until (SensorUS(IN_2) == true); ODER   until (IN_2>255)  //solange gradeausfahren bis hindernis nicht erkannt wird
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (1000);
}

//motorrotationen mitzählen bis hindernis nicht mehr erkannt wird und als strecke speichern:
if (SensorUS(IN_2) == true);
{
Off (OUT_AB);
Strecke = MotorRotationCount(OUT_A);
}

RotateMotor(OUT_A,50,100);  //30 grad nach rechts drehen
RotateMotor(OUT_B,50,-100);
ODER (RotateMotorEx (OUT_AB,50,30,0,True,False);)

until (SensorUS(IN_2) == false); //solange grade ausfahren bis hindernis nicht mehr erkannt
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (1000);
}

RotateMotor(OUT_A,50,100); //um 30 grad nach rechts drehen
RotateMotor(OUT_B,50,-100);
ODER (RotateMotorEx (OUT_AB,50,-30,0,True,False);  )

ResetRotationCount(OUT_A); // rotationen count zurücksetzen


until (MotorRotationCount (OUT_A) = x);  until (RotateMotor (OUT_A,Geschwindigkeit,x*360); //solange fahren bis x rotationen ausgeführt
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (1000);
}

RotateMotor(OUT_A,50,-100); //dann um 30 grad nach links drehen
RotateMotor(OUT_B,50,100);
ODER (RotateMotorEx (OUT_AB,50,30,0,True,False);  )

OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC); // greade ausfahren
Wait (1000);
Off(OUT_AB);
}

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 31. Okt 2010 16:33

2. Dieser Befehl bewirkt, dass der Motor sich solange dreht, wie in der variable Strecke angegeben. Das *360 deshalb, weil ja die Rotationen gezählt wurden und du grad brauchst.
3. Ja er muss noch in die schleifen rein

Das mit Wait(1000) war nur ein Beispiel du kannst auch z.b. 2000 für 2 Sekunden nehmen.

Du hast im gepostetem Programm zwar die variable Strecke genannt, aber unten noch x stehen.
Beim ersten ODER die Version vor ODER.
Nach resetrotationcount ein kleines wait einbauen.
Bei zweitem ODER die Version vor ODER.
Bei until (SensorUS...) statt true ein false
Danach das if durch ein until ersetzen und auch auf false stellen
bei drittem ODER wieder erste Version.
Das nächste until komplett löschen und einfach nur RotateMotor(OUT_A,Leistung,Strecke*360) schreiben
Bei viertem ODER wieder erste Version

sollte funktionieren(ungetestet)
Real coders don't comment their code - it was hard to write, it should be hard to understand!

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 31. Okt 2010 17:04

so passt es also? oder hab ich mich jetzt verschrieben :D kann gut sein


Code: Alles auswählen

#define Abstand 50

int Strecke

task main ()
{
SetSensorLowspeed(IN_1);
SetSensorLowspeed(IN_2);
SetSensorMode(IN_2, SENSOR_MODE_BOOL);

until(SensorUS(IN_1)<Abstand) //solange vorwärtsfahren bis kleiner abstand
{
OnFwdReg(OUT_AB, 50, OUT_REGMODE_SYNC);
Wait(2000);
}

RotateMotor(OUT_A,50,-100);      //um 30 grad nach links drehen
RotateMotor(OUT_B,50,100);


ResetRotationCount(OUT_A); //rotationen count zurücksetzen
Wait(2000);

until (SensorUS(IN_2) == false); //solange gradeausfahren bis hindernis nicht erkannt wird
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
}

//motorrotationen mitzählen bis hindernis nicht mehr erkannt wird und als strecke speichern:
until (SensorUS(IN_2) == false);
{
Off (OUT_AB);
Strecke = MotorRotationCount(OUT_A);
}

RotateMotor(OUT_A,50,100);  //30 grad nach rechts drehen
RotateMotor(OUT_B,50,-100);


until (SensorUS(IN_2) == false); //solange grade ausfahren bis hindernis nicht mehr erkannt
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
}


RotateMotor(OUT_A,50,100); //um 30 grad nach rechts drehen
RotateMotor(OUT_B,50,-100);


ResetRotationCount(OUT_A); // rotationen count zurücksetzen


 RotateMotor (OUT_A,Geschwindigkeit,strecke*360); //solange fahren bis x(=strecke) rotationen ausgeführt

RotateMotor(OUT_A,50,-100); //dann um 30 grad nach links drehen
RotateMotor(OUT_B,50,100);

OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC); // greade ausfahren
Wait (2000);
Off(OUT_AB);
}

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 31. Okt 2010 17:12

nochmal ohne meine nervigen kommentare...

Code: Alles auswählen

until (SensorUS(IN_2) == false);
{
Off (OUT_AB);
Strecke = MotorRotationCount(OUT_A);
}

ist hier das offoutab richtig?
wie schauts aus mit klammer,leerzeichen und zeichensetzung?
kann man noch irgendwas kürzerfassen?

vielen dank auf jeden fall für die viele hilfe nxt pro :P

Code: Alles auswählen

#define Abstand 50

int Strecke

task main ()
{
SetSensorLowspeed(IN_1);
SetSensorLowspeed(IN_2);
SetSensorMode(IN_2, SENSOR_MODE_BOOL);

until(SensorUS(IN_1)<Abstand)
{
OnFwdReg(OUT_AB, 50, OUT_REGMODE_SYNC);
Wait(2000);
}

RotateMotor(OUT_A,50,-100);     
RotateMotor(OUT_B,50,100);

ResetRotationCount(OUT_A);
Wait(2000);

until (SensorUS(IN_2) == false);
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
}

until (SensorUS(IN_2) == false);
{
Off (OUT_AB);
Strecke = MotorRotationCount(OUT_A);
}

RotateMotor(OUT_A,50,100); 
RotateMotor(OUT_B,50,-100);

until (SensorUS(IN_2) == false);
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
}

RotateMotor(OUT_A,50,100);
RotateMotor(OUT_B,50,-100);

ResetRotationCount(OUT_A);

RotateMotor(OUT_A,Geschwindigkeit,strecke*360);

RotateMotor(OUT_A,50,-100);
RotateMotor(OUT_B,50,100);

OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
Off(OUT_AB);
}

Benutzeravatar
känganxt
Schreibt viel
Schreibt viel
Beiträge: 116
Registriert: 11. Aug 2010 13:41
Wohnort: Bayern
Kontaktdaten:

Beitragvon känganxt » 1. Nov 2010 10:33

Du darfst unter:

Code: Alles auswählen

ResetRotationCount(OUT_A);
kein Wait machen,weil der Roboter wenn das Hindernis nicht so breit ist, zu weit die Rotationen zählt.
Zuletzt geändert von känganxt am 17. Nov 2010 09:35, insgesamt 1-mal geändert.
Bild

Mindstormsforum is cool!
NXT-Programms ist interessant!
NXC ist cool!

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 1. Nov 2010 10:49

okay...
noch ne frage müsste es hier nicht true heißen? weil der roboter soll ja gradeausfahren bis er das hindernis mit dem hinteren sensor erkennt. und er soll auch mitzählen bis er es erkennt. und erkennen müsste doch true heißen?
und das die rotationen als variable gespeichert werden durch den 2 until befehlt, stimmt auch?

Code: Alles auswählen

until (SensorUS(IN_2) == false);
{
OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
}

until (SensorUS(IN_2) == false);
{
Off (OUT_AB);
Strecke = MotorRotationCount(OUT_A);
}

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 1. Nov 2010 13:48

und was bewirken eigentlich die waits nach jedem onfwdreg?

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 1. Nov 2010 14:05

Noch mal ein paar Änderungen Kommentare sind Erklärungen und Fragen

Code: Alles auswählen

#define ABSTAND 50 //der besseren Übersicht wegen werden Konstanten GROß geschrieben

int strecke;        //und Variablen klein

task main ()
{
SetSensorLowspeed(IN_1);
SetSensorLowspeed(IN_2);
SetSensorMode(IN_2, SENSOR_MODE_BOOL);

until(SensorUS(IN_1)<ABSTAND); //willst du hier , dass der NXT näher heranfährt?
  {
  OnFwdReg(OUT_AB, 50, OUT_REGMODE_SYNC); //dann änder doch einfach ABSTAND
  Wait(2000);                             //für was das OnFwdReg
  }

RotateMotor(OUT_A,50,-100);
RotateMotor(OUT_B,50,100);

ResetRotationCount(OUT_A);


while (SensorUS(IN_2) == true);         // fährt solange, wie das hindernis erkannt wird
  {
  OnFwdReg(OUT_AB,50,OUT_REGMODE_SYNC);
  }


until (SensorUS(IN_2) == false);         //Soll da noch ein stück weiter an dem hindernis vorbeigefahren werden?
  {
  OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
  Wait (2000);
  }                                      // das mit wait 2000 war auch nur ein beispiel, du kannst jede
                                         // beliebige zahl nehmen, du brauchst soviel, das der motor
                                         // die gewünschte strecke abfahren kann
                                         // (in Millisekunden, ausprobieren)


until (SensorUS(IN_2) == false);
  {
  Off (OUT_AB);
  strecke = MotorRotationCount(OUT_A);
  NumOut(0,LCD_LINE2,strecke);             // Zeigt die Rotationen auf dem Display in Zeile 2 an
  Wait(1000);
  }

RotateMotor(OUT_A,50,100);
RotateMotor(OUT_B,50,-100);

until (SensorUS(IN_2) == false);         //für was ist das hier?
  {
  OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
  Wait (2000);
  }

RotateMotor(OUT_A,50,100);
RotateMotor(OUT_B,50,-100);

ResetRotationCount(OUT_A);

RotateMotor(OUT_AB,50,strecke*360);

RotateMotor(OUT_A,50,-100);
RotateMotor(OUT_B,50,100);

OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
Off(OUT_AB);
ClearScreen;
}


Die Waits sind dafür da das der Befehl nicht einfach übersprungen wird

Kann dir auch mal folgende seiten empfehlen:
http://www.debacher.de/wiki/NXC
http://www.roberta-home.de/sites/defaul ... v1-7_0.pdf
http://www.youtube.com/watch?v=EOH4rala6vA&translated=1

Ist bei allen sehr gut erklärt
Real coders don't comment their code - it was hard to write, it should be hard to understand!

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 1. Nov 2010 14:49

jetzt wirds etwas unübersichtlich^^ meine antworten in klammern!
zur waitfrage:
auf was wird dann gewartet? sind die waits dann auf das fahren oder auf das messen des sensors bezogen?

NXT pro hat geschrieben:

Code: Alles auswählen

until(SensorUS(IN_1)<ABSTAND);
//willst du hier , dass der NXT näher heranfährt?
( ICH WILL DAS ER SOLANGE HINFÄHRT BIS DER ABSTAND 50 CM IST)
  {
  OnFwdReg(OUT_AB, 50, OUT_REGMODE_SYNC);
//dann änder doch einfach ABSTAND   ( WIE MEINST DU?)
  Wait(2000);                             //für was das OnFwdReg
 (DAMIT ER SOLANGE GERADE AUSFÄHRT BIS 50 CM ERREICHT SIND)
  }




Code: Alles auswählen

while (SensorUS(IN_2) == true);         // fährt solange, wie das hindernis erkannt wird   (ER SOLL DOCH NUR FAHREN BIS ER ERKENNT,dann drehen)
  {
  OnFwdReg(OUT_AB,50,OUT_REGMODE_SYNC);
  }


Code: Alles auswählen

until (SensorUS(IN_2) == false);       
 //Soll da noch ein stück weiter an dem hindernis vorbeigefahren werden? (NEIN. da soll sofort nach rechts gedreht werden,so dass er parallel zum hindernis steht)
  {
  OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
  Wait (2000);
  }                                      // das mit wait 2000 war auch nur ein....
(LEIDER KANN ICH NICHT MEHR AUSPROBIEREN...was nun?)



Code: Alles auswählen

until (SensorUS(IN_2) == false);         //für was ist das hier?
(DER ROBOTER SOLL solange am hindernis vorbeifahren bis er es nicht mehr erkennt)
  {
  OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
  Wait (2000);
  }

[/code]
Zuletzt geändert von Nakiri am 1. Nov 2010 15:14, insgesamt 1-mal geändert.

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 1. Nov 2010 15:12

Bild

hier ein bild, damit der vorgang vll leichter zu verstehen ist ;)

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 2. Nov 2010 19:18

Wohl hoffentlich die letzte Version

Code: Alles auswählen

#define ABSTAND 50 //der besseren Übersicht wegen werden Konstanten GROß geschrieben

int strecke;        //und Variablen klein

task main ()
{
SetSensorLowspeed(IN_1);
SetSensorLowspeed(IN_2);
SetSensorMode(IN_2, SENSOR_MODE_BOOL);

while(SensorUS(IN_1)>ABSTAND); // dann muss es while heißen und >ABSTAND
{
  OnFwdReg(OUT_AB, 50, OUT_REGMODE_SYNC); // in dem Fall muss kein wait dastehen,
}                                         //weil auf den Sensor gewartet wird

until(SensorUS(IN_1)<ABSTAND);            //wenn  US <ABSTAND
Off(OUT_AB);                               //STOP
Wait(100);                                //Zeit für STOP:0,1 Sekunde
RotateMotor(OUT_A,50,-100);
RotateMotor(OUT_B,50,100);

ResetRotationCount(OUT_A);

while (SensorUS(IN_2) == 0);
OnFwdReg(OUT_AB,50,OUT_REGMODE_SYNC);

until(SensorUS(IN_2) == 1);
{
  Off(OUT_AB);
  Wait(1000);
}
 
until (SensorUS(IN_2) == 1);
{
  strecke = MotorRotationCount(OUT_A);
  NumOut(0,LCD_LINE2,strecke);             // Zeigt die Rotationen auf dem Display in Zeile 2 an
  Wait(1000);
}
ResetRotationCount(OUT_A);


until (SensorUS(IN_2) == 1);         // fährt , bis hindernis erkannt wird
{                                    // ich habe mal gelesen, dass es mit modus bool nur 0 und 1 gibt
  RotateMotor(OUT_A,50,100);         //Dreht um dreißig grad
  RotateMotor(OUT_B,50,-100);
}
Wait(200);



while (SensorUS(IN_2) == 1);             //Um am Hindernis vorbeizufahren
{
  OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
}


until (SensorUS(IN_2) == 0);              //Drehen, wenn am hinderniss vorbei
{
  RotateMotor(OUT_A,50,100);
  RotateMotor(OUT_B,50,-100);
}

Wait(1000);

until (SensorUS(IN_2) == 0);
RotateMotor(OUT_AB, 50,strecke*360);

Wait(1000);

RotateMotor(OUT_A,50,100);
RotateMotor(OUT_B,50,-100);

ResetRotationCount(OUT_A);


OnFwdReg(OUT_AB, 80, OUT_REGMODE_SYNC);
Wait (2000);
Off(OUT_AB);
ClearScreen();
}
Real coders don't comment their code - it was hard to write, it should be hard to understand!

Benutzeravatar
känganxt
Schreibt viel
Schreibt viel
Beiträge: 116
Registriert: 11. Aug 2010 13:41
Wohnort: Bayern
Kontaktdaten:

Beitragvon känganxt » 2. Nov 2010 19:52

Du musst den Roboter um 90 Grad drehen lassen, da sonst der Sensor 2 falsche Werte liefert. Sonst wird er beim solange fahren bis Hindernis nicht mehr da
(

Code: Alles auswählen

while (SensorUS(IN_2) == 0);
OnFwdReg(OUT_AB,50,OUT_REGMODE_SYNC);
)
einfach weiterfahren.
Zuletzt geändert von känganxt am 17. Nov 2010 09:31, insgesamt 1-mal geändert.
Bild

Mindstormsforum is cool!
NXT-Programms ist interessant!
NXC ist cool!

Benutzeravatar
NXT pro
Super-Enorm-Viel-Schreiber
Super-Enorm-Viel-Schreiber
Beiträge: 930
Registriert: 27. Sep 2010 21:38

Beitragvon NXT pro » 3. Nov 2010 12:54

känganxt hat geschrieben:Du musst den Roboter um 90 Grad drehen lassen, da sonst der Sensor 2 falsche Werte liefert. Sonst wird er beim solange fahren bis Hindernis nicht mehr da
(

Code: Alles auswählen

while (SensorUS(IN_2) == 0);
OnFwdReg(OUT_AB,50,OUT_REGMODE_SYNC);
)
einfach weiterfahren.

Wenn sein lehrer im das so vorgibt, soll er es hal so machen
Real coders don't comment their code - it was hard to write, it should be hard to understand!

Nakiri
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 55
Registriert: 9. Okt 2010 12:39

Beitragvon Nakiri » 3. Nov 2010 17:46

schaut sehr edel aus :P danke ;)
kurz noch einige fragen zur bedeutung, weil ich das ganze noch als struktogramm schreiben darf :D




Code: Alles auswählen

until(SensorUS(IN_1)<ABSTAND);            //wenn  US <ABSTAND
Off(OUT_AB);                               //STOP
Wait(100);                                //Zeit für STOP:0,1 Sekunde
RotateMotor(OUT_A,50,-100);
RotateMotor(OUT_B,50,100);

keine geschweiften klammern bei until befehl?



Code: Alles auswählen

while (SensorUS(IN_2) == 0);
OnFwdReg(OUT_AB,50,OUT_REGMODE_SYNC);

keine geschweiften klammern bei while befehl?

Code: Alles auswählen

until(SensorUS(IN_2) == 1);
{
  Off(OUT_AB);
  Wait(1000);
}

wait damit es 1 sek ausbleibt?

Code: Alles auswählen

until (SensorUS(IN_2) == 1);
{
  strecke = MotorRotationCount(OUT_A);
  NumOut(0,LCD_LINE2,strecke);             // Zeigt die Rotationen auf dem Display in Zeile 2 an
  Wait(1000);
}

auf was wird gewaitet?



Code: Alles auswählen

until (SensorUS(IN_2) == 1);         // fährt , bis hindernis erkannt wird
{                                    // ich habe mal gelesen, dass es mit modus bool nur 0 und 1 gibt
  RotateMotor(OUT_A,50,100);         //Dreht um dreißig grad
  RotateMotor(OUT_B,50,-100);
}
Wait(200);

wait nur damit kurz pause ist?



Code: Alles auswählen

until (SensorUS(IN_2) == 0);
RotateMotor(OUT_AB, 50,strecke*360);

keine geschweiften klammern bei until befehl?


herzlichen dank nochmal jungs! ihr wart/seit meine rettung :)

Benutzeravatar
känganxt
Schreibt viel
Schreibt viel
Beiträge: 116
Registriert: 11. Aug 2010 13:41
Wohnort: Bayern
Kontaktdaten:

Beitragvon känganxt » 3. Nov 2010 18:45

1. keine geschweiften Klammern bei diesem until; 2. keine geschweiften Klammern bei diesem while; 3.
Damit es eine Sekunde ausbleibt
ja ich glaube schon; 4. ? 5. ja; 6. keine geschweiften Klammern bei diesem until
Zuletzt geändert von känganxt am 17. Nov 2010 09:35, insgesamt 1-mal geändert.
Bild

Mindstormsforum is cool!
NXT-Programms ist interessant!
NXC ist cool!


Zurück zu „Unterricht & AG“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss