|  | 
 
| 一、功能原理: 在车头安装2个垂直向下的红外避障模块,作为探测黑线的传感器,当传感器返回的电平为0时,表明是正常地面,当返回的电平是1时,表明是黑线,从而根据两个探测器的状态,判断当前车体的车头状态相对于黑线是何种位置,再进行方向纠正,每一轮死循环都会纠正一次,直到满足车头与黑线平行且探测器未被触发为止。
 
   二、硬件连接
 在车头安装2个垂直向下的红外避障模块,模块发射头距离地面约2cm,调整红外避障模块的灵敏度,使之正好在对着黑线的时候,传感器尾部的指示灯熄灭,对着正常地面时亮起。
 
   (小车车尾朝向用户)我们把机器人左侧的红外传感器接到驱动板的P20接口,右侧的接到P23接口。
 
 三、软件编写
 用keil C V4打开下位机程序工程,找到config.h配置文件,在配置文件中添加巡线传感器的IO管脚配置:
 
 
 然后打开motor.c文件,在文件中加入巡线的代码,首先是定义一个变量,用来保存机器人的运动状态,以便在偏离航线后,没有回到正确方向之前,机器人始终做方向修正动作。复制代码/* 避障管脚配置 */
sbit Input_Detect_LEFT=P2^0;          //右侧探头
sbit Input_Detect_RIGHT=P2^3;         //左侧探头
然后加入一个巡线逻辑函数,实现巡线的逻辑:
 
 调用写好的巡线函数:复制代码//巡线模式
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();//执行巡线
        }
 
 
 
 | 
 |