Obstacle avoidance by microcontroller
AT
Ex 1 Obstacle avoidance
The Left motor turn reverse and car turn left when obstacle in right front of car
The right motor turn reverse and car turn right when obstacle in left front of car

:
1 Why use Invertor
for 89C2051 , input voltage higher than 1.8V (0.2 * Vcc+0.9) make digital 1 ,but for CMOS invertor , 2.25V(0.5*Vcc) make digital l , The IR receiver circuit is easy to have voltage lower then 2.25 , but is difficult to get smaller voltage then 1.8V.
2 the purpose of 10KΩ and 100μF
Let
soft program start latter when hardware
became stable after power on.
3 for line follower , please turn IR head to the ground , and change power lines of motors . The program don’t need to change , R1 may try 300Ω or 150Ω,
Program 1 obstacle avoidance ( Keil-C )
#include<at892051.h> // memory address for register and I/O are in file at892051.h
main()
{
while (1)
{
if (P1_2==1) // IF obstacle in right front
P1_3=1; // left motor turn reversely
if (P1_2==0) // If no obstacle in right front
P1_3=0; // left motor turn forward
if (P1_4==1) // IF obstacle in left front
P1_5=1; // right motor turn reversely
if (P1_4==0) // If no obstacle in left front
P1_5=0; // right motor turn forward
}
}
Ex2 See obstacle , reverse than turn
IF obstacle in right front : Car reverse ---turn left ----go forward
. IF obstacle in left front : Car turn right ( no reverse)
#include<at892051.h>
void delay(unsigned int dly);
main()
{
while (1)
{
if (P1_2==1)
{
P1_3=1;
P1_5=1;
delay(100); // car reverse a few seconds
P1_5=0; // right motor go forward , car turn left.
delay(40); // delay seconds
}
if (P1_2==0) // If no obstacle in right front
P1_3=0; // left motor go forward
delay(1); // wait for dispear of interference
if (P1_4==1) // if obstacle in left front
P1_5=1; // right motor reverse
delay(1); // wait for dispear of interference
if (P1_4==0) // If no obstacle in left front
P1_5=0; // right motor go forward
delay(1); // wait for dispear of interference
}
}
void delay(unsigned int dly) // function for delay
{
dly=dly*300;
while (dly>0)
dly--;
}
Ex3
#include<at892051.h>
void delay(unsigned int dly);
unsigned int aa;
main()
{
while (1)
{
if (P1_2==1)
{
P1_3=1;
P1_5=1;
delay(1);
for
(aa=1;aa<=5;aa=aa+1)
{
P1_3=1;
P1_5=0;
delay(40);
P1_3=0;
P1_5=1;
delay(40);
}
P1_5=0;
delay(100);
}
if (P1_2==0)
P1_3=0;
delay(1);
if (P1_4==1)
P1_5=1;
delay(1);
if (P1_4==0)
P1_5=0;
delay(1);
}
}
void delay(unsigned int dly)
{
dly=dly*300;
while (dly>0)
dly--;
}
.