Problem mit Linienverfolgung
Servus, hab mich mal an der Linienverfolgung des Asuros ausgelassen, aber irgenwie spackt der voll ab und zappelt rum, als ob er behindert wäre :-) ...
Welche Werte schreibt denn die Linienverfolgungsfunktion in das Integerarray ?? Wie groß ist die Werte differenz Zwischen den 2 Fototransistoren, wenn der eine eine Schwarz "sieht" und der andere Weiß ?? Wenn ich die Integerwerte mit dem terminalprogramm an den Computer sende wird mir auch nur Mist angezeigt, werden die Ingerwerte in AscII-Zeichen umgewandelt oder was passiert da ??
Wäre cool, wenn sich jemand die Zeit nimmt und mich aufklärt....
P.S.:Unten is der Code von dem Programmfrag das ich zur Linienverfolgung geschrieben haben.
Code:
#include "asuro.h"
unsigned int fototransistor[2];
int i;
void LinieLinks(void)
{
for(i=0;i<=20;i++)
{
MotorDir(RWD,RWD);
MotorSpeed(100,120);
Sleep(255);
}
for(i=0;i<=20;i++)
{
MotorDir(BREAK,RWD);
MotorSpeed(100,120);
Sleep(255);
}
}
void LinieRechts(void)
{
for(i=0;i<=50;i++)
{
MotorDir(RWD,RWD);
MotorSpeed(100,120);
Sleep(255);
}
for(i=0;i<=50;i++)
{
MotorDir(BREAK,RWD);
MotorSpeed(100,120);
Sleep(255);
}
}
int main(void)
{
FrontLED(ON);
do
{
FrontLED(ON);
SerWrite(fototransistor[0],3);
SerWrite("-",1);
SerWrite(fototransistor[1],3);
Init();
LineData(fototransistor);
for(i=0;i<=50;i++)
{
MotorDir(FWD,FWD);
MotorSpeed(100,120);
Sleep(255);
}
if((fototransistor[0]-fototransistor[1])<(-100)) //Linie links
{
BackLED(ON,OFF);
LinieLinks();
}
if((fototransistor[0]-fototransistor[1])>100) //Linie rechts
{
BackLED(OFF,ON);
LinieRechts();
}
}
while(1);
return 0;
}
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Ich hab' das immer mit einem kleinen Testprogramm untersucht, Daten einlesen und zum PC senden, im Stillstand, also ohne Motor. Dann muss man zwar die Linie von Hand bewegen, aber das schadet ja nicht.
Blöderweise gibts dazu keinen Quellcode mehr, deshalb kann ich dir nur das .hex anbieten. Dafür funktioniert es so mit jeder Version der Lib die du verwendest. Mit K6/K5 kann man die FrontLED ein oder ausschalten. Datei ist im Anhang.
Mein Kreismessprogramm habe ich aber noch. Kannst du dir ja mal anschauen. Der asuro dreht sich über der Linie und merkt sich die Werte, am Ende sendet er sie dann zum PC:
Code:
#include "asuro.h"
#define limit 50
#define NewLine SerWrite("\n\r",2)
#define Trenner SerWrite("; ",2)
unsigned int data[2], data_old[2], d_l[limit], d_r[limit], zeiger;
int main( void ){
Init();
zeiger=0;
LineData(data_old);
d_l[zeiger]=data_old[0];
d_r[zeiger]=data_old[1];
zeiger++;
FrontLED(ON);
Msleep(500);
MotorDir(BREAK,BREAK);
MotorSpeed(255,255);
while(zeiger<limit) {
if (zeiger & 1) StatusLED(YELLOW); else StatusLED(RED);
MotorDir(FWD,RWD);
Msleep(10);
MotorDir(FREE,FREE);
Msleep(100);
LineData(data);
if ((data[0]!=data_old[0]) || (data[1]!=data_old[1])) {
d_l[zeiger]=data[0];
d_r[zeiger]=data[1];
data_old[0]=data[0];
data_old[1]=data[1];
zeiger++;
}
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
FrontLED(OFF);
Msleep(500);
while(!PollSwitch()) { StatusLED(GREEN); Msleep(200); StatusLED(OFF); Msleep(600);}
NewLine; NewLine;
SerWrite("Gespeicherte Linedatas (10.3.2007)",34);
NewLine; NewLine;
for (zeiger=0; zeiger<limit; zeiger++) {
NewLine;
PrintInt(zeiger);
Trenner;
PrintInt(d_l[zeiger]);
Trenner;
PrintInt(d_r[zeiger]);
Trenner;
PrintInt(d_l[zeiger]+d_r[zeiger]);
Trenner;
PrintInt(d_l[zeiger]-d_r[zeiger]);
}
while(1) { StatusLED(RED); Msleep(200); StatusLED(OFF); Msleep(600);}
return 0;
}
Das benötigt allerdings eine asuro.c die schon PrintInt() und Msleep() kennt. Links dazu findest du im FileThread. (Um es nicht unnötig kompliziert zu machen, solltest du eine Version unter 2.7 wählen.)
Gruß
mic