源码地址:红外避障源码
右红外传感器 /***************************************/ 左红外传感器
GetVoidStatus函数
#define BARRIER_Y 0 //有障碍物
#define BARRIER_N 1 //无障碍物
左右传感器同时检测,当左边红外检测到障碍物,left=1,当右边传感器检测到障碍物,right=2,因此我们就可以通过传感器来控制车子电机的转动
总共右三种情况:
case1:右转
case2:左转
case3:后退->左转或者右转90度,重新检测
char GetVoidStatus(void)
{
char left=0,right=0;
char count;
/*********************************************/
if(VOID_L_IO == BARRIER_Y)//PG2检测到有障碍物
{
count = 2;
while(--count)//10ms 采集2次均要采集到前面障碍物信息,滤波
{
if(VOID_L_IO == BARRIER_N)
break;
Delayms(1);
}
if(count == 0) left = 1;
}
/****************************************/
if(VOID_R_IO == BARRIER_Y)
{
count = 2;
while(--count)//10ms 采集2次均要采集到前面障碍物信息,滤波
{
if(VOID_R_IO == BARRIER_N)
break;
Delayms(1);
}
if(count == 0) right = 2;
}
return left + right;
}
VoidRun函数判断转向
#define VOID_LEFT 1//左边检测到
#define VOID_RIGHT 2//右边检测到
#define VOID_BOTH 3 //两边都检测到
#define VOID_NONE 0//都没检测到
char ctrl_comm = COMM_STOP;//控制指令
char ctrl_comm_last = COMM_STOP;//上一次的指令
void VoidRun(void)
{
char status;
status = GetVoidStatus();
switch(status)
{
case VOID_LEFT:
ctrl_comm = COMM_RIGHT;CarBack(); Delayms(500); CarLeft(); DelayCheck(500);
break;
case VOID_RIGHT:
ctrl_comm = COMM_LEFT;CarBack(); Delayms(500); CarRight(); DelayCheck(500);
break;
case VOID_BOTH:
ctrl_comm = COMM_RIGHT;CarBack(); Delayms(700); CarRight(); DelayCheck(500);
break;
case VOID_NONE:
ctrl_comm = COMM_UP;CarGo();
break;
default: break;
}
}