Hi,
ich habe ein Programm für Asuro geschrieben, das die Unterschiede der Drehgeschwindigkeiten der beiden Motoren rausfinden und ausgleichen soll. Beim Ausprobieren fährt Asuro nach der Kalibrierung aber nur im Kreis und ich komme nicht drauf, woran das liegen könnte :/
Das ist mein Code:
Die Odometriesensoren funktionieren beide, habe sie mit dem SelfTest getestet.Code:#include "asuro.h" int main(void) { unsigned int wheel_factor; Init(); wheel_factor = CalibrateWheels(); MotorSpeed(120, 120 * wheel_factor); while(1); return 0; } float CalibrateWheels(void) { Write("Start calibration"); // counter unsigned int i; // odometry data unsigned int data[2]; // rotation count of the wheels unsigned int count_left = 0; unsigned int count_right = 0; // contains the last brightness state for the wheels unsigned int last_state[2]; OdometrieData(data); last_state[2] = is_bright(data[0]), is_bright(data[1]); // the relation between the left amd the right wheel's rotation count float relation; // start driving MotorDir(FWD, FWD); MotorSpeed(120, 120); // 5 seconds for (i = 0; i < 100; i++) { OdometrieData(data); // if a wheel's brightness changed, increase the counter if (is_bright(data[0]) != last_state[0]) { count_left++; } if (is_bright(data[1]) != last_state[1]) { count_right++; } last_state[2] = is_bright(data[0]), is_bright(data[1]); TimeSleep(50); } relation = count_right / count_left; // done testing, stop wheels MotorSpeed(0, 0); Write("Finished calibration"); return relation; } unsigned int is_bright(unsigned int darkness) { if (darkness > 512) { return 0; } else { return 1; } } void Write(char msg) { // Send a string via IR without having to think about the length of the string SerWrite(msg, strlen(msg)); } void TimeSleep(unsigned int time) { // Sleep for ``time`` miliseconds unsigned int i; for (i = 0; i < time; i++) { Sleep(72); } }
Weiß jemand, woran das liegen könnte?
BeeWee[fade:e7bfbc102e][/fade:e7bfbc102e]







Zitieren
Wenn das rechte Rad schwergängiger wäre, würden beim Kalibrieren weniger Impulse gezählt und der Faktor deshalb größer 1 sein. Das wiederrum könnte bei MotorSpeed(255,255) kritisch werden, weil die Parameter 8Bit-Werte sind und deshalb die errechnete Power modulo 256 ist. Auch wieder Quatsch, weil weniger rechte als linke Impulse den Faktor kleiner machen:


Lesezeichen