Den Odo Test hatte ich vorher durchgeführt, meine
http://roboter.net-con.net/asuro/source/ododemo1.html
Hier aber mal der quelltext, fehlt nur die kollisionsabfrage da das ne ewig lange case abfrage ist für die möglichen tast ereignisse und rückwärtsfahren usw.
ps: habs nur schnell wieder zusammen gefriemelt ohne meine eigenen verbesserungen.. aber da eh der selbe fehler auftritt ist das ja egal.. habs jetzt so nochmal getestet und in 90% aller fälle denkt asuro er steht und fährt halt rückwärts.. ganz selten fährt er mal normal gerade aus und reagiert dann auf linienerkennung und taster.
Code:#include "asuro.h" #define SPEED_L 110 #define SPEED_R 110 unsigned int lineData[2]; /** Odometrie links/rechts */ unsigned int data[2]; /** flag für aktuellen zustand der farbe */ int Lnow = 0; int Rnow = 0; int Rold = 0; int Lold = 0; // haben sich die werte geändert unsigned int fl_Lch = 0; unsigned int fl_Rch = 0; /** zähler für farbwechsel */ unsigned int Count1 = 0; unsigned int Count2 = 0; int j = 0; int k = 0; void Msleep(int dauer) {..... void drive_back(void) {..... void drive_back_bit(void) {..... void drive_left(void) {..... void drive_right(void) { Msleep(30); MotorSpeed(150, 0); BackLED(ON, OFF); Msleep(1000); MotorSpeed(0, 0); Msleep(10); } void kollisions_abfrage(void){ .. .. switch (k) { case 1: drive_back_bit(); drive_left(); //K6 break; case 2: .. .. default: MotorSpeed(SPEED_L, SPEED_R); } } void odoabfrage(void){ for (j = 0; j < 30; j++) { OdometrieData(data); //werte stabilisieren } OdometrieData(data); // 0. links, 1. rechts // Schwellwert für schwarz/weiss linke Seite if (data[0] > 550) Lnow = 1; else Lnow = 0; // Schwellwert für schwarz/weiss rechte Seite if (data[1] > 550) Rnow = 1; else Rnow = 0; if (Lnow ^ Lold) { fl_Lch = 1; } else { fl_Lch = 0; } if (Rnow ^ Rold) { fl_Rch = 1; } else { fl_Rch = 0; } // hat sich der Asuro bewegt ? if (fl_Rch || fl_Lch) { // alte werte merken für nächsten schleifendurchlauf Lold = Lnow; Rold = Rnow; }else{ //Asuro hat sich nicht bewegt Lold = Lnow; Rold = Rnow; drive_back(); drive_left(); } } int main(void) { /*START*/ Init(); MotorDir(FWD, FWD); StatusLED(YELLOW); FrontLED(ON); SerPrint("ASURO Bereit!.. "); /*WARTEN*/ while (PollSwitch() != 1) { BackLED(ON, OFF); Msleep(300); BackLED(OFF, ON); Msleep(300); } Msleep(1000); //1 sekunde warten BackLED(OFF, OFF); StatusLED(GREEN); SerPrint("Fahre los.. "); MotorSpeed(SPEED_L, SPEED_R); while (1) { //Kollisionsabfrage kollisions_abfrage(); //Linienabfrage LineData(lineData); if (lineData[LEFT] < 20 && lineData[RIGHT] < 20) { drive_back(); drive_left(); } else if (lineData[RIGHT] < 20) { drive_left(); } else if (lineData[LEFT] < 20) { drive_right(); } //bis hier klappt alles, jetzt die neue odo abfrage falls asuro mal hängen bleibt //Odometrieabfrage odoabfrage(); MotorSpeed(SPEED_L, SPEED_R); BackLED(ON, ON); } SerPrint(" Fehler! "); StatusLED(RED); BackLED(OFF, OFF); MotorSpeed(0, 0); while (1) { } return 0; }







Zitieren

Lesezeichen