原创 盛方跟我学做智能车第四节 避障实验

2010-2-25 18:16 2663 7 9 分类: MCU/ 嵌入式

第四节 小车避障实验


一、实验原理:


       避障传感器基本原理,和循迹传感器工作原理基本相同,利用物体的反射性质。在一定范围内,如果没有障碍物,发射出去的红外线,因为传播距离越远而逐渐减弱,最后消失。如果有障碍物,红外线遇到障碍物,被反射到达传感器接收头。传感器检测到这一信号,就可以确认正前方有障碍物,并送给单片机,单片机进行一系列的处理分析,协调小车两轮工作,完成一个漂亮的躲避障碍物动作,传感器原理图如图6。


点击看大图


图6  红外避障传感器原理图


二、实验接线:


       实验时只需把信号输出端(signal)与单片机的P1^0口相连。VCC端接5V电源,GND接电源负极或单片机上的逻辑地。注意:如果对红外避障传感器的使能感兴趣,可以把传感器的TC端接单片机的I/O口,通过控制TC实现是否开启红外避障传感器,当TC为高电平时传感器工作,为低电平时,传感器关闭,参照图7。


三、实验任务:


1、把红外避障传感器固定在小车的正前方,接好线。注意:红外传感器的避障距离也是可调,调节滑动变阻器可以调节避障距离。


2、编制程序,实现小车检测到前方有障碍物时,向左转弯,再检测,没有障碍物,继续前进,有障碍物,继续左转弯。


 


20102121149828545.jpg


图7  避障传感器与单片机连接图


四、红外避障传感器电路分析:


       电路中HEF4011BT是一个4通道2输入与非门。455是晶振,它产生38k的方波,HEF4024BT是7位二进制计数器,38k的方波作为计数器HEF4024BT的时钟输入。HEF4024BT的O2与O3接与非门加一个非门去控制HEF4024BT的复位端。也就是说当HEF4024BT计数到第四位与第三位同时为1时,HEF4024BT就会被清零。同时当HEF4024BT的O3为1时,HEF4011BT的O4为低电平,触发红外发光二极管发送信号。当HEF4024BT的O3为0时,HEF4011BT的O4为高电平,关闭发光二极管,这段时间为4个方波周期。也就实现了38k载波调制的红外。接收头是红外线一体化接收头是集红外接收、放大、滤波和比较器输出的模块。当收到信号时,OUT端输出低电平,LEDR被点亮,指示收到信号,前方有障碍物。没有收到信号,OUT端输出反之。


五、实验源程序:


/*******************************************************************


 


 公司名称:盛方单片机


 公司网址:www.sfmcu.com


 模块名称:007.c


 功    能:小车躲避障碍物。


 说    明:通过定时器0产生PWM调速。


 程序设计:tongwei     


 设计时间:2009.09.15       


 版 本 号:


*********************************************************************/


#include< reg52.h >


 


#define uchar unsigned char


#define uint unsigned int


 


#define MOTOR_C P0                  //P0口作为电机的控制口。


#define SIGNAL P1                   //P2口的低两位为循迹传感器输入口。


#define SHELVES 25                  //速度总档数。


 


#define BACK 0xA5                   //后退


#define FORWARD 0xC6                //前进


 


sbit PWM_R = P0^7;                  //右电机PWM输入口


sbit PWM_L = P0^2;                  //左电机PWM输入口


 


void timer_init( void );            //定时器初始化函数。


void left( void );                  //右转弯函数。


void left( void );                  //左转弯函数。


void forward( void );               //前进函数。


 


uchar percent_l = 0;                //左轮占空比


uchar percent_r = 0;                //右轮占空比


uint run_time = 0;                  //车轮运行一步的时间


 


