Marit
18.12.2006, 14:11
Hi,
ich hab ein Programm geschrieben welches eine Linie finden und einfangen soll, aber der Roboter fährt nur grade aus, anstatt sich zu drehen und dann stehen zu bleiben auf der Linie. Erst soll ein Phototransistor ausgelesen werden, wenn er über einer schwarzen linie ist, und ab dann die zeit, bis der nächste über einer schwarzen ist per gettime() befehl. Dann soll später der Winkel ausgerechnet werden den der Roboter sich drehen soll per Turn() befehl.
Zur winkelberechnung hab ich erst den Tangens berechnet und den später umgewandelt per atan() befehl, welcher aus der math.h kommt (M_PIl kommt auch daher und ist die Zahl Pi). Für den Tangens hab ich hab ich aber Geschwindigkeit und Zeit benötigt um die Strecke auszurechnen die der Asuro fährt bis der zweite Phototransistor auf der schwarzen Linie ist. Zeit wurde schon vorher ausgerechnet und die Geschwindigkeit ist nur sehr ungefähr ausgerechnet.
Die Geschwindigkeit wird ja in den Werten von 0-255 angegeben. Ein Freund hat mal eine ungefähre Rechnung aufgestellt über Durchschnittswerte etc. und is zum Ergebnis Geschwindigkeit/818 gekommen. Dann hat man aus den 0-255 Werten einen Geschwindigkeitswert in m/s.
Jetzt kann man theoretisch über die Strecke a (Abstand zwischen Phototransistor 1 und 2) durch Strecke b (ausgerechnet über Geschwindigkeit mal Zeit) den Tangens ausrechnen: tan=a/(v*time)
Irgendwie fährt mein Roboter aber nur grade aus. Kann mir jemand helfen?
Hoffe das war jetz gut genug erklärt. Schaut einfach ma in den Code oder fragt nochma falls es Probleme geben sollte ;) .
#include "asuro.h"
#include "math.h" //dient der späteren Tangensumrechnung
int main(void)
{
double const a=1.5; // Abstand der beiden Phototransistoren: 1,5cm
double time;
double tan;
double time1;
double time2;
double v;
int arc;
int x;
double arc2;
unsigned int data[2];
unsigned char tmp[2] = {OFF,OFF};
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120); // Geschwindigkeitsberechnung. 120/818 ist ein
v = 120/818; //ungefairer! Geschwindigkeitswert in meter pro sekunde.
LineData(data);
if (data[0] > 400) { //Überprüfung welcher Phototransistor an ist.
tmp[0] = ON;
time1 = Gettime(); } //Erste Zeit
if (data[1] > 400) {
tmp[1] = ON;
time1 = Gettime(); }
while(tmp[0]==ON)
{
if (data[1] > 400) //Überprüfung bis zweite Phototransistor an ist.
tmp[1] = ON;
if(tmp[1]==ON)
{
time2 = Gettime(); //Zweite Zeit
time = (time2 - time1)/1000; //Zeitabstand in sekunden
tan=a/(v*time); //Tangensberechnung über a(1.5)/b(v*time)
arc2 = atan(tan) * 180 / M_PIl; //Tangensumrechnung in Winkel
arc = (int)arc2; //double Wert wird in int Wert geändert
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Turn (arc, v); //Drehung
tmp[1] = OFF; //Reset der Phototransistoren auf 0
tmp[0] = OFF;
}
}
while(tmp[1]==ON)
{
time1 = Gettime();
if (data[0] > 400)
tmp[0] = ON;
else{}
if(tmp[0]==ON)
{
time2 = Gettime();
time = (time2 - time1)/1000;
tmp[1]==OFF;
tan=a/(v*time);
arc2 = atan(tan) * 180 / M_PIl;
arc = (int)arc2;
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Turn (arc, v);
tmp[1] = OFF;
tmp[0] = OFF;
}
}
}
return 0;
}
ich hab ein Programm geschrieben welches eine Linie finden und einfangen soll, aber der Roboter fährt nur grade aus, anstatt sich zu drehen und dann stehen zu bleiben auf der Linie. Erst soll ein Phototransistor ausgelesen werden, wenn er über einer schwarzen linie ist, und ab dann die zeit, bis der nächste über einer schwarzen ist per gettime() befehl. Dann soll später der Winkel ausgerechnet werden den der Roboter sich drehen soll per Turn() befehl.
Zur winkelberechnung hab ich erst den Tangens berechnet und den später umgewandelt per atan() befehl, welcher aus der math.h kommt (M_PIl kommt auch daher und ist die Zahl Pi). Für den Tangens hab ich hab ich aber Geschwindigkeit und Zeit benötigt um die Strecke auszurechnen die der Asuro fährt bis der zweite Phototransistor auf der schwarzen Linie ist. Zeit wurde schon vorher ausgerechnet und die Geschwindigkeit ist nur sehr ungefähr ausgerechnet.
Die Geschwindigkeit wird ja in den Werten von 0-255 angegeben. Ein Freund hat mal eine ungefähre Rechnung aufgestellt über Durchschnittswerte etc. und is zum Ergebnis Geschwindigkeit/818 gekommen. Dann hat man aus den 0-255 Werten einen Geschwindigkeitswert in m/s.
Jetzt kann man theoretisch über die Strecke a (Abstand zwischen Phototransistor 1 und 2) durch Strecke b (ausgerechnet über Geschwindigkeit mal Zeit) den Tangens ausrechnen: tan=a/(v*time)
Irgendwie fährt mein Roboter aber nur grade aus. Kann mir jemand helfen?
Hoffe das war jetz gut genug erklärt. Schaut einfach ma in den Code oder fragt nochma falls es Probleme geben sollte ;) .
#include "asuro.h"
#include "math.h" //dient der späteren Tangensumrechnung
int main(void)
{
double const a=1.5; // Abstand der beiden Phototransistoren: 1,5cm
double time;
double tan;
double time1;
double time2;
double v;
int arc;
int x;
double arc2;
unsigned int data[2];
unsigned char tmp[2] = {OFF,OFF};
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120); // Geschwindigkeitsberechnung. 120/818 ist ein
v = 120/818; //ungefairer! Geschwindigkeitswert in meter pro sekunde.
LineData(data);
if (data[0] > 400) { //Überprüfung welcher Phototransistor an ist.
tmp[0] = ON;
time1 = Gettime(); } //Erste Zeit
if (data[1] > 400) {
tmp[1] = ON;
time1 = Gettime(); }
while(tmp[0]==ON)
{
if (data[1] > 400) //Überprüfung bis zweite Phototransistor an ist.
tmp[1] = ON;
if(tmp[1]==ON)
{
time2 = Gettime(); //Zweite Zeit
time = (time2 - time1)/1000; //Zeitabstand in sekunden
tan=a/(v*time); //Tangensberechnung über a(1.5)/b(v*time)
arc2 = atan(tan) * 180 / M_PIl; //Tangensumrechnung in Winkel
arc = (int)arc2; //double Wert wird in int Wert geändert
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Turn (arc, v); //Drehung
tmp[1] = OFF; //Reset der Phototransistoren auf 0
tmp[0] = OFF;
}
}
while(tmp[1]==ON)
{
time1 = Gettime();
if (data[0] > 400)
tmp[0] = ON;
else{}
if(tmp[0]==ON)
{
time2 = Gettime();
time = (time2 - time1)/1000;
tmp[1]==OFF;
tan=a/(v*time);
arc2 = atan(tan) * 180 / M_PIl;
arc = (int)arc2;
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Turn (arc, v);
tmp[1] = OFF;
tmp[0] = OFF;
}
}
}
return 0;
}