Hallo!
So brauch mal wieder eure Hilfe.
Hab ein Programm geschrieben, bei dem mein ASURO ein Quadrat fahren soll. Macht er auch... er führt es nur ständig aus. Ich möchte aber, dass er nur ein Quadrat fährt.
Hab schon alle möglichen Schleifen ausprobiert... er ignoriert die Anweisungen aber und fährt mehrere Quadrate..
Kann mir jemand helfen und sagen, wie ich mein Programm abändern muss, damit er nur ein Quadrat fährt?
Mein Programm:
Im Switch sage ich ihm was er fahren soll und unten werte ich die Odometrie aus. Da er die Odometrie ja auch ständig ausführen soll, dachte ich, dass ich eine Schleife direkt nach dem while einfügen muss, da ich nicht weiß wie ich die while abändere, dass sie das ganze nur 4mal ausführt.Code:#include "asuro.h" //Schwellwert für die Hell/Dunkel-Unterscheidung //Eventuell muss damit etwas variiert werden #define TRIGGERLEVEL 680 #define HYSTERESIS 30 #define LOW 0 #define HIGH 1 int main(void) { unsigned int data [2]; signed int status [2]={0,0}; unsigned int speed=255; //Startwert für halbe Motorgeschwindigkeit signed int difference=0; unsigned int distance=0; int i; Init(); MotorDir(FWD,FWD); while (1) { switch(distance) { //Am Anfang der Strecke Vollgas case 0:MotorDir(FWD,FWD); MotorSpeed(speed,speed); break; //Am Ende langsamer werden... case 215:speed=200; break; case 230:speed=150; break; //...und stehen bleiben case 251:MotorDir(BREAK,BREAK); //etwas warten, bis der Roboter wirklich steht for (i=0; i<100; i++) { Sleep(255); } //auf der Stelle nach links drehen MotorDir(RWD,FWD); speed=255; //und noch vermeiden, dass die Verzögerung //mehrmals aufgerufen wird distance=252; break; case 282: speed=200; break; case 288: speed=150; break; case 292: MotorDir(BREAK,BREAK); for (i=0; i<100; i++) { Sleep(255); } MotorDir(FWD,FWD); speed=255; distance=0; //und noch vermeiden, dass die Verzögerung //mehrmals aufgerufen wird break; } //Helligkeitswerte der Lichtschranken auslesen OdometrieData(data); //Wechsel linker Sensor von niedrig auf hoch? if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) { status[0]=HIGH; difference++; distance++; } //Wechsel linker Sensor von hoch auf niedrig? if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) { status[0]=LOW; difference++; distance++; } //Wechsel rechter Sensor von niedrig auf hoch? if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) { status[1]=HIGH; difference--; } //Wechsel rechter Sensor von hoch auf niedrig? if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) { status[1]=LOW; difference--; } //zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten //Wertebereich verlässt if(difference<-155) difference=-155; if(difference>155) difference=155; //StatusLED noch entsprechend der erkannten Segmente aufleuchten //lassen, grün für links, rot für rechts StatusLED(status[0]+status[1]*2); //Zähldifferenz passemd auf die Motoren verteilen if(difference>0) MotorSpeed(155-difference,155); else MotorSpeed(155,155+difference); } }
Habe es z.B. mit einer if else versucht.
Code:#include "asuro.h" //Schwellwert für die Hell/Dunkel-Unterscheidung //Eventuell muss damit etwas variiert werden #define TRIGGERLEVEL 680 #define HYSTERESIS 30 #define LOW 0 #define HIGH 1 int main(void) { unsigned int data [2]; signed int status [2]={0,0}; unsigned int speed=255; //Startwert für halbe Motorgeschwindigkeit signed int difference=0; unsigned int distance=0; int i; int x; signed int x=0; Init(); MotorDir(FWD,FWD); while (1) { if (x==4) { x++; switch(distance) { //Am Anfang der Strecke Vollgas case 0:MotorDir(FWD,FWD); MotorSpeed(speed,speed); break; //Am Ende langsamer werden... case 215:speed=200; break; case 230:speed=150; break; //...und stehen bleiben case 251:MotorDir(BREAK,BREAK); //etwas warten, bis der Roboter wirklich steht for (i=0; i<100; i++) { Sleep(255); } //auf der Stelle nach links drehen MotorDir(RWD,FWD); speed=255; //und noch vermeiden, dass die Verzögerung //mehrmals aufgerufen wird distance=252; break; case 282: speed=200; break; case 288: speed=150; break; case 292: MotorDir(BREAK,BREAK); for (i=0; i<100; i++) { Sleep(255); } MotorDir(FWD,FWD); speed=255; distance=0; //und noch vermeiden, dass die Verzögerung //mehrmals aufgerufen wird break; } //Helligkeitswerte der Lichtschranken auslesen OdometrieData(data); //Wechsel linker Sensor von niedrig auf hoch? if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) { status[0]=HIGH; difference++; distance++; } //Wechsel linker Sensor von hoch auf niedrig? if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) { status[0]=LOW; difference++; distance++; } //Wechsel rechter Sensor von niedrig auf hoch? if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) { status[1]=HIGH; difference--; } //Wechsel rechter Sensor von hoch auf niedrig? if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) { status[1]=LOW; difference--; } //zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten //Wertebereich verlässt if(difference<-155) difference=-155; if(difference>155) difference=155; //StatusLED noch entsprechend der erkannten Segmente aufleuchten //lassen, grün für links, rot für rechts StatusLED(status[0]+status[1]*2); //Zähldifferenz passemd auf die Motoren verteilen if(difference>0) MotorSpeed(155-difference,155); else MotorSpeed(155,155+difference); } else MotorDir(BREAK,BREAK); } }







Zitieren

Lesezeichen