/********************************************************************


 


 函 数 名:timer_init()


 功    能:初始化定时器0


 说    明:无


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void timer_init( void )


{


    TMOD = 0x02;                //定时器0工作在方式2,定时值自动重载,启动仅受TR0的控制。


    TH0 = 256 - 200;            //定时周期为 200us * SHELVES


    TL0 = 256 - 200;


 


    EA = 1;                     //开总中断。


    ET0 = 1;                    //开定时器0中断。


    TR0 = 1;                    //启动定时器0。


}


 


/********************************************************************


 


 函 数 名:left()


 功    能:小车左转


 说    明:通过控制左右轮不同的占空比,实现左右转。


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void left( void )


{


//  timer_init();               //初始化定时器0。


    MOTOR_C = FORWARD;          //方向向前


    percent_r = 0;              //右轮速度慢。


    percent_l = 4;              //左轮速度快。


}


 


/********************************************************************


 


 函 数 名:right()


 功    能:小车右转


 说    明:通过控制左右轮不同的占空比,实现左右转。


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void right( void )


{


//  timer_init();               //初始化定时器0。


    MOTOR_C = FORWARD;          //方向向前


    percent_r = 4;              //右轮速度快。


    percent_l = 2;              //左轮速度慢。


}


 


/********************************************************************


 


 函 数 名:forward()


 功    能:小车前进


 说    明:


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void forward( void )


{


//  timer_init();               //初始化定时器0。


    MOTOR_C = FORWARD;          //方向向前


    percent_r = 3;              //右轮同速度。


    percent_l = 3;              //左轮同速度。


}


 


/********************************************************************


 


 函 数 名:back()


 功    能:小车后退


 说    明:


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void back( void )


{


//  timer_init();               //初始化定时器0。


    MOTOR_C = BACK;             //方向向前


    percent_r = 3;              //右轮同速度。


    percent_l = 3;              //左轮同速度。


}


 


/********************************************************************


 


 函 数 名:stop()


 功    能:停车


 说    明:


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void stop( void )


{


//  timer_init();               //初始化定时器0。


    MOTOR_C = FORWARD;          //方向向前


    percent_r = 0;              //右轮零速度。


    percent_l = 0;              //左轮零速度。


}


 


/********************************************************************


 


 函 数 名:uchar check_sig()


 功    能:检测信号,并返回信号代码。


 说    明:


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


uchar check_sig( void )


{


    uchar temp = 0;


    temp = SIGNAL & 0x01;       //信号输入口就只有低两位,得到信号码。


    return temp;


}


 


/********************************************************************


 


 函 数 名:avoid()


 功    能:实现避障功能。


 说    明:对采集的信号进行分析,转换为对电机的控制。


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void avoid( void )


{


    uchar sig = 0;              //存储采集的信号


    timer_init();               //初始化定时器0


    while( 1 )


    {


        run_time = 0;           //清计时器,重新开始。


        sig = check_sig();      //存储信号码


        switch( sig )


        {


            case 1:             //没有检测到障碍物。


                forward();


                break;


            case 0:             //检测到障碍物,首先小车倒退一段距离,让后左转弯,最后继续前进。


 


                back();


                while(run_time < 350);  //决定后退的时间。


                run_time = 0;


 


                left();


                while(run_time < 180);  //决定左转弯角度。


                run_time = 0;


 


                forward();


                break;


            default:


                break;


        }


        while(run_time < 3);    //运行一步,时间为 3*5ms


    }


}


 


/********************************************************************


 


 函 数 名:timer_zero()


 功    能:定时器0中断服务函数


 说    明:无


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void timer_zero( void ) interrupt 1


{


    static uchar temp = 0;                  //中断次数计数,


 


    EA = 0;                                 //关总中断,屏蔽其他中断。


 


    if(temp < SHELVES)                      //高电平保持时间。


    {          


        if(temp < percent_l)


        {


            PWM_L = 1;                      //左电机高电平


        }


        else


        {


            PWM_L = 0;                      //左电机低电平


        }


 


        if(temp < percent_r)


        {


            PWM_R = 1;                      //右电机高电平


        }


        else


        {          


            PWM_R = 0;                      //右电机低电平


        }


 


        temp ++;                            //实现计数


    }


    else                                    //一个PWM周期结束,计数清零。


    {


        temp = 0;


        run_time++;


    }      


 


    EA = 1;                                 //开总中断。


}


 


/********************************************************************


 


 函 数 名:main()


 功    能:


 说    明:


 入口参数:无


 返 回 值:无 


 设    计:tongwei           日    期:2009.09.15


 修    改:                  日    期:


***********************************************************************/


void main( void )


{


    avoid();


}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1188474 2010-2-26 14:08

这里的红外发送接收头用的是那一款? 红外调制电路理解有点难,还好解决了,呵呵,有收获,谢谢lz

用户1188474 2010-2-26 14:04

while(run_time < 3); //运行一步,时间为 3*5ms 的作用是仍然保持forward的动作,过了3*5ms 再做检测。 我这样理解对吧?
相关推荐阅读
用户267451 2010-03-10 21:31
Quartus II软件使用详细的步骤说明(3)
8.按照自己的想法,在新建的VHDL文件中编写VHDL程序。9.代码书写结束后,选择Processing>Start Compilation对编写的代码进行编译,直到编译通过。10.编译通过后,...
用户267451 2010-03-10 21:29
Quartus II软件使用详细的步骤说明(2)
5.按默认选项,点击【Next】出现新建工程以前所有的设定信息,如图2.1.6所示,点击Finish完成新建工程的建立,如图2.1.7所示。6.点击File>New,新建一个VHDL文件。如图2...
用户267451 2010-03-10 21:22
智能车 综合功能演示
一、 实验简介:本程序通过将以前所编写的分立程序通过有机结合,编制成一个大的应用系统。小车在完成自动防撞,防悬崖等动作外,还可以通过红外遥控器进行远程遥控。如果你对电脑编程很有趣兴的话,当然也可以通过...
用户267451 2010-03-04 11:58
智能车 串口通信程序演示
一、 实验简介:本程序通过数码管,LED指示灯的闪亮来表示当前串口通信的结果,串口通信使单片机与电脑之间通信的桥梁,通过对它的学习,可以很好的用电脑来进行单片机的控制,及对单片机数据的采集。因此串口通...
用户267451 2010-02-28 21:54
智能车 红外遥控器解码程序演示
一、 实验简介:本程序主要将现在比较常用M50462遥控器进行解码,将解码后的数据通过P2端口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当前运行状态。P10闪亮,表示程序正在运...
用户267451 2010-02-28 21:52
智能车 红外反射与直流电机驱动演示
一、 实验简介:本程序通过前端,底端的红外发射头和接收头来判断小车的运行轨迹,当前与底端发生信号输入时,信号将被单片机接收,单片机来控制机器按照写好的程序开始运行。同时为达到好的效果,加入声音识别与蜂...
EE直播间
更多
我要评论
2
7
关闭 站长推荐上一条 /3 下一条