Welcome to Dream.In.Code
Getting C++ Help is Easy!

Join 136,155 C++ Programmers for FREE! Get instant access to thousands of C++ experts, tutorials, code snippets, and more! There are 2,115 people online right now. Registration is fast and FREE... Join Now!




Problems with Programming a Hexapod

 
Reply to this topicStart new topic

Problems with Programming a Hexapod

Tendou
6 Dec, 2007 - 06:13 PM
Post #1

New D.I.C Head
*

Joined: 6 Dec, 2007
Posts: 1


My Contributions
CODE
extern unsigned char ByteMotorPos[24];
extern bit TimerExpired;
void SetTimer(unsigned int milliseconds);
unsigned int ReadSensors(void);
int t = 1000;
//int choice;
int start=0;

enum MotorNumbers {
   LEFT_FRONT_SHOULDER = 0,
   LEFT_FRONT_UPPERLEG,
   LEFT_FRONT_LOWERLEG,
   LEFT_MIDDLE_SHOULDER,
   LEFT_MIDDLE_UPPERLEG,
   LEFT_MIDDLE_LOWERLEG,
   LEFT_BACK_SHOULDER,
   LEFT_BACK_UPPERLEG,
   LEFT_BACK_LOWERLEG,
   RIGHT_FRONT_SHOULDER,
   RIGHT_FRONT_UPPERLEG,
   RIGHT_FRONT_LOWERLEG,
   RIGHT_MIDDLE_SHOULDER,
   RIGHT_MIDDLE_UPPERLEG,
   RIGHT_MIDDLE_LOWERLEG,
   RIGHT_BACK_SHOULDER,
   RIGHT_BACK_UPPERLEG,
   RIGHT_BACK_LOWERLEG
};

#define SHOULDER_FORWARD    60
#define SHOULDER_ZERO       0
#define SHOULDER_BACKWARD  -90

#define UPPERLEG_UP   120         //100 //130 R mid high up
#define UPPERLEG_DOWN 45       //85

#define LOWERLEG_UP    -30      //-10
#define LOWERLEG_DOWN  -70   //-20

#define MOTOR_SETTINGS(i,zero,dir) MotorZero[i] = zero; MotorDir[i] = (dir>0) ? 1 : -1;
#define SET_MOTOR_POS(i,pos) ByteMotorPos[i] = ((unsigned char)pos)*MotorDir[i] + MotorZero[i];
#define CHECK_SENSOR(i,sensors) (((sensors)>>(16-(i)))&0x01)

unsigned char MotorZero[24] = {128, 128, 128, 128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128};

char          MotorDir[24]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

unsigned char LeftStroke = 40, RightStroke = 38;      //35, 35

void
MotorsPosition()
{
MOTOR_SETTINGS(LEFT_FRONT_SHOULDER,130,1);   //110 centre,150
MOTOR_SETTINGS(LEFT_FRONT_UPPERLEG,140,1);
MOTOR_SETTINGS(LEFT_FRONT_LOWERLEG,93,1);
MOTOR_SETTINGS(LEFT_MIDDLE_SHOULDER,112,1);
MOTOR_SETTINGS(LEFT_MIDDLE_UPPERLEG,89,1);
MOTOR_SETTINGS(LEFT_MIDDLE_LOWERLEG,94,1);
MOTOR_SETTINGS(LEFT_BACK_SHOULDER,98,1);   //150
MOTOR_SETTINGS(LEFT_BACK_UPPERLEG,143,1);
MOTOR_SETTINGS(LEFT_BACK_LOWERLEG,97,1);
MOTOR_SETTINGS(RIGHT_FRONT_SHOULDER,120,-1);   //140 centre
MOTOR_SETTINGS(RIGHT_FRONT_UPPERLEG,124,1);
MOTOR_SETTINGS(RIGHT_FRONT_LOWERLEG,100,1);
MOTOR_SETTINGS(RIGHT_MIDDLE_SHOULDER,113,-1);
MOTOR_SETTINGS(RIGHT_MIDDLE_UPPERLEG,117,1);
MOTOR_SETTINGS(RIGHT_MIDDLE_LOWERLEG,155,1);
MOTOR_SETTINGS(RIGHT_BACK_SHOULDER,85,-1);
MOTOR_SETTINGS(RIGHT_BACK_UPPERLEG,59,1);
MOTOR_SETTINGS(RIGHT_BACK_LOWERLEG,105,1);
}

