Hello,
Here i am going to explain a very simple well known and Interesting project "Line Tracking Robot". Line tracker is a machine that can track a path. The path can be visible like a black line on a white surface or it can be invisible like a magnetic field.
How to Sense Line??
Line can be Black on a White surface or White on a Black surface.To sense the line we can use LDR, IR Sensor etc. The basic concept is that when light falling on that Sensors they get activated.
When light falls on a black surface it will completely absorbed by the black surface. And when this light fall on the white surface it will be reflected through it. I am using IR Tx. Rx. pair to sense the black line. IR Tx. continuously spread IR light (Not visible to human Eye) and when this falls on IR Rx. it will generate output in millivolt.
I am using very low cost AVR series 20 pin Tiny2313 Micro-controller. We know that MCU understand TTL logic +5v for HIGH and 0v for LOW. The output of the IR sensor is fed to the MCU pins but the output of the sensor is in millivolt ; MCU always consider it as LOW. Hence we require an Amplifier to amplify the sensor's output at TTL level.
We can use comparator which compares potentials at its Inverting and Non-inverting terminals and gives +5V or 0V signal at the output, now we can fed the output of comparator to MCU i/o pins. One major advantage is to select Comparator as amplifier is that we can adjust the sensitivity of our sensors. LM324 is a 14-pin quad comparator IC.
LM324 Pin details |
According to sensors outputs MCU takes decision and moves the Motors. Here again one thing is to remember that the output current of MCU is not sufficient to drive the DC-Motors hence we require a Motor Driver IC. I am using very popular L293D Motor Driver IC.
Block Diagram according to above discussion-
IR Sensor and LM324 Connection.Repeat this circuit three times.The Output of LM324 is fed to the PORTD (PD0,PD1,PD2) of Tiny2313.
Make the array of IR sensors according to circuit below.Look the images in making steps which describes it clearly.
Motor Driver L293D Connections : The MCU generates outputs according to sensors input; output of MCU from PORTB(PB0,PB1,PB2,PB3) connected to pin 2,7,15,10 of L293D respectively.
Look the table's below to understand how it work.
Complete Circuit Diagram :
Making Steps :
step:1
step:2
step:3
step:4
step:5
step:6
step:7
step:8
step:9
step:10
step:11
step:12
step:13
step:14
step:15
step:16
step:17
step:18
step:19
step:20
Code : Code is very basic and easy to understand for beginners. You can modify this to make more powerful.
/*Microcontroller: ATtiny2313
CPU Frequency: 1MHz Internal
CPU Frequency: 1MHz Internal
Compiler: WinAVR*/
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define TURN_LEFT 0b00001011
#define TURN_RIGHT 0b00001110
#define MOVE_FORWARD 0b00001010
#define ROTATE 0b00000110
#define MOVE_BACKWARD 0b00000101
#define STOP 0b00001111
void delayms(uint16_t millis) {
while ( millis ) {
_delay_ms(1);
millis--;
}
}
int main(void){
unsigned char sensor;
DDRB = 0xFF; //PORTB output port
DDRD = 0x00; //PORTD input port
while(1) {
sensor = (PIND & 0x07);
switch(sensor)
{
case 0x00:PORTB = MOVE_FORWARD; //000
break;
case 0x01:PORTB = TURN_RIGHT; //001
break;
case 0x02:PORTB = MOVE_FORWARD; //010
break;
case 0x03:PORTB = TURN_RIGHT; //011
break;
case 0x04:PORTB = TURN_LEFT; //100
break;
case 0x05:PORTB = MOVE_FORWARD; //101
break;
case 0x06:PORTB = TURN_LEFT; //110
break;
case 0x07:PORTB = STOP; //111
break;
default:PORTB = MOVE_FORWARD;
break;
}
}
return 0;
}
Troubleshooting :
while ( millis ) {
_delay_ms(1);
millis--;
}
}
int main(void){
unsigned char sensor;
DDRB = 0xFF; //PORTB output port
DDRD = 0x00; //PORTD input port
while(1) {
sensor = (PIND & 0x07);
switch(sensor)
{
case 0x00:PORTB = MOVE_FORWARD; //000
break;
case 0x01:PORTB = TURN_RIGHT; //001
break;
case 0x02:PORTB = MOVE_FORWARD; //010
break;
case 0x03:PORTB = TURN_RIGHT; //011
break;
case 0x04:PORTB = TURN_LEFT; //100
break;
case 0x05:PORTB = MOVE_FORWARD; //101
break;
case 0x06:PORTB = TURN_LEFT; //110
break;
case 0x07:PORTB = STOP; //111
break;
default:PORTB = MOVE_FORWARD;
break;
}
}
return 0;
}
Troubleshooting :
1.First check the IR Transmitter is working or not. IR light is not visible to human eye ; use your mobile camera to see the IR light.
2.Check the power supply using multimeter.
3.If L293D gets heated don't worry its not a problem.
4.Most important thing is to adjust the sensitivity of the sensors by varying the 10k Pots.Without proper adjustment of Pots robot doesn't move properly.
5.You can connect one extra base for LM324 to extend this Robot in Obstacle Avoiding Robot in Future the circuitry will same only IR sensors is increased and little modification.
6.If motors rotate on opposite or reverse direction then change the polarity of motors.
6.If motors rotate on opposite or reverse direction then change the polarity of motors.
Downloads :
Video: LINE-TRACKER
If this article is useful for you then don't forget to leave comment.Your suggestion and questions are also invited.
~pratyush