C. advanced line following with 3pi: pid control – Pololu 3pi Robot User Manual

Page 27

Advertising
background image

right_led(0);

}

else if(position < 3000)

{

// We are somewhat close to being centered on the line:

// drive straight.

set_motors(100,100);

left_led(1);

right_led(1);

}

else

{

// We are far to the left of the line: turn right.

set_motors(100,0);

left_led(0);

right_led(1);

}

}

// This part of the code is never reached. A robot should

// never reach the end of its program, or unpredictable behavior

// will result as random code starts getting executed. If you

// really want to stop all actions at some point, set your motors

// to 0,0 and run the following command to loop forever:

//

// while(1);

}

7.c. Advanced Line Following with 3pi: PID Control

A more advanced line following program for the 3pi is available in the folder

examples\atmegaxx8\3pi-

linefollower-pid

.

Note: An Arduino-compatible version of this sample program can be downloaded as part of the

Pololu

Arduino Libraries

[http://www.pololu.com/docs/0J17]

(see

Section 5.g

).

The technique used in this example program, known as PID control, addresses some of the problems that you might
have noticed with the previous example, and it should allow you to greatly increase your robot’s line following speed.
Most importantly, PID control uses continuous functions to compute the motor speeds, so that the jerkiness of the
previous example can be replaced by a smooth response. PID stands for Proportional, Integral, Derivative; these are
the three input values used in a simple formula to compute the speed that your robot should turn left or right.

• The proportional value is approximately proportional to your robot’s position with respect to the line. That
is, if your robot is precisely centered on the line, we expect a proportional value of exactly 0. If it is to the left of
the line, the proportional term will be a positive number, and to the right of the line, it will be negative. This is
computed from the result returned by read_line() simply by subtracting 2000.

• The integral value records the history of your robot’s motion: it is a sum of all of the values of the
proportional term that were recorded since the robot started running.

• The derivative is the rate of change of the proportional value. We compute it in this example as the difference
of the last two proportional values.

Here is the section of code that computes the PID input values:

// Get the position of the line. Note that we *must* provide

// the "sensors" argument to read_line() here, even though we

// are not interested in the individual sensor readings.

unsigned int position = read_line(sensors,IR_EMITTERS_ON);

// The "proportional" term should be 0 when we are on the line.

int proportional = ((int)position) - 2000;

Pololu 3pi Robot User's Guide

© 2001–2014 Pololu Corporation

7. Example Project #1: Line Following

Page 27 of 63

Advertising