|
一、功能原理:
在车头安装2个垂直向下的红外避障模块,作为探测黑线的传感器,当传感器返回的电平为0时,表明是正常地面,当返回的电平是1时,表明是黑线,从而根据两个探测器的状态,判断当前车体的车头状态相对于黑线是何种位置,再进行方向纠正,每一轮死循环都会纠正一次,直到满足车头与黑线平行且探测器未被触发为止。
二、硬件连接
在车头安装2个垂直向下的红外避障模块,模块发射头距离地面约2cm,调整红外避障模块的灵敏度,使之正好在对着黑线的时候,传感器尾部的指示灯熄灭,对着正常地面时亮起。
(小车车尾朝向用户)我们把机器人左侧的红外传感器接到驱动板的P20接口,右侧的接到P23接口。
三、软件编写
用keil C V4打开下位机程序工程,找到config.h配置文件,在配置文件中添加巡线传感器的IO管脚配置:
- /* 避障管脚配置 */
- sbit Input_Detect_LEFT=P2^0; //右侧探头
- sbit Input_Detect_RIGHT=P2^3; //左侧探头
复制代码 然后打开motor.c文件,在文件中加入巡线的代码,首先是定义一个变量,用来保存机器人的运动状态,以便在偏离航线后,没有回到正确方向之前,机器人始终做方向修正动作。
然后加入一个巡线逻辑函数,实现巡线的逻辑:
- //巡线模式
- void FollowLine(void)
- {
- switch(Robots_Run_Status)
- {
- case 0x01:MOTOR_GO_RIGHT; break;
- case 0x02:MOTOR_GO_LEFT; break;
- case 0x03:MOTOR_GO_FORWARD; break;
- case 0x04:MOTOR_GO_STOP; break;
- }
- if((Input_Detect_LEFT == 0)&& (Input_Detect_RIGHT == 0))//两边探测器都返回低电平,表明左右两侧的红外传感器均探测到了地面,机器人直行。
- {
- Robots_Run_Status=0x03;//直行
- }
-
- if((Input_Detect_LEFT == 1)&& (Input_Detect_RIGHT == 0))//左侧传感器返回了高电平,表明左侧传感器探测到了黑色线,相对于黑线,机器人整体方向偏右了,需要向左侧修正。
- {
- Robots_Run_Status=0x02;//左转
- }
-
- if((Input_Detect_LEFT == 0)&& (Input_Detect_RIGHT == 1))//右侧传感器返回了高电平,表明右侧传感器探测到了黑色线,相对于黑线,机器人整体方向偏左了,需要向右侧修正。
- {
- Robots_Run_Status=0x01;//右转
- }
-
- if((Input_Detect_LEFT == 1)&& (Input_Detect_RIGHT == 1))//左右都同时检测到黑线,说明有一条横着的黑线,机器人到巡线的终点,停止运行。
- {
- Robots_Run_Status=0x04;//停止
- }
- }
复制代码 调用写好的巡线函数:
在主函数main.c中,找到while(1)死循环,加入刚刚编写的巡线函数
- while(1)
- {
- FollowLine();//执行巡线
- }
复制代码 这个是比较初级的巡线方式,满足一般条件的黑线没有问题,如果需要保险点,可以多加几个红外避障模块,这样进行多重判断会更精确。
|
|