AVR Line Follower - Page 2


The robot uses IR sensors to sense the line, an array of 8 IR LEDs (Tx) and sensors (Rx), facing the ground has been used in this setup. The output of the sensors is an analog signal which depends on the amount of light reflected back, this analog signal is given to the comparator to produce 0s and 1s which are then fed to the uC.

Starting from the center, the sensors on the left are named L1, L2, L3, L4 and those on the right are named R1, R2, R3, R4.

Let us assume that when a sensor is on the line it reads 0 and when it is off the line it reads 1.

The uC decides the next move according to the algorithm given below which tries to position the robot such that L1 and R1 both read 0 and the rest read 1.

AVR Line Follower Sensor Array

AVR Line Follower Desired State

AVR Line Follower Block Diagram




  1. L= leftmost sensor which reads 0; R= rightmost sensor which reads 0.
    If no sensor on Left (or Right) is 0 then L (or R) equals 0;
    AVR Line Follower Example
  2. If all sensors read 1 go to step 3,
    If L>R Move Left
    If L<R Move Right
    If L=R Move Forward
    Goto step 4
  3. Move Clockwise if line was last seen on Right
    Move Counter Clockwise if line was last seen on Left
    Repeat step 3 till line is found.
  4. Goto step 1.


Sensor Circuit:

The resistance of the sensor decreases when IR light falls on it. A good sensor will have near zero resistance in presence of light and a very large resistance in absence of light. We have used this property of the sensor to form a potential divider. The potential at point ‘2’ is Rsensor / (Rsensor + R1). Again, a good sensor circuit should give maximum change in potential at point ‘2’ for no-light and bright-light conditions. This is especially important if you plan to use an ADC in place of the comparator.

AVR Line Follower Sensor Circuit

To get a good voltage swing , the value of R1 must be carefully chosen. If Rsensor = a when no light falls on it and Rsensor = b when light falls on it. The difference in the two potentials is:

Vcc * { a/(a+R1) - b/(b+R1) }

AVR Line Follower Voltage Swing

Relative voltage swing = Actual Voltage Swing / Vcc
= Vcc * { a/(a+R1) - b/(b+R1) } / Vcc
= a/(a+R1) - b/(b+R1)

The sensor I used had a = 930 K and b = 36 K. If we plot a curve of the voltage swing over a range of values of R1 we can see that the maximum swing is obtained at R1= 150 K (use calculus for an accurate value).

There is a catch though, with such high resistance, the current is very small and hence susceptible to be distorted by noise. The solution is to strike a balance between sensitivity and noise immunity. I chose value of R1 as 60 K. Your choice would depend on the ‘a’ and ‘b’ values of your sensor.

If you found this part confusing, use a 10K resistor straightaway, as long as you are using a comparator it won’t matter much.

AVR Line Follower Motor Interface and Control Circuit

The 8 sensors are connected to PORTA.

You need not connect anything to AVCC and AREF, it is required only if ADC is used.

The L298 Motor Driver has 4 inputs to control the motion of the motors and two enable inputswhich are used for switching the motors on and off. To control the speed of the motors a PWM waveform with variable duty cycle is applied to the enable pins. Rapidly switching the voltage between Vs and GND gives an effective voltage between Vs and GND whose value depends on the duty cycle of PWM. 100% duty cycle corresponds to voltage equal to Vs, 50 % corresponds to 0.5Vs and so on. The 1N4004 diodes are used to prevent back EMF of the motors from disturbing the remaining circuit. Many circuits use L293D for motor control, I chose L298 as it has current capacity of 2A per channel @ 45V compared to 0.6 A @ 36 V of a L293D. L293D’s package is not suitable for attaching a good heat sink, practically you can’t use it above 16V without frying it. L298 on the other hand works happily at 16V without a heat sink, though it is always better to use one.

AVR Line Follower Internal Schematics L298

Bidirectional DC Motor Control