Monthly Archives: March 2016

Making a line follower BOT

Standard
Making a line follower BOT

Line followers are one of the most prominent kinds of robot. They have existed for a very long time , however the technologies used for building them have changed rapidly. Earlier controller boards the size of bricks were used , but now they have shrunk and become tremendously powerful. Now , technology allows you to build a line follower in just under 10 minutes if you have all the parts for it. So enjoy building this quick and easy line follower. Have fun with this tutorial!

What are the stuff required to do this project?

Hardware :

  1. Arduino / Arduino Clone
  2. Two continuous rotation servo motors Continuous rotation servo.
  3. A ball caster : Ball caster.
  4. An infrared sensor array like this : Pololu QTR-8A IR sensor array OR a set of six IR Leds and Detectors.
  5. Resistors : 1K and 10K.
  6. Two robot wheels like this, select wheels after checking if they fit in the servo : Robot wheels.
  7. Chassis , usually a small acrylic board will do.
  8. Four AA duracell batteries and battery holder.

Software :

  1. Arduino IDE : Arduino.

So how does it work?

The working of a line follower robot is pretty straight forward. These robots have the capability to detect a black/dark line on a lighter surface depending on the contrast. They estimate whether the line underneath them is shifting towards their left/right as they move over them. Based on that estimation they give respective signals to the motors to turn left/right so as to maintain a steady center with respect to the line.

These robots usually use an array of IR (Infrared) sensors in order to calculate the reflectance of the surface beneath them. The basic criteria being that : The black line will have a lesser reflectance value (black absorbs light) than the lighter surface around it. This low value of reflectance is the parameter used to detect the position of the line by the robot. The higher value of reflectance will be the surface around the line. So in this linear array of IR sensors, if the leftmost/rightmost IR sensor presents the low value for reflectance , then the black line is towards the left/right of the robot correspondingly.The controller then compensates for this by signalling the motor to go in the opposite direction of the line.

LineFollower1

The IR sensor array consists of individual IR LEDs and IR photodiodes. The IR light emitted by the LED strikes the surface and is reflected back to the IR photodiode. The photodiode then gives an output voltage proportional to the reflectance of the surface (high value for light surface and low for black/dark surface).

Easy Line Follower

Step 1 (Optional) : Making the sensor array for the line follower (only if you don’t want to buy the pololu reflectance sensor)

In order to make an IR sensor array , take the six IR LEDs and connect them in parallel with each other. Now, take the IR photodiodes and place each of them just below the six IR LEDs. Wrap each pair together using black insulation tape leaving their tips exposed. Take these six pairs of IR LEDs and photodiodes and join them in a straight line, each pair should be 1.5cm apart from the next.

Irled.jpg

 

joined.jpg

Step 2 : Assembling the components for the line follower

Take the piece of acrylic board and stick the servo motors to the left and right edges using hotglue/super glue. Then attach the ball caster on the opposite edge . Take the pololu IR sensor array or your own sensor array and stick it on top of the two servo motors using a small plastic / foam piece. The sensor must be positioned in such a way that it’s about 4-5mm from the ground for optimal performance.On the top side, stick the arduino board using double side tape, do the same for the battery holder. This is how it looks like :

Lf2.jpg Lf1

Step 3 : Connecting all the components together for the line follower

Setup the hardware connections with the arduino and the servo motors. The continuous rotation servo motors are those kinds of servo motors that cannot be controlled or set at a particular angle unlike normal servos. Servos have three wires coming from them : Red- Power , Black -Ground, White/Yellow- PWM /PPM Signal. The left servo motor (white/yellow wire) is hooked up to arduino digital pin 9 and right servo motor (white/yellow wire) to arduino digital pin 10. The black wires of both the motors are connected to arduino GND and the Red wires to the positive terminal of the battery holder.

lineFollow

 

Using Pololu QTR-8A Reflectance array sensor :
If you are using the pololu sensor, and you don’t need all the 8 IR detectors you can remove 2 of them by cutting at the indicated perforation line on the board. The code we are using is only for 6 of them. Then solder some header pins to the board for Vcc, Gnd and signals 1,2,3,4,5,6. Connect the Vcc and Gnd of this sensor to arduino’s Vcc and Gnd. The signals 1,2,..6 are connected to arduino’s analog input pins A0, A1, A2, …A5.

