Hier mal ein kleines Video meines Asuros: http://www.zippyvideos.com/5870203996486466/video3/
Die main-Funktion ist nicht besonders interessant, da nur eine Aneinanderreihung von Go und Turn...
Und hier poste ich mal die modifizierten Go und Turn Funktionen der asuro.c. Im Großen und Ganzen entsprechen diese den originalen aus der erweiterten Asuro-Lib auf Sourceforge. Aber vor allem bei der Turn habe ich einiges an den Parametern geändert (mit Abbremsfunktion). Ansonsten habe ich meist noch die Variablentypen und die Reihenfolge angepasst.
Code:
void Go(int distance, unsigned char speed)
{
unsigned int enc_count = abs(distance);
unsigned int tot_count = 0;
signed char diff = 0;
unsigned char l_speed = speed, r_speed = speed;
// mm -> ticks
enc_count /= 2; // only for 12 fields gearwheel
// set direction
if(distance < 0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);
// reset encoder
Encoder_Set(0,0);
// set speed
MotorSpeed(l_speed,r_speed);
// do until destination reached
while(tot_count < enc_count)
{
tot_count += encoder[LEFT];
// calculate speed difference
diff = encoder[LEFT] - encoder[RIGHT];
// reset encoder
Encoder_Set(0,0);
if (diff > 0) //Left faster than right
{
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) //Right faster than left
{
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
// set new speeds
MotorSpeed(l_speed,r_speed);
Sleep(36);
}
// Stop
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
Msleep(200);
}
void Turn(int degree, unsigned char speed)
{
unsigned int enc_count;
unsigned int tot_count = 0;
int diff = 0;
unsigned char l_speed = speed, r_speed = speed;
// degree -> tick
enc_count = (unsigned int) (((long)abs(degree) * (long)4080) / (long)10000);
// set direction
if(degree < 0) MotorDir(RWD,FWD);
else MotorDir(FWD,RWD);
// reset encoder
Encoder_Set(0,0);
// set speed
MotorSpeed(l_speed,r_speed);
// do until angel reached
while(tot_count < enc_count)
{
tot_count += encoder[LEFT];
// calculate speed difference
diff = encoder[LEFT] - encoder[RIGHT];
// reset encoder
Encoder_Set(0,0);
// calculate new speed
if (diff > 0) //Left faster than right
{
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) //Right faster than left
{
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
// set new speed, with slow down
MotorSpeed(l_speed - (unsigned char) ((unsigned int)(l_speed) / enc_count),r_speed - (unsigned char) ((unsigned int)(r_speed) / enc_count));
Sleep(36);
}
// stop
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
Msleep(200);
}
Ist zwar noch immer nicht ganz 100%, aber das liegt wohl an der Ungenauigkeit der Odometrie. Ich werde versuchen es noch etwas zu verbessern; mal schauen, was ich noch erreichen kann.
Lesezeichen