Hallo alle zusammen,
ich versuche, das Problem nun anders (und auch wesentlich sinnvoller) zu lösen, indem ich mit der odometrie arbeite. Mein Ziel ist nämlich, das der asuro eine linie lang fährt, dann auf ein Hinderniss trifft, einige Zentimeter zurück fährt und dann um das Hinderniss herum fährt, um schließlich wieder auf die Linie zurückzukehren.(Ich wollte mit der Zeiteinstellung die Odometrie erst umgehen). Mit dem Prog. binn ich bis jetzt soweit, dass der Asuro die linie entlang fährt, auf das Hinderniss trifft und (eigentlich) ca. eine Reifenumdrehung zurückfahren soll. Nur tut er letzteres nicht. Er fährt die Linie lang und wenn man die Tater drückt, tut er, solange man sie gedrückt hält, gar nichts. Ich verwende Folgendes Programm:
Über schnelle Antwort würde ich mich freuen!!!Code:#include "asuro.h" //P//LINIENVERFOLGUNG #define LINIENWERT //D// //folgende werte müssen ggf. //verändert werden!!! #define SCHWELLENWERT 600 //D//GRENZE ZWISCHEN HELL UND DUNKEL FESTLEGEN #define HYSTERSIS 10 //D//WERT ZUR VORBEUGUNG VON STÖRUNGEN //die hier nicht mehr!!! #define LOW 0 //D//-}\WERTE ZUR ÜBERPRÜFUNG, OB SCHON EIN #define HIGH 1 //D//-}/WECHSEL STATTGEFUNDEN HAT, FESTLEGEN int main(void) //V//PROZESSOR IN GRUNDZUSTAND VERSETZEN { unsigned int status[2]={0,0}; //V//SPEICHER FÜR "HAT WECHSEL STSTTGEFUNDEN?" unsigned int odata[2]; //V//SPEICHER FÜR GEBERSCHEIBENZUSTAND unsigned int counter[2]={0,0}; //V//SPEICHER ZUM ZÄHLEN DER GEBERSCHEIBEN-IMPULSE unsigned int ldata[2]; //V//SPEICHER FÜR LINIENFOLGE BEREITSTELLEN unsigned char t1; //V//SPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN unsigned char t2; //V//VERGLEICHSSPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN Init(); //S//START DES PROGRAMMS FrontLED(ON); //A//LINIENFOLGE-LED AN MotorDir(FWD,FWD); //A//MOTOREN AUF VOR while(1) //E//ENDLOSSCHLEIFE: { t1=PollSwitch(); //A//TASTENABFRAGE t2=PollSwitch(); //A//VERGLEICHSTASTENABFRAGE if(t1==t2&&t1==0) //?//WENN KEINE TASTE GEDRÜCKT { //!//(MIT VERGLEICH MIT t2 ZUR SICHERSTELLUNG DER RICHTIGKEIT t2s) LineData(ldata); //://LINIENFOLGE-DATEN EINLESEN if(ldata[0]>ldata[1]) //:?/WENN LINKS HELLER ALS RECHTS, {MotorDir(FWD,FWD); //://BEIDE MOTOREN AUF VORWÄRTS MotorSpeed(150,0); //://LINKS MEHR GAS StatusLED(RED);} //://UND STATUS LED ROT; else //:?/SONST: {MotorDir(FWD,FWD); //://BEIDE MOTOREN AUF VORWÄRTS MotorSpeed(0,150); //://RECHTS MEHR GAS StatusLED(GREEN);} //://UND STATUS LED GRÜN } //://KOLLISIONANWEISUNG SCHLIEßEN else{ //!?/wENN KOLLISION MotorSpeed(0,0); //!//MOTOREN ANHALTEN MotorDir(RWD,RWD); //!//MOTOREN AUF RÜCKWÄRTS LineData(ldata); //!//LINIENFOLGE-DATEN EINLESEN while(counter<40) //!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE { //!// 40 IMPULSE ANALOG 1REIFENUMDREHUNG ERREICHT HAT OdometrieData(odata); //!//ODOMETRIEWERTE EINLESEN if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS) //!//HAT WECHSEL DER GEBERSCHEIBENFARBE { //!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ??? counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN if(ldata[0]>ldata[1]) //!?/WENN LINKS HELLER ALS RECHTS, {MotorSpeed(0,150); //!//LINKS MEHR GAS (RÜCKWÄRTS) BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN BackLED(ON,OFF);} //!//UND LINKE BACK-LED AN; else //!?//SONST: {MotorSpeed(150,0); //!/RECHTS MEHR GAS (RÜCKWÄRTS) BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN BackLED(OFF,ON);} //!//UND RECHTE BACK-LED AN; } //!//WECHSEL?-ANWEISUNG SCHLIEßEN if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS) //!//HAT WECHSEL DER GEBERSCHEIBENFARBE { //!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ??? counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN if(ldata[0]>ldata[1]) //!?/WENN LINKS HELLER ALS RECHTS, {MotorSpeed(0,150); //!//LINKS MEHR GAS (RÜCKWÄRTS) BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN BackLED(ON,OFF);} //!//UND LINKE BACK-LED AN; else //!?//SONST: {MotorSpeed(150,0); //!/RECHTS MEHR GAS (RÜCKWÄRTS) BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN BackLED(OFF,ON);} //!//UND RECHTE BACK-LED AN; } //!//WECHSEL?-ANWEISUNG SCHLIEßEN } //!//counter-anweisung geschlossen, wenn counter<40 ist, //!//kehre zu while(counter<40) zurück, ansonsten mache //!// in Reihenfolge weiter } //!//WENN KOLLISION-ANWEISUNG ZU ENDE } ////Wieder von vorne, ENDE ENDLOSSCHLEIFE return 0; ////return(0) } ////PROGRAMM ENDE
Viele Grüße,
C-3PO







Zitieren

Lesezeichen