void
ConfigMotors()
{
MOTOR_SETTINGS(LEFT_FRONT_SHOULDER,130,1);  //110 centre,150
MOTOR_SETTINGS(LEFT_FRONT_UPPERLEG,95,1);
MOTOR_SETTINGS(LEFT_FRONT_LOWERLEG,185,1);
MOTOR_SETTINGS(LEFT_MIDDLE_SHOULDER,125,1);
MOTOR_SETTINGS(LEFT_MIDDLE_UPPERLEG,45,1);
MOTOR_SETTINGS(LEFT_MIDDLE_LOWERLEG,190,1);
MOTOR_SETTINGS(LEFT_BACK_SHOULDER,130,1);   //150
MOTOR_SETTINGS(LEFT_BACK_UPPERLEG,110,1);
MOTOR_SETTINGS(LEFT_BACK_LOWERLEG,190,1);
MOTOR_SETTINGS(RIGHT_FRONT_SHOULDER,125,-1);  //140 centre
MOTOR_SETTINGS(RIGHT_FRONT_UPPERLEG,90,1);
MOTOR_SETTINGS(RIGHT_FRONT_LOWERLEG,200,1);
MOTOR_SETTINGS(RIGHT_MIDDLE_SHOULDER,113,-1);
MOTOR_SETTINGS(RIGHT_MIDDLE_UPPERLEG,110,1);
MOTOR_SETTINGS(RIGHT_MIDDLE_LOWERLEG,190,1);
MOTOR_SETTINGS(RIGHT_BACK_SHOULDER,60,-1);
MOTOR_SETTINGS(RIGHT_BACK_UPPERLEG,30,1);
MOTOR_SETTINGS(RIGHT_BACK_LOWERLEG,185,1);
}

void
SetHips(char leftstroke, char rightstroke)
{
// shoulders in walking beam pattern
SET_MOTOR_POS(LEFT_BACK_SHOULDER,leftstroke);
SET_MOTOR_POS(LEFT_FRONT_SHOULDER,leftstroke);
SET_MOTOR_POS(LEFT_MIDDLE_SHOULDER,-leftstroke);
SET_MOTOR_POS(RIGHT_BACK_SHOULDER,-rightstroke);  SET_MOTOR_POS(RIGHT_FRONT_SHOULDER,-rightstroke);  SET_MOTOR_POS(RIGHT_MIDDLE_SHOULDER,rightstroke);
}

void
SetLegs(char upperleg1, char upperleg2,
       char lowerleg1, char lowerleg2)
{
// upper legs
SET_MOTOR_POS(LEFT_BACK_UPPERLEG,upperleg1);
SET_MOTOR_POS(LEFT_FRONT_UPPERLEG,upperleg1);
SET_MOTOR_POS(RIGHT_MIDDLE_UPPERLEG,upperleg1);
SET_MOTOR_POS(RIGHT_BACK_UPPERLEG,upperleg2);
SET_MOTOR_POS(RIGHT_FRONT_UPPERLEG,upperleg2);
SET_MOTOR_POS(LEFT_MIDDLE_UPPERLEG,upperleg2);

// lower legs
SET_MOTOR_POS(LEFT_BACK_LOWERLEG,lowerleg1);
SET_MOTOR_POS(LEFT_FRONT_LOWERLEG,lowerleg1);
SET_MOTOR_POS(RIGHT_MIDDLE_LOWERLEG,lowerleg1);
SET_MOTOR_POS(RIGHT_BACK_LOWERLEG,lowerleg2);
SET_MOTOR_POS(RIGHT_FRONT_LOWERLEG,lowerleg2);
SET_MOTOR_POS(LEFT_MIDDLE_LOWERLEG,lowerleg2);
}

