Go Down

Topic: Need help for building a pid controled robot (Read 1 time) previous topic - next topic

Anas

Hi this I have made an arduino line follower. using An arduino dumilave. A 5 ir sensor  array. A 12v and 850ma battery and 300 rpm motors.I am unable to find Kp Ki Kd values and my robot is not at all following the line. This is my code. Pls some  one help

Quote

const int motor3Pin = 3;
 const int motor1Pin = 10;
 const int motor2Pin = 6;
 const int motor4Pin = 11;
int right_speed = 0;
int left_speed = 0;
long sensors[] = {0,0,0,0,0};
long sensors_average = 0;
int sensors_sum = 0;
int posn; //position
int proportional = 0;
long integral = 0;
int derivative = 0;
int last_proportional = 0;
float Kp = 2;  // Havent decided the values yet
float Ki = 2;
float Kd = 2;
int error_value = 0;
int max_speed = 200;
int set_point = 1987;//the posn on the center of line, I have to decide the value yet

void setup(){
   pinMode(motor1Pin, OUTPUT);
  pinMode(motor2Pin, OUTPUT);
  pinMode(motor3Pin, OUTPUT);
  pinMode(motor4Pin, OUTPUT);
  Serial.begin(9600);
}

void read_sensors () {
  for (int i = 0; i < 5; i++) {
  sensors = analogRead(i);
  sensors_average += sensors * i * 1000;
  sensors_sum += int(sensors);
  }
}

void pid_calc () {
  posn = int(sensors_average / sensors_sum);
  proportional = posn - set_point;
  integral = integral + proportional;
  derivative = proportional - last_proportional;
  last_proportional = proportional;
  error_value = int(proportional * Kp + integral * Ki + derivative * Kd);
}

void calc_turn(){
  if (error_value < -256) {
    error_value = -256;
  }
  
  if (error_value > 256) {
    error_value = 256;
  }
  
  if (error_value < 0) {
    right_speed = max_speed + error_value;
    left_speed = max_speed;
  }
  
  else {
    right_speed = max_speed;
    left_speed = max_speed + error_value;
  }
}


void motor_drive (int right_speed, int left_speed) {
  analogWrite(motor1Pin, right_speed);
  analogWrite(motor2Pin, left_speed);
  delay(20);
}

void loop () {
  read_sensors ();
  pid_calc ();
  calc_turn ();
  motor_drive (right_speed, left_speed);
  Serial.print(error_value);
  Serial.print("   ");
  Serial.print(right_speed);
  Serial.print("   ");
  Serial.print(left_speed);
  Serial.println("   ");
}



Thanx

PaulS

Quote
my robot is not at all following the line.

Do you KNOW that the robot is reading the sensors correctly?

Reading the 5 sensors, adding up the values, and determining an average will tell you nothing about where the line is. I think you are barking up the wrong tree. As a matter of fact, I don't think you are even barking in the right forest.

tuxduino

Writing a PID algorithm is not the easiest of the jobs. Please have a look at the PID library, and learn to use and tune it.

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-direction/

PaulS

Quote
Please have a look at the PID library, and learn to use and tune it.

Good advice - IF you have any kind of good data to drive the PID algorithm.

tuxduino

Well, a good advice could have been also "are you _sure_ you need a PID ?".  :)

What made me jump to that (bookmarked) page, though, was that pid_calc() function...

Go Up