Irgendwie bekomm ich das nicht hin...
Hier mal alle Möglichkeiten die ich ausprobiert habe...
1) while-Schleife
Hier fährt ASURO nur geradeaus...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 zaehler=0; Init(); MotorDir(FWD,FWD); BackLED(OFF,OFF); while (zaehler<4) { zaehler++; 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); } return 0; }
2) for-Schleife
Hier fährt ASURO immer wieder das Quadrat und hört nicht mehr auf.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 zaehler; Init(); MotorDir(FWD,FWD); BackLED(OFF,OFF); while (1) { for(zaehler=0; zaehler<4; zaehler++) { 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); } } return 0; }
3) if-Anweisung
Nun fährt ASURO im Kreis.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 zaehler=0; Init(); MotorDir(FWD,FWD); BackLED(OFF,OFF); while (1) { if (zaehler<4) { zaehler++; 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); } } return 0; }
4) if-else-Anweisung
Hier springt er sofort in else, da er stehen bleibt.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 zaehler=0; Init(); MotorDir(FWD,FWD); BackLED(OFF,OFF); while (1) { if (zaehler<4) { zaehler++; 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); } return 0; }
5) do-while-Schleife
Auch hier fährt ASURO unendlich Quadrate.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 zaehler=0; Init(); MotorDir(FWD,FWD); BackLED(OFF,OFF); while (1) { do { zaehler++; 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); } while (zaehler<4); } return 0; }
Ich bin der Meinung, dass ich die Schleifen irgendwie falsch setze, sonst müsste ja eine funktionieren.
Oder mein Zähler funktioniert nicht....
Er muss ja aber sowohl die Differenz und die Odometrie 4mal ausführen, also muss ich die Schleifen in die while setzen. Ich kann ja die Schleifen nicht vor der Odometrie enden lassen, oder?







Zitieren
Lesezeichen