Lesson 6. Obstacle Avoidance
Avoiding obstacle sometimes means avoiding danger. We have learned how to make a robot that follows the line, and in this lesson, you’ll tech it to avoid obstacles themselves.
1. Learn how to use infrared transmitter and receiver
2. Get to know how to avoid the obstacle
3. Program your robot
4. Equipment needed: Micro USB Cable，MiniQ 2WD Complete robot Kit v2.0
Upload the Code
Open the folder and find “avoidance”
1) Find the code we use
Upload the code, and then put your robot on the ground, use your hands as obstacle to test the robot.
2) The code
#define EN1 6//enable the right motor driver port
#define IN1 7//direction of the right motor
#define EN2 5//enable the left motor driver port
#define IN2 12//direction of the left motor
#define FORW 0//forward
#define BACK 1//back
#define IR_IN 17//infrared receiver
#define L_IR 13//infrared transmitter in the left side
#define R_IR 8//infrared transmitter in the right side
int count;//the count of the pulse received
//M1_DIR for left motor direction, M1_EN for speed of left motor, so does the right motor
void Motor_Control(int M1_DIR,int M1_EN,int M2_DIR,int M2_EN)
if(M1_DIR==FORW) digitalWrite(IN1,FORW); else digitalWrite(IN1,BACK);
if(M1_EN==0) analogWrite(EN1,LOW); else analogWrite(EN1,M1_EN);
if(M2_DIR==FORW) digitalWrite(IN2,FORW); else digitalWrite(IN2,BACK);
if(M2_EN==0) analogWrite(EN2,LOW); else analogWrite(EN2,M2_EN);
void L_Send40KHZ(void)// left infrared LED send 40kHZ pulse
void R_Send40KHZ(void)//right infrared LED send 40kHZ pulse
void pcint0_init(void)//interrupt initialize
PCICR = 0X01;//enable pins in set 0
PCMSK0 = 0X01;//enable pin of number 0
ISR(PCINT0_vect)//Pin PB0 interrupt function
count++;//count the pulse
for(i=0;i<20;i++)//send 20 pulse
if(count>20)//if count more than 20, it is obstacle
1. Infrared receiver
The receiver on the robot consist of receiver, amplification and demodulation. The infrared signal will be demodulated after being received, then the receiver will gives a high level voltage or low level voltage. And for the users, we often connect the output pin to the interrupt pin of Arduino thus to get the data.
2. The concept if interrupt
Interrupt is the action the MCU will memorize where the code runs and jump to run a special function at the same time when it meets special situation or request, and it will jump back when the MCU finish the function for acting the request or the situation.
Take a simple example, if you were eating, and you hear it was raining, you would go and close the window, and then went back to eat your meal. The rain was the interrupt signal, you do the action of closing the window. The continue eating.
3. Principle of avoiding obstacle
We use infrared sensor to help us finish the task of avoiding obstacle. The left transmitter will give 40KHz pulse and then the right one does the same work. If the robot can receive the pulse be reflected, the interrupt function will work to count how many time it receives the signal. When the time is more than 20, we can consider that there must be something in front, then we just need to change the route.
3) Obstacle Avoiding Modules
In the flow chart below, we can see that we just need to check that how many times the receiver can receive the signal when the transmitter is working. After finish the simple way to avoid the obstacle, it is very nice to make your own opinion to have fun with your robot like let your robot follow your hand or something else.
And you can also use line tracking sensors and obstacle avoiding sensor together to let your robot can stop when he have a line follow work. And we also put an electronic compass sensor, so you can let your robot runs more straightly
4) Flow chart about the code
Because if we just turn on the infrared LED, the distance we can detect will be very short, that is not enough for using, and now we use pulse about 38KHz, we can detect longer. This is an interesting point that we change the way of transmitting, and it gives different feedback.
5) Obstacle Avoidance Circuit
See the schematic upon, C23 is used for smoothing, that means ignore the affection by the noise of the circuit. IRR means infrared led in the right and if this pin is given a low voltage, D8 will work. The infrared light reflected will be received by U10, the infrared receiver, and if it receives the right signal, it will change voltage of pin2 to make the MCU run its interrupt function. D17 means digital pin 17 of Arduino.
Now you can do something else with these sensors, just go ahead your idea.
There is a kind of game named sumo robot which is based on obstacle avoiding strategies，so would you have a try?