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; }







Zitieren
Lesezeichen