GoTurn () Winkel und Strecke
Hallo
ich habe die GoTurnfunktion ausprobiert und fand es schade, dass man entweder einen Winkel oder eine Strecke eingeben konnte, aber nicht beides zusammen. Deshalb versuche ich grade ein Quelltext zu schreiben, bei dem (erstmal mit anderen Bezeichnungen) dann beides in Abhängigkeit berechnet wird.
Ich hab dabei nur folgendes Problem ... ich will erstmal experimentel ermitteln, welchen Wert ich für X einsetzen muss, damit er genau grade einen Meter fährt.
Auf ähnliche weise will ich dann auch später die nötigen Verrechnungsfaktoren für die Winkel und den damit zusammenhängenden Speed ermitteln. Nun hab ich den Quellcode soweit geschreiben, allerdings fährt er, wenn X ca. 1-20 ist immer etwas schneller, wie ers soll, dann hört er auf und bleibt stehen, ich sehe aber über IR dass er die X weiter ausführt. Bei 90-100 macht er dann genau das selbe, mit den selben strecken wie am anfang und hört dann wieder auf.
Code:
#include "asuro.h"
int main(void)
{
Init();
int distance = 1000;
int degree = 0;
int x, c;
unsigned char speed = 200, speedd;
unsigned char speedl = speed;
unsigned char speedr = speed;
for (x=0;x<500;x++)
{
c = PollSwitch();
if (distance > 0)
{
MotorDir (FWD,FWD);
}
else
{
MotorDir (RWD,RWD);
}
if (degree == 0)
{
speedl = speed;
speedr = speed;
}
if (degree < 0)
{
speedd = degree / distance;
speedl = speed + speedd;
speedr = speed - speedd;
}
if (degree > 0)
{
speedd = degree / distance;
speedl = speed - speedd;
speedr = speed + speedd;
}
if (speedl > 255)
{
speedl = 255;
speedr = speedr - (speedl + 255);
}
if (speedr > 255)
{
speedl = speedl - (speedr + 255);
speedr = 255;
}
SerPrint ("\n\rX: ");
PrintInt (x);
SerPrint ("\n\rWinkel: ");
PrintInt (degree);
SerPrint ("\n\rWeg: ");
PrintInt (distance);
SerPrint ("\n\rGeschwindigkeit: ");
PrintInt (speed);
SerPrint ("\n\rGeschwindigkeit Rechts: ");
PrintInt (speedr);
SerPrint ("\n\rGeschwindigkeit Links: ");
PrintInt (speedl);
SerPrint ("\n");
Msleep (200);
MotorSpeed (speedl,speedr);
Msleep (distance * x / speed);
MotorSpeed (0,0);
Msleep (200);
if (c >= 0) {Msleep (1000);}
}
BackLED (ON,ON);
while (1);
return 0;
}