PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Linienverfolgung



Mr.Roboto
21.07.2007, 18:57
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.



#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;
}

radbruch
21.07.2007, 19:50
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:


#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 (https://www.roboternetz.de/phpBB2/viewtopic.php?p=275614#275614). (Um es nicht unnötig kompliziert zu machen, solltest du eine Version unter 2.7 wählen.)

Gruß

mic

Mr.Roboto
21.07.2007, 20:11
hmm, jo ... das Programm funktioniert, aber die FrontLED geht bei mir nicht an, wenn ich den taster drücke. Wie bekommst du denn so schöne IntegerWerte, wenn ich das Array mit den Sensordaten ausgebe, bekomme ich nur irgenwelche zeichen angezeigt, muss ich ne typenkovertierung vornehmen ??

damaltor
21.07.2007, 21:15
ja das musst du... folgende funktion geht:

unsigned char zumsenden[5];
LineData(data);
itoa(data[0],zumsenden,10);
SerWrite(zumsenden,5);

dann sollte der wert von data[0] an hyperterm gesendet werden.
das gleiche dann mit data[1]

radbruch
21.07.2007, 21:48
Hallo

Die Integerwerte kann man mit der Funktion PrintInt() an den PC senden. Die ist aber in der CD-Version von asuro.c nicht enthalten. Entweder besorgst du dir eine neuere Lib (http://sourceforge.net/project/showfiles.php?group_id=155217&package_id=172835) oder baust diesen Code in dein Programm ein:


void PrintInt(int wert)
{ char text[6]=" ";
itoa(wert,text,10);
SerWrite(text,5);
}

(aus asuro.c Version größer 2.1)

Wenn die FrontLED nicht angeht, drückst du entweder die falsche Tasten, oder deine Tasten sind nicht in Ordnung. Schau dir mal diese Beschreibung der Tastenfunktion an:

http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

Gruß

mic

[Edit]
Oh, der Glasfaser-Mod ist auch mal wieder online *winkt*

Mr.Roboto
23.07.2007, 11:23
Oh man, ich weiß, warum ich solche Probleme hatte, ich hab Init() vergessen !!!