PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienverfolgung mit verschieden geschwindigkeiten via IR



Robotoby
25.02.2009, 21:07
Hallo Robo fans

Habe da ein klitze kleines problemchen
Wollte meinen Asuro eine linie verfolgen lassen und während der fahrt via IR verschiedene geschwindigkeiten einstellen. Tja also reagieren tut er auf meine befehle, jedoch nicht so wie er sollte. Besser gesagt wenn ich z.B a Drücke sollte er mit einer Geschwindigkeit von 120 fahren. Nun das tut er auch jedoch fährt er dann mit dieser geschwindigkeit gerade aus statt der Linie entlang. Die linienverfolgung ohne befehle funktioniert ganz gut.

Hat jemand eine idee was ich da falsch mache?

Gruss Robotoby


#include <asuro.h>

int main(void)


{
unsigned int data[2];
int i;
char input[1];

Init();
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{

SerRead(input,1,0);

if(input[0]=='a')

{
a = 120;
}

if else(input[0]=='b')

{
a = 180;
}

if else(input[0]=='c')

{
a = 200;
}

if else(input[0]=='d')

{
a = 220;
}

else

{
a = 250
}

LineData(data);
if(data[0]>data[1])
{
MotorSpeed(a,0);
BackLED(ON,OFF);
}
else if (data [0] < data [1] )
{
MotorSpeed(0,a);
BackLED(OFF,ON);
}
else
{
MotorSpeed(a,a);
BackLED(ON,ON);
}
}
return 0;
}

radbruch
25.02.2009, 21:32
Hallo,

willkommen im RN-Forum.

Ich kann dein Programm nicht fehlerfrei kompilieren, diese Version ist (syntax-)fehlerfrei:

#include "asuro.h"

int main(void)
{
unsigned int data[2];
int a;
char input[1];

Init();
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{
SerRead(input,1,0);
if(input[0]=='a')
{
a = 120;
}
else if(input[0]=='b')
{
a = 180;
}
else if(input[0]=='c')
{
a = 200;
}
else if(input[0]=='d')
{
a = 220;
}
else
{
a = 250;
}
LineData(data);
if(data[0]>data[1])
{
MotorSpeed(a,0);
BackLED(ON,OFF);
}
else if (data [0] < data [1] )
{
MotorSpeed(0,a);
BackLED(OFF,ON);
}
else
{
MotorSpeed(a,a);
BackLED(ON,ON);
}
}
return(0);
}
Allerdings kann ich es im Moment nicht testen. "if else" kennt C nicht, int i ist a und die Lib wird mit #include "asuro.h" eingebunden.

Ich hoffe das hilft

mic

Robotoby
26.02.2009, 17:41
Ach du grüne neune ist doch tatsächlich das falsche programm reingeschlichen. Hmm nun das hilft mir nicht gerade weiter.
also noch einmal der richtige code. Bei mir klappt das compilieren mit diesem programm das neu steht. jedoch nicht so wie es zu wüscnschen währe.

;
int i,a;
char input[1];

Init();
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{

SerRead(input,1,0);

if(input[0]=='a')

{
a = 120;
}

if else(input[0]=='b')

{
a = 180;
}

if else(input[0]=='c')

{
a = 200;
}

if else(input[0]=='d')

{
a = 220;
}

else

{
a = 250
}

LineData(data);
if(data[0]>data[1])
{
MotorSpeed(a,0);
BackLED(ON,OFF);
}
else if (data [0] < data [1] )
{
MotorSpeed(0,a);
BackLED(OFF,ON);
}
else
{
MotorSpeed(a,a);
BackLED(ON,ON);
}
}
return 0;
}

hai1991
26.02.2009, 18:28
hallo

also ich kann mir nicht vorstellen, das dieser code ohne error compiliert wird, denn du schreibst schon wieder if else, wobei else if gehört!!!

hast du vorm compilieren gespeichert??

