scrawl
01.11.2009, 12:33
Da bin ich schon wieder, habe eine kurze Frage :arrow:
Bin gerade dabei, mit den Odometrie-Sensoren eine exakte Drehung auf der Stelle zu Programmieren: void Drehe(int grad)
Leider ist das ganze irgendwie ziemlich ungenau, bei Drehe(180); liegt die Fehlertoleranz schon so zwischen 20-30 Grad. Daher meine erste Frage: Kann ich das noch irgendwie optimieren? Habe schon probiert, die Helligkeitswechsel für beide Motoren zu berechnen, was aber auch nichts gebracht hat.
void Drehe(int grad)
{
// berechnen, welche Strecke jedes Rad fahren muss, um die Drehung zu erzeugen
// wir haben es mit einem Kreis mit dem Radius 1/2 RAD_ABSTAND zu tun
// die zu fahrende Strecke ist 1/2 des Umfangs
// Ergebnis in Millimeter
float benoetigte_strecke = (float) ((float) grad / (float) 360) * (M_PI * RAD_ABSTAND);
// berechnen, wieviele Helligkeitswechsel für die Strecke gebraucht werden
// Bei 42 Helligkeitswechseln gab es eine Umdrehung
float benoetigte_wechsel = (float) benoetigte_strecke * (float) ( (float) 42 / (float) RAD_UMFANG);
/*
** Laufvariablen
*/
// wieviele Hell/Dunkel Wechsel gab es (wird zur Berechnung der Strecke benötigt)
unsigned int wechsel = 0;
// vorheriger Wert hell oder dunkel? 0 = hell, 1 = dunkel
int helligkeit_alt = 0;
// momentaner Wert hell oder dunkel? 0 = hell, 1 = dunkel
int helligkeit;
/*
** Los fahren, solange bis die benötigte Drehzahl erreicht ist
*/
MotorDir(FWD, RWD);
Geschwindigkeit(120, 120);
unsigned int data[2];
while (wechsel < benoetigte_wechsel)
{
OdometrieData(data);
if (data[0] > 500)
helligkeit = 1;
else
helligkeit = 0;
if (helligkeit_alt != helligkeit)
wechsel += 1;
helligkeit_alt = helligkeit;
}
Geschwindigkeit(0, 0);
MotorDir(FWD, FWD);
}
Meine zweite Frage: Die Helligkeitswechsel, die für eine Radumdrehung gebraucht werden, hab ich nur durch ausprobieren rausgekriegt (42). Gibts da einen exakteren Wert bzw. kann ich den auch irgendwie ausrechnen?
Bin gerade dabei, mit den Odometrie-Sensoren eine exakte Drehung auf der Stelle zu Programmieren: void Drehe(int grad)
Leider ist das ganze irgendwie ziemlich ungenau, bei Drehe(180); liegt die Fehlertoleranz schon so zwischen 20-30 Grad. Daher meine erste Frage: Kann ich das noch irgendwie optimieren? Habe schon probiert, die Helligkeitswechsel für beide Motoren zu berechnen, was aber auch nichts gebracht hat.
void Drehe(int grad)
{
// berechnen, welche Strecke jedes Rad fahren muss, um die Drehung zu erzeugen
// wir haben es mit einem Kreis mit dem Radius 1/2 RAD_ABSTAND zu tun
// die zu fahrende Strecke ist 1/2 des Umfangs
// Ergebnis in Millimeter
float benoetigte_strecke = (float) ((float) grad / (float) 360) * (M_PI * RAD_ABSTAND);
// berechnen, wieviele Helligkeitswechsel für die Strecke gebraucht werden
// Bei 42 Helligkeitswechseln gab es eine Umdrehung
float benoetigte_wechsel = (float) benoetigte_strecke * (float) ( (float) 42 / (float) RAD_UMFANG);
/*
** Laufvariablen
*/
// wieviele Hell/Dunkel Wechsel gab es (wird zur Berechnung der Strecke benötigt)
unsigned int wechsel = 0;
// vorheriger Wert hell oder dunkel? 0 = hell, 1 = dunkel
int helligkeit_alt = 0;
// momentaner Wert hell oder dunkel? 0 = hell, 1 = dunkel
int helligkeit;
/*
** Los fahren, solange bis die benötigte Drehzahl erreicht ist
*/
MotorDir(FWD, RWD);
Geschwindigkeit(120, 120);
unsigned int data[2];
while (wechsel < benoetigte_wechsel)
{
OdometrieData(data);
if (data[0] > 500)
helligkeit = 1;
else
helligkeit = 0;
if (helligkeit_alt != helligkeit)
wechsel += 1;
helligkeit_alt = helligkeit;
}
Geschwindigkeit(0, 0);
MotorDir(FWD, FWD);
}
Meine zweite Frage: Die Helligkeitswechsel, die für eine Radumdrehung gebraucht werden, hab ich nur durch ausprobieren rausgekriegt (42). Gibts da einen exakteren Wert bzw. kann ich den auch irgendwie ausrechnen?