@Sternthaler: jetzt hast Du mich verwirrt. Ich habe doch nirgends POWER > 255 verwendet.

Welchen Wertebereich hat int? Ist das ein 8bit oder 16bit int.

Nehmen wir zum Verständnis ein konkretes Beispiel: Go(500,150);

#define MY_GO_ENC_COUNT_VALUE 19363L (findet sich in myasuro.h)

enc_count = abs(distance)*10000L; // enc_count = 500 * 10000 ==> 5000000

Diese 5 Mio. passen ja nicht in ein int, daher nimmt man ja wohl diesen Typ uint32_t.

enc_count /= MY_GO_ENC_COUNT_VALUE; // enc_count = 5000000 / 19363 ==> 258



Das ist die zu erreichende Zielmarke an Zählern über die Odometrie. Es wird nun solange vorwärts gefahren bis diese Zielzahl erreicht ist.

while (tot_count<enc_count){...}

Stimmt hier alles? tot_count ist doch int, 8bit oder 16bit? Wie wird hier umgewandelt für den Vergleich?

Dabei wird das linke Rad zum Zählen verwendet. Hier könnte man doch auch das rechte nehmen? Geht bei mir minimal besser, aber ebenfalls abschwenken nach links, bis das linke Rad überhaupt nicht mehr dreht.

tot_count += encoder[LEFT];

Zum Vergleich werden die Zähler rechts und links verglichen.

diff = encoder[LEFT] - encoder[RIGHT];

Nehmen wir an, links sind mehr Zähler als rechts, diff also positiv, dann wird je nach Geschwindigkeit entweder links um 10 Power-Einheiten reduziert oder rechts um 10 Power-Einheiten erhöht.

if ( (l_speed > speed) || (r_speed > 244) )
{
l_speed -= 10;
}
else
{
r_speed += 10;
}

Ein transparentes Verfahren, das analog in Turn(...) eingesetzt wird. Voraussetzung für das Gelingen ist, dass die Odometrie verlässliche Daten liefert und die gesamte Antriebselektrik und -mechanik funktioniert. Über die Konstanten in myasuro.h kann man sein individuelles Exemplar softwareseitig so kalibrieren, dass die gefahrerene Distanz und der gedrehte Winkel möglichst genau passen.

Wie kann ich die Odometrie testen, ob Diode/Fototransistor auf beiden Seiten überhaupt richtig arbeiten?