Robotoby
26.02.2009, 18:51
Hehe Ja ok es funktioniert schon so wie ihr sagt if else ese if verkehrt aber das ist nicht das problem:)

nun habe unterdessen das programm ein wenig geändert. Jedoch immer noch nicht mit erfolg.hmm


#include "asuro.h"

int geschw_einlesen(void);

int main(void)


{
unsigned int data[2];
unsigned int b;



Init();

FrontLED(ON);

MotorDir(FWD,FWD);

while(1)
{

b = geschw_einlesen();

LineData(data);
if(data[0]>data[1])
{
PrintInt(data[0]);
MotorSpeed(b,0);
BackLED(ON,OFF);
SerWrite("ok1",3);

}
else if (data [0] < data [1] )
{

MotorSpeed(0,b);
BackLED(OFF,ON);
SerWrite("ok2",3);
}
else
{
MotorSpeed(b,b);
BackLED(ON,ON);
SerWrite("ok3",3);
}
}
}


int geschw_einlesen( void )
{
unsigned int a;
unsigned char input[] = "01";

SerWrite("ein",3);
SerRead(input,1,0);
a = 0;

if(input[0]=='a') {
a = 120;
SerWrite("120",3);
}

else if (input[0]=='b') {
a = 180;
SerWrite("180",3);
}

else if (input[0]=='c') {
a = 200;
SerWrite("200",3);
}

else if (input[0]=='d') {
a = 220;
SerWrite("220",3);
}

return a;
}

Robotoby
26.02.2009, 18:55
kompilieren geht fehlerfrei. Doch mir scheint er liest die linienverfolgungs sensoren nicht aus. also irgentwo muss was blockieren:) Und wenn ich schon dabei bin funtktioniert bei euch der Befehl PrintInt(Variabel);?? mir schickt der compiler folgenden fehler:

test.c:28: warning: implicit declaration of function `PrintInt'
C:\ASURO_src\FirstTry/test.c:28: undefined reference to `PrintInt'

Ach ja und he danke jungs für eure interesse an meinem problem:)

radbruch
26.02.2009, 19:10
Hallo

PrintInt() kann Integerwerte zum Terminal senden und ist in der orginalen asuro-Library noch nicht enthalten. Auf die Schnelle ohne Installation einer aktuelleren Version kann man sich gut auch so behelfen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=328202#328202

btw fehlt in der orginalen Lib auch Msleep(), das kann man aber auch so ersetzen:

void Msleep(unsigned int millisekunden)
{
while(millisekunden--) Sleep(72); // Sleep(72) dauert ca. 1 ms
}

Gruß

mic

Robotoby
26.02.2009, 19:24
hehe ja ok alles klar doch woher krieg ich nun die neue lib?

radbruch
26.02.2009, 19:52
Die verschiedenen Versionen gibts hier:

http://sourceforge.net/projects/asuro

oder hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=275614#275614

Meiner Meinung nach kann man den asuro mit der orginalen oder einer etwas älteren Lib besser kennenlernen. Aber jeder kann das halten wie er will...

Robotoby
26.02.2009, 19:54
hehe danke habe gerade herausgefunden wis geht. so ganz ein frischer hase bin ich nicht, doch nach zwei jahren ausetzten ist man schon ganz schön aufgeschmissen:)

Valen
27.02.2009, 00:46
Du hast gesagt Asuro reagiert auf deinem senden des A zeichens. Aber reagiert er eigentlich schon auf dem anderen zeichen (b,c,d). Das wurde vieleicht auch ein bisschen erklären wie die compiler deine


if else(input[0]=='b')
{
a = 180;
}
ergänzt hat.

Aber es könnte naturlich auch so sein dass Asuro nur dass linien spur verloren hat wenn einer seiner rader nicht mehr dreht/gebremst wird. Wie reagiert er mit einer kleineren MotorSpeed differenz?

hai1991
27.02.2009, 14:31
hallo

