You are viewing an older revision! See the latest version

m3pi LineFollowing

Line following programs use the reflective sensors under the front of the 3pi to detect a difference in reflectivity, usually contrast between a black line on a white background (or vice versa!). The changes in reflections are used to control the motors to keep the line in the center of the sensors.

Reflection sensors

There are 5 sensors on the 3pi, one in the centre, one either side close to the centre and another one either side futher out. This give good resolution near the centre and a wide range.

The m3pi library contains the following function:

float line_position(void);

This reads current state of the sensors and returns a calibrated and normalised floating point number representing where a black line might be with respect to the centre of the 3pi.

  • 0.0 = a line is detected in the centre
  • 1.0 = a line is detected at right edge
  • -1.0 = a line is detected at the left edge, or no line is detected at all

Basic line Following

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 how aggressive the corrective action is

Import program

00001 #include "mbed.h"
00002 #include "m3pi.h"
00003 
00004 m3pi m3pi;
00005 
00006 int main() {
00007 
00008     // Parameters that affect the performance
00009     float speed = 0.2;
00010     float correction = 0.1;   
00011     float threshold = 0.5;
00012 
00013     m3pi.locate(0,1);
00014     m3pi.printf("Line Flw");
00015 
00016     wait(2.0);
00017     
00018     m3pi.sensor_auto_calibrate();
00019     
00020     while (1) {
00021 
00022         // -1.0 is far left, 1.0 is far right, 0.0 in the middle
00023         float position_of_line = m3pi.line_position();
00024 
00025         // Line is more than the threshold to the right, slow the left motor
00026         if (position_of_line > threshold) {
00027             m3pi.right_motor(speed);
00028             m3pi.left_motor(speed-correction);
00029         }
00030 
00031         // Line is more than 50% to the left, slow the right motor
00032         else if (position_of_line < -threshold) {
00033             m3pi.left_motor(speed);
00034             m3pi.right_motor(speed-correction);
00035         }
00036 
00037         // Line is in the middle
00038         else {
00039             m3pi.forward(speed);
00040         }
00041     }
00042 }

All wikipages