Hallo
LEDs kann man nicht "schlagartig" ein- oder ausschalten. Sie brauchen etwas Zeit bis sie hell sind und sie leuchten nach dem Ausschalten nach. Deshalb sollte nach jedem Wechsel der FrontLED eine kurze Verzögerung eingebaut werden (ein paar sleep()s). Außerdem sollte man LineData() dann besser zweimal hintereinander aufrufen, denn gelegentlich stimmen die Werte beim ersten Aufruf nicht.
Wenn man dann noch diese Abfrage verwendet: "if (l<r)" dann klappt's auch mit dem Linienfolgen:
Code:
#include "asuro.h"
#define GESCHW 150
int main(void){
int lData[2];
int i, donl, doffl, donr, doffr, l, r;
Init();
MotorDir(FWD,FWD);
while(1)
{
FrontLED(OFF); // Umgebungslicht filtern
Sleep(10); // kurz warten bis LED aus
LineData(lData); //
LineData(lData); //
doffl = (lData[0]); //
doffr = (lData[1]); //
FrontLED(ON); //
Sleep(10); // kurz warten bis LED an
LineData(lData); //
LineData(lData); //
donl = (lData[0]); //
donr = (lData[1]); //
l = donl - doffl; //
r = donr - doffr; // r und l sind nun die werte von T9 und T10 mit gefiltertem Umgebungslicht
i = (l+r)/2;
if (l<r) // gegenlenken
{
MotorSpeed(GESCHW +i, GESCHW -i);
}
else
{
MotorSpeed(GESCHW -i, GESCHW +i);
}
}
return 0;
}
Mein asuro hat eine stärkere FrontLED und eine kürzere Endübersetzung im Getriebe und folgt mit deinem Code der Linie vorbildlich. Glückwunsch zu diesem gelungenen Programmansatz:
Bild hier
http://www.youtube.com/watch?v=gYAzFp7Hc4Y
btw: Mit "int main(void){" gibts keine Warnungen mehr.
Gruß
mic
Lesezeichen