Man könnte das Thema auch über eine Polygon-Funktion mit ganz vielen Vertices angehen. Ich habe mal etwas entwickelt:
Code:
#include "myasuro.h" /* #define MY_GO_CORRECTIVE_ACTION 3 */
#include "asuro.h"
void GoP (int distance,int speed)
{
uint32_t enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
// calculation tics/mm
enc_count=abs(distance)*10000L;
enc_count/=MY_GO_ENC_COUNT_VALUE;
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
if (distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);
while (tot_count<enc_count)
{
tot_count += encoder[RIGHT]; //im Original LEFT ehenkes
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0)
{ //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= MY_GO_CORRECTIVE_ACTION;
else r_speed += MY_GO_CORRECTIVE_ACTION;
}
if (diff < 0)
{ //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= MY_GO_CORRECTIVE_ACTION;
else l_speed += MY_GO_CORRECTIVE_ACTION;
}
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
}
}
void TurnP (int degree,int speed)
{
long enc_count;
enc_count=abs(degree)*MY_TURN_ENC_COUNT_VALUE;
enc_count /= 360L;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
if (degree<0) MotorDir(RWD,FWD);
else MotorDir(FWD,RWD);
while (tot_count<enc_count)
{
tot_count += encoder[LEFT];
diff = encoder[LEFT] - encoder[RIGHT];
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;
}
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
}
}
void RegularPolygon (int NumberVertices, int LengthSide, int speed, int direction)
{
int i;
for(i=0;i<NumberVertices;++i)
{
GoP (LengthSide,speed);
if (direction==RIGHT)
TurnP ( 360L/NumberVertices,speed);
else
TurnP (-360L/NumberVertices,speed);
}
MotorSpeed(0,0);
}
int main(void)
{
Init();
EncoderInit();
StatusLED (YELLOW);
RegularPolygon(6,150,175,LEFT);
StatusLED (GREEN);
while (1);
return 0;
}
Lesezeichen