Basic
Note that this is a very (very) crude algorithm, with three parameter that affect the behaviour:
- The initial speed of the m3pi
- How far off the centre the m3pi is before corrective action is taken
- How aggressive the corrective action is
#include "mbed.h" #include "m3pi.h" m3pi m3pi; int main() { // Parameters that affect the performance float speed = 0.2; float correction = 0.1; float threshold = 0.5; m3pi.locate(0,1); m3pi.printf("Line Flw"); wait(2.0); m3pi.sensor_auto_calibrate(); while (1) { // -1.0 is far left, 1.0 is far right, 0.0 in the middle float position_of_line = m3pi.line_position(); // Line is more than the threshold to the right, slow the left motor if (position_of_line > threshold) { m3pi.right_motor(speed); m3pi.left_motor(speed-correction); } // Line is more than 50% to the left, slow the right motor else if (position_of_line < -threshold) { m3pi.left_motor(speed); m3pi.right_motor(speed-correction); } // Line is in the middle else { m3pi.forward(speed); } } }
PID
#include "mbed.h" #include "m3pi.h" m3pi m3pi; // Minimum and maximum motor speeds #define MAX 1.0 #define MIN 0 // PID terms #define P_TERM 1 #define I_TERM 0 #define D_TERM 20 int main() { m3pi.locate(0,1); m3pi.printf("Line PID"); wait(2.0); m3pi.sensor_auto_calibrate(); float right; float left; float current_pos_of_line = 0.0; float previous_pos_of_line = 0.0; float derivative,proportional,integral = 0; float power; float speed = MAX; while (1) { // Get the position of the line. current_pos_of_line = m3pi.line_position(); proportional = current_pos_of_line; // Compute the derivative derivative = current_pos_of_line - previous_pos_of_line; // Compute the integral integral += proportional; // Remember the last position. previous_pos_of_line = current_pos_of_line; // Compute the power power = (proportional * (P_TERM) ) + (integral*(I_TERM)) + (derivative*(D_TERM)) ; // Compute new speeds right = speed+power; left = speed-power; // limit checks if (right < MIN) right = MIN; else if (right > MAX) right = MAX; if (left < MIN) left = MIN; else if (left > MAX) left = MAX; // set speed m3pi.left_motor(left); m3pi.right_motor(right); } }Ref. http://mbed.org/cookbook/m3pi-LineFollowing