红外避障模块
比较后就会发现,跟随模块的设计和上节的传感器的设计是一样的,只是跟随模块的红外发射和接受口朝前,而上节的传感器朝下。
因此,同样的逻辑:
模块输出端为高电平:当发射出的红外线没有或反射强度不够大时,红外线接收管就会一直处于关断状态,指示二级管一直处于熄灭状态。
模块输出端为低电平:而当被检测物体出现再检测范围内导致红外线被反射回来且强度足够大,此时红外接收管饱和,指示二级管被点亮。
说人话就是: 反射的强度不够时,DO为高,开关指示灯不亮;反之DO为低,开关指示灯亮
跟随小车的原理
和循迹小车类似,只不过循迹循的是地板上的黑色,而跟随是跟随前方的黑色:
即左边跟随模块能返回红外(输出低电平)且右边模块不能返回红外(输出高电平)时,说明物体在左边,需要左转;
右边跟随模块能返回红外(输出低电平)且左边模块不能返回红外(输出高电平)时,说明物体在右边,需要右转;
接线也和上节一样,这里我选择了左边传感器OUT接P2.5,右边传感器OUT接P2.4:
跟随小车的代码实现
也和上节的代码相差无几:
follow部分:
#include "reg52.h"
#include "motor.h"
#include "timer0.h"
sbit sensor_left = P2^5;
sbit sensor_right = P2^4;
extern char speed_left;
extern char speed_right;
void sensor_react()
{
if(sensor_left == 0 && sensor_right == 0){ //左右模块都能反射红外,物体在正前方,直行
speed_left = 32;
speed_right = 30;
}
if(sensor_left == 1 && sensor_right == 0){ //右模块能反射红外而左模块不能,物体在右边,右转
move_rightturn();
}
if(sensor_left == 0 && sensor_right == 1){ //左模块能反射红外而右模块不能,物体在左边,左转
move_leftturn();
}
if(sensor_left == 1 && sensor_right == 1){ //左右模块都不能反射红外,前方无物体,停止
speed_left = 0;
speed_right = 0;
}
}
main部分:
#include "reg52.h"
#include "intrins.h" //这个库加了,delay函数里面的nop()才不会报错
#include "motor.h"
#include "delay.h"
#include "UART.h"
#include "433M.h"
#include "timer0.h"
#include "route_sensor.h"
void main()
{
Timer0Init();
Timer1Init();
while(1){
sensor_react();
}
}