Hallo
schade dass mir keiner geschrieben hat...
Bitte entschuldige.
Du solltest besser warten bis dein neuer asuro eingetroffen ist und noch etwas üben:
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;
}
(Nicht gestestet weil mein asuro eingemottet ist)
Gruß
mic
Lesezeichen