Hallo
Bitte entschuldige.schade dass mir keiner geschrieben hat...
Du solltest besser warten bis dein neuer asuro eingetroffen ist und noch etwas üben:
(Nicht gestestet weil mein asuro eingemottet ist)Code:#include "asuro.h" int main(void) { unsigned int data[2]; unsigned int ododata[2]; unsigned int odo; int Strecke; int Streckerueck; int diff; char Nummer; int Zahl; Init(); Strecke=0; Streckerueck=0; FrontLED(ON); MotorDir(FWD,FWD); // Nach Init() ist MotorDir immer FWD,FWD StatusLED(GREEN); // und StatusLED immer grün! // Ab hier wird der Linie gefolgt bis eine Taste gedrückt wird. // Bei jedem Durchgang wird Strecke erhöht. Bei 8MHz geht das trotz // kurzer Verzögeung durch LineData() rasend schnell, Strecke wird // vermutlich mehrmals überlaufen! while(PollSwitch() < 2) { LineData(data); if (data [0] > data [1] ) MotorSpeed(200,150); else MotorSpeed(150,200); Strecke++; } // Beginn der eigentlichen Hauptschleife, asuro steht vor einer Wand // Es wird deshalb mit roter StatusLED und stehenden Motoren gestartet... while(1) { StatusLED(RED); MotorSpeed(0,0); Nummer=0; // ... und 5 mal im Wechsel mit den BackLEDs geblinkt... while (Nummer<5) { Zahl=0; while (Zahl<100) { Sleep(216); Zahl++; } Zahl=0; BackLED(ON,OFF); while (Zahl<100) { Sleep(216); Zahl++; } BackLED(OFF,ON); Nummer++; } // ... dann etwas zurückstoßen um Abstand von der Wand zu gewinnen ... Zahl=0; MotorDir(RWD,RWD); MotorSpeed(180,180); BackLED(ON,ON); while (Zahl<350) { Sleep(216); Zahl++; } // Was jetzt kommt blicke ich noch nicht ganz. Aber Odometrie mit // eingeschalteten BackLeds geht schon mal gar nicht! MotorDir(FWD,RWD); // langsam vorwärts fahren MotorSpeed(120,120); Zahl=0; while (Zahl<35) // Folgendes mehrfach ausführen (endlos wenn diff<=750!!!) { OdometrieData(ododata); // Odo-Helligkeitswerte einlesen odo=ododata [0]; // Linker Wert in odo speichern Sleep(255); // sehr kurz warten OdometrieData(ododata); // Werte nochmals einlesen diff=odo-ododata [0]; // Werte vergleichen: Wenn der erste Wert mehr if (diff>750) Zahl++; // als 750 größer als der Zweite ist... Wasdas? } // So, das haben wir nun 35 mal gemacht und fahren weiterhin vorwärts mit 120. // Jetzt dreht asuro nach links oder rechts bis er eine Linie erkennt. Dabei wird // bei jedem Schleifendurchgang (auch während er die Linie noch sucht oder wenn er // pendelt) der Schleifendurchgangszähler (Streckerueck) mit irgendwas // (übergelaufene Strecke) verglichen. So geht das nicht! Ganz blöd wäre // wenn Strecke zu Beginn kleiner als 100 wäre. Aber dank überlaufenden // Variablen wird auch dann irgendwann mal abgebrochen. MotorDir(FWD,FWD); while(Strecke-Streckerueck>100) { LineData(data); if (data [0] > data [1] ) MotorSpeed(200,150); else MotorSpeed(150,200); Streckerueck++; } // Jetzt sollte der asuro vor der gegenüberliegenden Wand stehen .... } return 0; }
Gruß
mic







Zitieren
Lesezeichen