C-H-T
08.03.2009, 22: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
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