hi, wo genau in der switch anweisung ist denn die ecke?also welche anweisung führt die 90° drehung aus?
edit: hab´s gefunden, wer lesen kann ist klar im vorteil
probier mal den code:
mfg jeffreyCode:#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) { 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; zaehler++; 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; }







Zitieren

Lesezeichen