PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe bei Linien Verfolgungsprogramm



C-H-T
08.03.2009, 21:11
Hallo,
bin ein wenig am verzweifeln, tüftle seit einigen Stunden an dem Programm.. hab hin und her probiert aber irgendwie mag Asuro nicht das machen was ich will.

Folgendes Problem: habe die LineDemo.c bissel abgeändert da diese bei mir absolut nicht funktioniert hatte (meine nicht compilieren oder so sondern rein Praxisbezogen)
den grund code kennt bestimmt jeder.. ledenfalls hab ich den so modifiziert das auch das andere rad noch langsamer wird und der somit auch engere kurven schafft.. 45° erwarte ich einfach!

so in der drehe hat das auch alles funktioniert dann sind die batterien wohl schwach gewurden und klappte nicht mehr.. neue rein und natürlich waren die werte viel zu hoch.. (die werte im quelltext sind schon für neue batterien angepasst)
und entweder isser zu schnell und eiert rum und fliegt in der kurve raus oder der is zu langsam und schafft die kurve nicht.. deswegen auch das andere rad langsamer um den "wendekreis" zu verkleinern.. damit wurde es ein wenig besser..

Hat da jemand einen Vorschlag.. vllt seh ich ja den Wald vor lauter Bäumen nicht.. ledenfalls komm ich nicht drauf damit der endlich mal schön fährt.. denn im moment funktioniert LineData(data);
if (data [0] > data [1] )

besser als das komplexere programm.. aber dieses hin und her.. da würd einem beim zuschauen schon schlecht ^^

ps: der asuro folgt schwarzen pvc klebeband auf weißem papier (viel papier ^^) werte sind soweit ok, sensoren haben einen mittelwert von 4-8 auf dem klebeband (zimmerlicht aus und an) und papier zwischen 30-70

mfg



#include "asuro.h"

#define SPEED_L 100
#define SPEED_R 106

unsigned int lineData[2];
unsigned int speedLeft, speedRight;
int ADOffset;

void LineRight (void)
{
speedLeft += 1; /* links mehr Gas geben */
speedRight -= 1; /*rechts weniger Gas geben */
if (speedLeft > 140) speedLeft = 141;
if (speedRight < 65) speedRight = 66;
}

void LineLeft (void)
{
speedRight += 1; /* rechts mehr Gas geben */
speedLeft -= 1; /* links weniger Gas geben */
if (speedRight > 146) speedRight = 147;
if (speedLeft < 59) speedLeft = 60;
}

void Msleep (int dauer)
{
int z;
for (z = 0; z < dauer; z++)
Sleep (36);
}

int main(void)
{
int i;
unsigned int j;

/*START*/
Init();
FrontLED(ON);
MotorDir(FWD,FWD);
StatusLED(YELLOW);
SerPrint("ASURO Bereit!.. ");
/*WARTEN*/
while(PollSwitch() <= 1){ }
Msleep(800); //0,8 sekunden warten

/*Kalibrierung*/
for (j = 0; j < 255; j++) LineData(lineData); //warten bis werte stabil sind
LineData(lineData); // liniensensor daten einlesen
ADOffset = lineData[LEFT] - lineData[RIGHT]; //differenz der beiden dioden speichern
StatusLED(GREEN);
SerPrint("Kalibrierung abgeschlossen.. ");

while(PollSwitch() <= 1){ }
SerPrint("Fahre los.. ");
speedLeft = SPEED_L;
speedRight = SPEED_R;

while(1)
{
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset;
if ( i > 4) /* links mehr Gas geben */
{
BackLED(ON,OFF);
LineRight(); /* linie rechts */

}
else if ( i < -4) /* rechts mehr Gas geben */
{
BackLED(OFF,ON);
LineLeft(); /* linie links */
}
else /* geradeaus */
{
BackLED(ON,ON);
speedLeft = SPEED_L;
speedRight = SPEED_R;
}
MotorSpeed(speedLeft,speedRight);
}

StatusLED(RED);
BackLED(OFF,OFF);
MotorSpeed(0,0);
while(1);
return 0;
}




ich lasse die 2 motoren unterschiedlich schnell fahren da mein linker ein klein wenig schneller ist als der rechte somit gleich ich das aus damit der gerade fährt

hai1991
09.03.2009, 17:26
hallo C-H-T

ich habe meine linienverfolgung mal so gelöst:



werte einlesen

if(links heller als rechts)
MotorSpeed(maxSpeed,0); //links antreiben
else
MotorSpeed(0,maxSpeed); //rechts antreiben


auf diese art ist er zwar nicht ganz so schnell, aber er schafft relativ kleine radien

C-H-T
09.03.2009, 20:40
jo so hatte ich das auch ganz am anfang, das funktioniert auch ganz ok, allerdings fährt er da nur im Zick zack und niemals geradeaus.. links rechts links rechts usw und möchte das er lieber kurven fährt.
hab deins trotzdem mal geflashed ^^ da geht der asuro ja ab wie vom teufel gejagt.. und der schafft da bei dir eine kurve? der ist bei mir so schnell gefahren das er glatt übers klebeband geschossen ist und garnicht so schnell reagieren konnte irgendwo hin zu lenken

naja ich werd mal von grund auf alles selber machen.. finde 2 bis 3 abfragen sind zu wenig zum gut fahren..

mfg

hai1991
10.03.2009, 15:10
hallo

da musst eben mit maxSpeed anpassen, aber er schafft doch erstaunlich kleine radien.