PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Noch ein Thema zu Linienverfolgung^^



xtremecoder
13.04.2008, 16:08
Hallo RN-Crew!

Ich weis, es gibt bereits unzählige Threads zum Thema Linienverfolgung in diesem Thema, aber leider habe ich keines gefunden, in das ich meine Frage stecken könnte^^
also, was solls^^

zu meiner frage:
ich habe gerade meinen asuro neu bekommen und hab meine ersten programme schon geschrieben. Nun bin ich an einer Linienverfolgung dran, (schwarze linie auf weißem grund)

Ich weis nicht wieso, aber mein asuro macht einfach nicht das was ich im programm von ihm will.
Es könnte sein dass ich mich im programmieren vertan habe, ich weis aber nicht was im code falsch sein sollte.

nun denn.
als erstes filtere ich softwaretechnisch das umgebungslicht vom diodenlicht, dann kommt erst das mit den motoren.

Code:


#include "asuro.h"
#define GESCHW 150

void main(){

int lData[2];
int i, donl, doffl, donr, doffr, l, r;
Init();
MotorDir(FWD,FWD);
while(1)
{
FrontLED(OFF); // Umgebungslicht filtern
LineData(lData); //
doffl = (lData[0]); //
doffr = (lData[1]); //
FrontLED(ON); //
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)
{
MotorSpeed(GESCHW +i, GESCHW -i);
}
else
{
MotorSpeed(GESCHW -i, GESCHW +i);
}

}
return 0;
}


Findet ihr hier etwas das ich übersehe?

vielen vielen dank!!

-xtremecoder

radbruch
13.04.2008, 17:09
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:

#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:

http://i.ytimg.com/vi/gYAzFp7Hc4Y/2.jpg (http://www.youtube.com/watch?v=gYAzFp7Hc4Y)
http://www.youtube.com/watch?v=gYAzFp7Hc4Y

btw: Mit "int main(void){" gibts keine Warnungen mehr.

Gruß

mic

xtremecoder
14.04.2008, 19:42
Vielen dank radbruch!
Ich werde dieses programm in den nächsten tagen versuchen weiterzuentwickeln und dann poste ich was dabei rausgekommen ist.

danke