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.
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?Code: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);
}