Using custom fabricated sensor array :
If you are using the custom fabricated sensor array, then short the anode terminals of all the IR LEDs together and connect it to the arduino Vcc through a 220Ohm resistor. Next , short the cathode terminals together and connect it to arduino Gnd. Now, connect a 10K resistor to the cathode of each of the IR photodiodes. Short the free ends of all the 10K resistors together and connect it to arduino Gnd. Now short the anode terminals of the IR photodiodes together and connect it to arduino Vcc. Lastly, connect a wire to the cathode of each of the IR photodiodes (between the cathode and the 10K resistor). Connect each of the wires in sequence to arduino’s analog input pins A0, A1,..A5.

lineFollowcust

 Step 4 : Uploading the code for your line follower

The code for the line follower can be found at the end. After uploading the code , you need to sweep/move the sensor array over the black line from left to right for roughly 3 seconds. This is done in order to calibrate and find the max and min values for reflectance. After that place the robot on the line and watch the bot follow it. If your using the pololu QTR-8A reflectance array sensor then no significant changes may be required, try to check the values coming from the sensor through the serial monitor. Based on those values adjust the values in the code correspondingly.

For those who made the custom board, find out the rough values of reflectance over the black line and the outer surface. Substitute these values in the code and calibrate it. You can use normal black insulation tape as the line for your line follower. The line follower in action ! EnjoYY!!

 

Code:

/*
Line Follower Robot -Abhishek Sugam, Micosoft Student Partner, University of Washington, Seattle.

Quick and easy line following robot using an IR reflectance
array.Connect Vcc and Gnd to the Pololu QTR-8A sensor from 
the arduino. Connect the pins 1,2,3,... to arduino's analog
pins 0,1,2,3,4,5.
If the average of the 3 values of the sensors on the left is
greater than the average of those on the right, then the robot
moves left and vice versa.
NOTE : The values in the code for analog voltages would have 
to be modified if you are not using the Pololu QTR-8A reflectance
array sensor. Use trial and error to find out max and min 
values for your own IR array sensor.
 
 */
#include <Servo.h> 

Servo left;
Servo right; 

int mid = 0;
int mn = 0;
int mx = 0;

void setup()
{

left.attach(9, 800, 2200); //left servo motor
right.attach(10, 800, 2200); //right servo motor

Serial.begin(115200);

digitalWrite(13, LOW);

right.write(90);//stop signal
left.write(90);//stop signal

for(int i=0; i<5000; i++)
{
digitalWrite(13, HIGH);

int val = 0;
for(int j=0; j<=5; j++)//Calibrating the sensor, finding max and 
{                      //min reflectance values.
val = analogRead(j);
if(val >= mx)
mx = val;
if(val <= mn)
mn = val;
}
delay(1);
}

mid = ((mx + mn)/2);
digitalWrite(13, LOW);

right.write(90);
left.write(90);
}

void loop()
{

int s0 = 0;
int s1 = 0;
int s2 = 0;
int s3 = 0;
int s4 = 0;
int s5 = 0;

s0 = analogRead(0);//Signal pin 1 on the board
s1 = analogRead(1);//Signal pin 2 on the board
s2 = analogRead(2);//Signal pin 3 on the board
s3 = analogRead(3);//Signal pin 4 on the board
s4 = analogRead(4);//Signal pin 5 on the board
s5 = analogRead(5);//Signal pin 6 on the board

Serial.print("Mid: ");
Serial.print(mid); 
Serial.print(" ");
Serial.print(s0); 
Serial.print(" ");
Serial.print(s1); 
Serial.print(" ");
Serial.print(s2); 
Serial.print(" ");
Serial.print(s3); 
Serial.print(" ");
Serial.print(s4); 
Serial.print(" ");
Serial.print(s5); 
Serial.print(" ");
Serial.println();

right.write(180);//Move forward
left.write(0);//Move forward

delay(1);

if((((s0+s1+s2)/3)>(((s3+s4+s5)/3)+240)))//Move right
{
right.write(130);//180
left.write(90);//90
Serial.print(" RIGHT");
delay(abs((((s5+s4+s3)/3)-((s0+s1+s2)/3))/2));
}

if((((s0+s1+s2)/3)<(((s3+s4+s5)/3)-240)))//Move left
{
right.write(40);//90
left.write(0);//0
Serial.print(" LEFT");
delay(abs((((s5+s4+s3)/3)-((s0+s1+s2)/3))/2));
}

if((s0 > mid)&&(s5 > mid))//Stop if all the sensors give low 
{                         //reflectance values
right.write(90);
left.write(90);
Serial.print(" STOP");

for(int k=0; k<50; k++)
{
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
}
delay(5000);
}


}