智能寻迹小车以及程序.docx

上传人:b****3 文档编号:27345859 上传时间:2023-06-29 格式:DOCX 页数:10 大小:73.83KB
下载 相关 举报
智能寻迹小车以及程序.docx_第1页
第1页 / 共10页
智能寻迹小车以及程序.docx_第2页
第2页 / 共10页
智能寻迹小车以及程序.docx_第3页
第3页 / 共10页
智能寻迹小车以及程序.docx_第4页
第4页 / 共10页
智能寻迹小车以及程序.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

智能寻迹小车以及程序.docx

《智能寻迹小车以及程序.docx》由会员分享,可在线阅读,更多相关《智能寻迹小车以及程序.docx(10页珍藏版)》请在冰豆网上搜索。

智能寻迹小车以及程序.docx

智能寻迹小车以及程序

寻迹小车

在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。

笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。

整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。

  总体方案

  整个电路系统分为检测、控制、驱动三个模块。

首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。

系统方案方框图如图1所示。

图1智能小车寻迹系统框图

  传感检测单元

  小车循迹原理

  该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。

笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。

  红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。

在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。

  传感器的选择

  市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。

ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:

图2ST168检测电路

  ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。

ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。

笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。

  R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。

因为传感器输出端得到的是模拟电压信号,所以在输出端增加了比较器,先将ST168输出电压与2.5V进行比较,再送给单片机处理和控制。

  传感器的安装

  正确选择检测方法和传感器件是决定循迹效果的重要因素,而且正确的器件安装方法也是循迹电路好坏的一个重要因素。

从简单、方便、可靠等角度出发,同时在底盘装设4个红外探测头,进行两级方向纠正控制,将大大提高其循迹的可靠性,具体位置分布如图3所示。

图3红外探头的分布图

  图中循迹传感器全部在一条直线上。

其中X1与Y1为第一级方向控制传感器,X2与Y2为第二级方向控制传感器,并且黑线同一边的两个传感器之间的宽度不得大于黑线的宽度。

小车前进时,始终保持(如图3中所示的行走轨迹黑线)在X1和Y1这两个第一级传感器之间,当小车偏离黑线时,第一级传感器就能检测到黑线,把检测的信号送给小车的处理、控制系统,控制系统发出信号对小车轨迹予以纠正。

第二级方向探测器实际是第一级的后备保护,它的存在是考虑到小车由于惯性过大会依旧偏离轨道,再次对小车的运动进行纠正,从而提高了小车循迹的可靠性。

  软件控制单元

  单片机选型及程序流程

  此部分是整个小车运行的核心部件,起着控制小车所有运行状态的作用。

控制方法有很多,大部分都采用单片机控制。

由于51单片机具有价格低廉是使用简单的特点,这里选择了ATMEL公司的AT89S51作为控制核心部件,其程序控制方框图如图4所示。

图4系统的程序流程图

  小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号变化,程序就进入判断程序,把相应的信号发送给电动机从而纠正小车的状态。

车速的控制

  车速调节的方法有两种:

一是用步进电机代替小车上原有的直流电机;二是在原有直流电机的基础上,采用pwm调速法进行调速。

考虑到机械装置不便于修改等因素,这里选择后者,利用单片机输出端输出高电平的脉宽及其占空比的大小来控制电机的转速,从而控制小车的速度。

经过多次试验,最终确定合适的脉宽和占空比,基本能保证小车在所需要的速度范围内平稳前行。

  电机驱动单元

  从单片机输出的信号功率很弱,即使在没有其它外在负载时也无法带动电机,所以在实际电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动。

根据驱动功率大小以及连接电路的简化要求选择L298N,其外形、管脚分布如图5所示。

图5L298N管脚分布图

  从图中可以知道,一块L298N芯片能够驱动两个电机转动,它的使能端可以外接高低电平,也可以利用单片机进行软件控制,极大地满足各种复杂电路需要。

另外,L298N的驱动功率较大,能够根据输入电压的大小输出不同的电压和功率,解决了负载能力不够这个问题。

  结语

此方案选择的器件比较简单,实际中也很容易实现。

经过多次测试,结果表明在一定的弧度范围内,小车能够沿着黑线轨迹行进,达到了预期目标。

不足之处,由于小车采用直流电机,其速度控制不够精确和稳定,不能实现急转和大弧度的拐弯。

 

程序

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharpro_left,pro_right,i,j;//左右占空比标志

                

sbitleft1=P2^0;

sbitleft2=P2^1;

sbitright1=P2^2;

sbitright2=P2^3;  

sbiten1=P1^0;       

sbiten2=P1^1;

      //循迹口三个红外传感器

sbitleft_red=P1^2;//白线位置

sbitmid_red=P1^3;//黑线位置

sbitright_red=P1^4;//白线位置

voiddelay(uintz)

{

uchari;

while(z--)

{for(i=0;i<121;i++);}

}

voidinit()

{

left_red=0;//白线位置

mid_red=1;//黑线位置

right_red=0;

TMOD=0X01;

TH0=(65536-100)/256;

TL0=(65536-100)%256;

EA=1;

ET0=1;

TR0=1;

en1=1;

en2=1;

}

voidtime0(void)interrupt1

{

i++;

j++;

if(i<=pro_right){en1=1;}

  elseen1=0;

if(i==40){en1=~en1;i=0;}

if(j<=pro_left){en2=1;}

  elseen2=0;

if(j==40){en2=~en2;j=0;}

TH0=(65536-100)/256;

TL0=(65536-100)%256;

}

voidstraight()//走直线函数

{

pro_right=39;

pro_left=39;

left1=0;

left2=1;

right1=1;

right2=0;

}

voidturn_left()//左转弯函数

{

pro_right=5;

pro_left=39;

left1=0;

left2=1;

right1=1;

right2=0;

}

voidturn_right()//右转弯函数

{

pro_right=39;

pro_left=5;

left1=0;

left2=1;

right1=1;

right2=0;

}

voidturn_back()//后退(反转)函数

{

left1=1;

left2=0;

right1=0;

right2=1;

pro_right=39;

pro_left=39;

}

voidinfrared()//循迹

{

ucharflag;

if(left_red==1)

  {flag=1;}

  else

if(right_red==1)

  {flag=2;}

  else

if((left_red==0)&(mid_red==0)&(right_red==0))

  {flag=3;}

  elseflag=0;

switch(flag)

  {

   case0:

straight();

    break;

   case1:

turn_left();

    break;

   case2:

turn_right();

    break;

   case3:

turn_back();

    break;

 

   default:

    break;

  }

}

voidmain(void)

{

init();

delay

(1);

while

(1)

{

  infrared();

//straight();

}

}

voidint0(void)interrupt0

{

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1