void
Walk(void)
{
  static unsigned char state = 0;
  if (TimerExpired)
  {
   switch (state)
   {
    case 0: // group 2 forward, in air, stroke
     SetHips(LeftStroke, RightStroke);
     SetLegs(UPPERLEG_DOWN,UPPERLEG_UP,LOWERLEG_DOWN,LOWERLEG_UP);
     SetTimer(t);    //50 //100
     break;

    case 1: // group 2 down stroke, don't change forward backward positions
     SetLegs(UPPERLEG_UP,UPPERLEG_DOWN,LOWERLEG_UP,LOWERLEG_DOWN);
     SetTimer(t);    //100 //120
     break;

    case 2: // group 1 forward, in air, stroke
     SetHips(-LeftStroke, -RightStroke);
     SetLegs(UPPERLEG_UP,UPPERLEG_DOWN,LOWERLEG_UP,LOWERLEG_DOWN);
     SetTimer(t);    //100//120
     break;

    case 3: // group 1 down stroke
     SetLegs(UPPERLEG_DOWN,UPPERLEG_UP,LOWERLEG_DOWN,LOWERLEG_UP);
     SetTimer(t);    //100//120
     break;
    }
    state = (state+1)%4;
  }
}

void MoveToZeros() {
     SET_MOTOR_POS(LEFT_FRONT_SHOULDER,0);
     SET_MOTOR_POS(LEFT_FRONT_UPPERLEG,0);
     SET_MOTOR_POS(LEFT_FRONT_LOWERLEG,0);
     SET_MOTOR_POS(LEFT_MIDDLE_SHOULDER,0);
     SET_MOTOR_POS(LEFT_MIDDLE_UPPERLEG,0);
     SET_MOTOR_POS(LEFT_MIDDLE_LOWERLEG,0);
     SET_MOTOR_POS(LEFT_BACK_SHOULDER,0);
     SET_MOTOR_POS(LEFT_BACK_UPPERLEG,0);
     SET_MOTOR_POS(LEFT_BACK_LOWERLEG,0);
     SET_MOTOR_POS(RIGHT_FRONT_SHOULDER,0);
     SET_MOTOR_POS(RIGHT_FRONT_UPPERLEG,0);
     SET_MOTOR_POS(RIGHT_FRONT_LOWERLEG,0);
     SET_MOTOR_POS(RIGHT_MIDDLE_SHOULDER,0);
     SET_MOTOR_POS(RIGHT_MIDDLE_UPPERLEG,0);
     SET_MOTOR_POS(RIGHT_MIDDLE_LOWERLEG,0);
     SET_MOTOR_POS(RIGHT_BACK_SHOULDER,0);
     SET_MOTOR_POS(RIGHT_BACK_UPPERLEG,0);
     SET_MOTOR_POS(RIGHT_BACK_LOWERLEG,0);
}


void
main_racoon(void)
{
unsigned int sensors;
#define SENSOR(i) !(CHECK_SENSOR(i,sensors))


ConfigMotors();

    while(1)
    {
     //if(SENSOR(10))
     //        start=1;
     sensors = ReadSensors();

     if(SENSOR(10))
           start=1;
       if(start)
      {        
          Walk();
          //MoveToZeros();


     if (SENSOR(7)||SENSOR(8))

     { t= 70;
          }
     else { t=100;
          }
     if (SENSOR(1)||SENSOR(2)||SENSOR(3))
     {
      LeftStroke =70;
          RightStroke = 38;
     }

     else if (SENSOR(4)||SENSOR(5)||SENSOR(6))
     {
          LeftStroke = 40;
          RightStroke = 18;
     }

     else
     {
          LeftStroke = 40;
          RightStroke = 38;
     }

     if (SENSOR(3)&&SENSOR(4)&&SENSOR(7) && SENSOR(8))
     {    LeftStroke = 10;
        RightStroke = 38;
     }
     else
     {
        LeftStroke = 40;
        RightStroke = 30;
     }
}
}

}
This is my incompleted program for the hexapod robot. i am not too sure on how to make my robot to walk in a straight line with the sensor from the front and back sensoring a white line to walk in straight line. Also, it can turn to follow the white line to make a bend. i hope someone able to help me out with it. Because i m stuck at that point not knowing how to go about to do. there will be a program file attached too if u can't view the code. Thanks, here is my email, stan_ng87@hotmail.com, if there is any suggestions, u can mail me too...


Attached File(s)
Attached File  Main_Racoon.txt ( 6.88k ) Number of downloads: 25
User is offlineProfile CardPM
+Quote Post

Reply to this topicStart new topic
Time is now: 12/1/08 11:12PM

Live C++ Help!

C++ Tutorials

Reference Sheets

C++ Snippets

DIC Chatroom

Bye Bye Ads

Monthly Drawing

Thumb Drive

Top Contributors

Top 10 Kudos This Month