Hikh'var
27.11.2008, 12:00
Hallo,
ich habe für ein Schulprojekt ein Programm geschrieben, dass den Asuro eine Liniefolgen läßt und alle 200ms den Weg in 2 Arrays speichert. Eins für links eins für Rechts. Wenn diese Arrays voll sind hält der Asuro an und sendet die Werte paare zum Computer. Hier speicher ich sie in nem Textfile und lass dann mit einem Delphiprogramm die Linie nachzeichnen.
Leider sendet er nur nullen als Wegdifferenz beim Übertragen der Daten. Die Odometriesensoren laufen im Interuptbetrieb und funktionieren (wurde ausprobiert).
Nur in diesem Programm nicht. Aber hier mal der Code:
/* Linie folgen und aufzeichnen
* Programm fährt mittels helligkeitsdifferenz einer Linie nach
* und zeichnet diese mittels der Odometriesensoren auf
*/
#include "asuro.h"
void Linie(void);
int main(void)
{
int timevgl;
int i;
int k = 0;
int difr[200];
int difl[200];
int encoderalt[2];encoderalt[0] = 0;encoderalt[1] = 0;
int time = 0;
Init();
StatusLED(YELLOW);
EncoderInit();
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{
Linie(); //Linie folgen
timevgl = Gettime(); //Aktuelle Zeit holen
if (timevgl >= time + 200) //Wenn Zeitdifferenz größer 50ms -> speicher Wegdifferenz
{
MotorDir(FREE,FREE);
difl[k] = encoder[0] - encoderalt[0]; //Wegdifferenz
difr[k] = encoder[1] - encoderalt[1];
// PrintInt(difl[k]);SerPrint(" ");PrintInt(difr[k]);SerPrint(" ");PrintInt(k);SerPrint("\r\n");
encoderalt[0] = encoder[0];
encoderalt[1] = encoder[1];
k++; //Speicherzähler
time = timevgl;
}
if (k == 200) //Speicher voll
{
MotorDir(FREE,FREE); //Anhalten und an den Rechner übertragen
for(i=0; i<=199; i++)
{
PrintInt(difl[i]);SerPrint(" ");PrintInt(difr[i]);SerPrint(" ");PrintInt(i);SerPrint("\r\n");
}
k = 0;
}
}
return 0;
}
void Linie(void)
{
int lineData[2];
LineData(lineData);
if (lineData[0] > lineData[1]) //links ist heller -> Asuro fährt nach rechts
{
MotorDir(FWD,FREE);
MotorSpeed(135,65);
}
else if (lineData[0] < lineData[1]) //rechts ist heller -> Asuro fährt nach links
{
MotorDir(FREE, FWD);
MotorSpeed(65,135);
}
}
mfg Hikh
ich habe für ein Schulprojekt ein Programm geschrieben, dass den Asuro eine Liniefolgen läßt und alle 200ms den Weg in 2 Arrays speichert. Eins für links eins für Rechts. Wenn diese Arrays voll sind hält der Asuro an und sendet die Werte paare zum Computer. Hier speicher ich sie in nem Textfile und lass dann mit einem Delphiprogramm die Linie nachzeichnen.
Leider sendet er nur nullen als Wegdifferenz beim Übertragen der Daten. Die Odometriesensoren laufen im Interuptbetrieb und funktionieren (wurde ausprobiert).
Nur in diesem Programm nicht. Aber hier mal der Code:
/* Linie folgen und aufzeichnen
* Programm fährt mittels helligkeitsdifferenz einer Linie nach
* und zeichnet diese mittels der Odometriesensoren auf
*/
#include "asuro.h"
void Linie(void);
int main(void)
{
int timevgl;
int i;
int k = 0;
int difr[200];
int difl[200];
int encoderalt[2];encoderalt[0] = 0;encoderalt[1] = 0;
int time = 0;
Init();
StatusLED(YELLOW);
EncoderInit();
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{
Linie(); //Linie folgen
timevgl = Gettime(); //Aktuelle Zeit holen
if (timevgl >= time + 200) //Wenn Zeitdifferenz größer 50ms -> speicher Wegdifferenz
{
MotorDir(FREE,FREE);
difl[k] = encoder[0] - encoderalt[0]; //Wegdifferenz
difr[k] = encoder[1] - encoderalt[1];
// PrintInt(difl[k]);SerPrint(" ");PrintInt(difr[k]);SerPrint(" ");PrintInt(k);SerPrint("\r\n");
encoderalt[0] = encoder[0];
encoderalt[1] = encoder[1];
k++; //Speicherzähler
time = timevgl;
}
if (k == 200) //Speicher voll
{
MotorDir(FREE,FREE); //Anhalten und an den Rechner übertragen
for(i=0; i<=199; i++)
{
PrintInt(difl[i]);SerPrint(" ");PrintInt(difr[i]);SerPrint(" ");PrintInt(i);SerPrint("\r\n");
}
k = 0;
}
}
return 0;
}
void Linie(void)
{
int lineData[2];
LineData(lineData);
if (lineData[0] > lineData[1]) //links ist heller -> Asuro fährt nach rechts
{
MotorDir(FWD,FREE);
MotorSpeed(135,65);
}
else if (lineData[0] < lineData[1]) //rechts ist heller -> Asuro fährt nach links
{
MotorDir(FREE, FWD);
MotorSpeed(65,135);
}
}
mfg Hikh