kann es sein, dass dieses problem mit der variablen geschwindigkeit nicht so einfach zu lösen ist?
denn bei SerRead() wartet der prozessor doch so lange, bis er ein zeichen bekommmt.
wenn du nun den asuro einschaltest und keine taste drückst bekommt natürlich SerRead() auch nichts, dh. der prozessor wartet. in dieser zeit kann er aber nicht gleichzeitig auch noch die linienverfolgung ausführen.
das wäre auch die erklärung, wieso diese alleine funktioniert hat und so nicht

Robotoby
27.02.2009, 19:42
hmm ja das ist klar. Doch der Roboter fährt sobald ich einer dieser abfragenden Tasten drücke, Jedoch liest er nicht die Sensoren aus, sondern dreht entweder das rechte Rad mit der gewünschten Geschwindigkeit oder das linke mit der Gesch. oder beide. Aber er wechselt nicht ab nach den werten die er mit den sensoren einliest:)
bin echt ratlos was das sein könnte.

Valen
27.02.2009, 20:19
Hast du schon dein program compiliert mit der neuen lib, oder redest du noch von deiner erste version? Oder die mit "b = geschw_einlesen();" drin?

Dieser letzte version konnte etwas mehr Serwrite als debug code brauchen. Die geschw_einlesen funktion liest deine kommando zeichen ein, und bearbeitet das. Aber das emphangene zeichen wird niemahls zuruck gesendet. Nur "ok1" usw. wenn das emphangene zeichen sinn gemacht hat (also, es war ein "a","b","c" oder "d"). Aber wie bist du zicher ob diesen richtigen zeichen uberhaupt korrekt reinkommen? Das ist wichtig beim debuggen. Da konnte immer kommunikations fehler sein. Sicher wenn du mit dem IR modul hinter her rutschen muss. Ich hoffe du setzt ihn mit dem radern hoch von deinem tisch, und dichselbts auf einer stuhl. ;)

hai1991
28.02.2009, 14:03
genau das wollte ich dir erklären.

in der endlosschleife (while(1)) rufst du erst die funktion geschw_einlesen() auf. dabei wartert der prozessor so lange, bis er einen buchstaben übermittelt bekommmt. vohrer kommt er in deinem code nicht weiter.
wenn er dann eine geschwindigkeit hat (ein buchstabe wurde empfangen), geht es weiter zum einlesen der liniensensoren und die geschwindigkeiten der motoren werden dem entsprechend gesetzt.
danach geht es in der endlosschleife wieder von vorne los. dh. der prozessor wartet auf einen buchstaben. solange du keinen ein gibst kommter der prozessor im code nicht weiter (er ist in der funktion geschw_einlesen() "gefangen").
erst wenn du wieder einen buchstaben eintippst werden wieder die liniensensoren eingelesen. daher wird auch nicht korrigiert!!

eine mögliche lösung wäre, dass du das empfangen eines buchstaben vor die endlosschleife schreibst. dann kannst du zwar nur am anfang eine geschwindigkeit festlegen, dafür funktioniert aber die linienverfolgung.

eine andere möglichkeit das zu realisieren fällt mir gerade nicht ein

Robotoby
28.02.2009, 15:02
hehe lustig bin gestern noch bis 12 uhr dran geklebt und bin genau auf diese lösung gekommen:) nun arbeite ich dran das ich trotzdem wieder au der while schleife komme um einen anderen buchstaben einzulesen. habe es mit brake versucht doch scheinbar kennt dieser compiler respektiv header diesen befehl nicht. oder doch? oder war es continue? ist schon lange her als wir c programme in der schule geschrieben haben:)

aber ich danke dir schon einmal für deine mitinteresse, echt cool diese forum

Valen
28.02.2009, 15:40
SerRead(input,1,0);

Die letzte parameter ist einer art time-out wert. Wenn es nicht-nul ist muss es schon weiter gehen nach einer beliebige anzahl nicht empfangene zeichen.

Aber das habe ich auch nur jetzt raus gefunden. :o Immer die asuro.c (von Arexx lib oder die erweiterten lib quellcode) durchsuchen und studieren!