寻迹小车实验报告

课程设计报告

学院电气工程与自动化学院

题目:基于单片机的寻迹小车

专业:自动化

班级学号:113班07号

姓名:陈奎

指导老师:王祖麟教授

2012/07/25

目录

第一章:绪论                                            1

1.1:前言                                               4

1.2:课程的来源迹和现状                                  4

1.2.1:课题的来源                                     4

1.2.2:智能汽车在国外的情况                           4

1.2.3:智能汽车在国内的情况                           5

1.3 研究内容:                                           5

第二章:小车总体设计                                   5

2.1:机械特性:                                         5

2.2:寻迹原理:                                         6

第三章:硬件设计                                          7

3.1:控制器:                                           7

3.1.1:简述:                                         7

3.1.2:开发工具:                                     8

3.2:硬件电路设计:                                      9

3.2.1:电源电路:                                     9

3.2.2:电机驱动模块:                                 10

3.2.3:红外检测电路:                                 10

3.2.4:遥控控制:                                     10

第四章:软件设计                                         11

4.1:编译环境                                            11

4.2:模块的驱动                                          12

4.2.1:红外传感模块:                                12

4.2.2:电机驱动模块                                   12

    4.2.3:遥控模块的实现                                 15

第五章:系统调试:                                        17

5.1:设计注意事项:                                     17

5.1.1:外部因素                                     17

5.1.2:内部因素:                                    17

5.2:硬件总体调试:                                       18

第六章:小论文                                           19

附录:                                                   

小车程序:                                                20

小车实物                                                 23

第一章:绪论

前言:

随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。可见其研究意义很大。本设计就是在这样的背景下提出的,指导教师已经有充分的准备。本题目是结合科研项目而确定的设计类课题。设计的智能电动小车应该能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车。

当今这个时代是信息的时代,各种新技术、新思想层出不穷,纵观世界范围内智能汽车技术的发展,每一次新的进步无不是受新技术新思想的推动。随着汽车工业的迅速发展,传统的汽车的发展逐渐被淘汰。伴随着电子技术和嵌入式技术的迅猛发展,这使得汽车日渐走向智能化。智能汽车由原先的驾驶更加简单更加安全更加舒适,逐渐的向智能驾驶系统方向发展。智能驾驶系统相当于智能机器人,能代替人驾驶汽车。它主要是通过安装在前后保险杠及两侧的红外线摄像机,对汽车前后左右一定区 域进行不停地扫描和监视。计算机、电子地图和光化学传感器等对红外线摄像 机传来的信号进行分析计算,并根据道路交通信息管理系统传来的交通信息,代替人的大脑发出指令,指挥执行系统操作汽车,这就使得智能汽车的发展成为当今的主流,所以就有了这许许多多的智能汽车实验。

1.2课题的来源及现状

1.2.1.课题的来源

汽车的智能化是21世纪汽车产业的核心竞争力之一。

汽车的智能化是以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科交叉的科技,成为当今许多科目的综合体。

1.2.2智能汽车国外发展情况

从20世纪70年代开始,美国、英国、德国等发达国家开始进行无人驾驶汽车的研究,目前在可行性和实用化方面都取得了突破性的进展。

在无人驾驶技术研究方面位于世界前列的德国汉堡Ibeo公司研制的无人驾驶汽车,20##年4月11日在英国伦敦科学博物馆与公众见面。这辆无人驾驶智能汽车经德国大众汽车公司生产的帕萨特2.0改装而成,外表看来与普通家庭汽车并无差别,但却可以在错综复杂的城市公路系统中无人驾驶

1.2.3智能汽车国内发展情况

与国外相比,国内在智能车辆方面的研究起步较晚,规模较小,开展这方面研究工作的单位主要是一些大学和研究所,如国防科技大学、清华大学、吉林大学、北京理工大学、长安大学、沈阳自动化所等。

我国从20世纪80年代开始进行无人驾驶汽车的研究,国防科技大学在1992年成功研制出我国第一辆真正意义上的无人驾驶汽车。先后研制出四代无人驾驶汽车。第四代全自主无人驾驶汽车于20##年6月在长沙市绕城高速公路上进行了全自主无人驾驶试验,试验最高时速达到75.6Km/h。 

在20##年10月12日的第六届高交会上,红旗无人驾驶汽车就引起了极大的轰动。它在高速公路上最高稳定无人驾驶速度为130公里/小时;峰值无人驾驶速度为170公里/小时。并同时具备安全超车和系统小型化两个主要指标。为如此,他们把它称为“中国汽车界的神舟五号”。

20##年,首辆城市无人驾驶汽车在上海交通大学研制成功,该车有望于两年之内率先在上海世纪公园进行示范运营,并在20##年世博会上一展身手。到时游 客只需在公园的入口处按下一个按钮,一辆没有司机的四座敞篷汽车就会从远处开过来缓缓停下,然后搭载着乘客前往他们想去的景点。

1.3:本论文研究的内容

本论文主要是研究3轮小车的寻迹原理及其控制过程的实现。

第二章:总体设计

2.1机械特性

小车采用的是一辆三轮车车模。后轮控件前进或转弯,前轮根据后轮驱动左右摆即可以实现左右转。这种车模控制简单。小车上的单片机可通过寻迹模块传送来的信号,做出判断,进而指挥小车后轮电机的运转,实现寻迹过程。PWM控制后轮电机转动的速度来控制前轮电机的转动幅度从而控制小车的转弯幅度,实现小车的前进与转弯操作的快慢和幅度大小。

2.2寻迹原理

探测路面黑线的基本原理:光线照射到路面并反射,由于黑线和白纸对光的反射系数不同,可以根据接收到的反射光强弱来判断是否是黑线。利用这个原理,可以控制小车行走的路迹。这里的寻迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。

红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质物质时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就根据是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过3cm。

智能小车系统以处理器为核心, 为了使智能小车能够快速行驶,处理器必须把路径的迅速判断、相应的转向电机控制以及直流驱动电机的控制精密地结合在一起。如果传感器部分的数据没有正确地采集和识别,转向电机控制的失当,都会造成模型车严重抖动甚至偏离轨道;如果直流电机的驱动控制效果不好,也会造成直线路段速度上不去,弯曲路段入弯速度过快等问题。其系统结构如所图 所示。

小车系统结构图

    单片机内核向红外线传感器供5V电压,通过采集其高低电平可以控制小车的转弯。

第三章:硬件设计

3.1控制器的选择

本设计核心微控制器采用的是80C51单片机芯片。

3.1.1概述

80C51是一款八位单片机,它的易用性和多功能性受到了广大使用者的好评。它是第三代单片机的代表。第三代单片机包括了Intel公司发展MCS-51系列的新一代产品,如8xC152﹑80C51FA/FB﹑80C51GA/GB﹑8xC451﹑8xC452,还包括了Philips﹑Siemens﹑ADM﹑Fujutsu﹑OKI﹑Harria-Metra﹑ATMEL等公司以80C51为核心推出的大量各具特色﹑与80C51兼容的单片机。新一代的单片机的最主要的技术特点是向外部接口电路扩展,以实现Microcomputer完善的控制功能为己任,将一些外部接口功能单元如A/D﹑PWM﹑PCA(可编程计数器阵列)﹑WDT(监视定时器)﹑高速I/O口﹑计数器的捕获/比较逻辑等。这一代单片机中,在总线方面最重要的进展是为单片机配置了芯片间的串行总线,为单片机应用系统设计提供了更加灵活的方式。Philips公司还为这一代单片机80C51系列8xC592单片机引入了具有较强功能的设备间网络系统总线----CAN(Controller Area Network BUS).新一代单片机为外部提供了相当完善的总线结构,与前面的比较,增加了加减乘除,16为数据指针,布尔代数运算等指令,以及串行通信能力和5个中断源。采用40引脚直插式DIP,内有128个RAM单元和4k的ROM,有两个16为定时计数器,两个外中断,两个定时计数中断,及一个串口中断,并有4个8为并行输出口,内部有时钟电路,但需要石英晶体和微为系统的扩展与配置打下了良好的基础。

本设计就采用了比较先进的80C51为控制核心,80C51采用CHOMS工艺,功耗很低。该设计具有实际意义,可以应用于考古、机器人、医疗器械等许多方面。

尤其是在足球机器人研究方面具有很好的发展前景;在考古方面也应用到了超声波传感器进行检测。所以本设计与实际相结合,现实意义很强。现在所使用的单片机80c51 是广州致远电子有限公司为企业用户和高校师生设计的一款开发工具。

其内部结构如下图所示:

Pict0009

3.1.2单片机开发工具特点

1.编译器 :

SDCC是专门为8为单片机开发的免费C语言编译软件,支持80C51单片机的编译与调试。

2.强大的开发环境:

TKSstdioIDE集成环境是广州志远电子开发的一款功能强大的开发环境,内置了仿真监控功能软件,能够实现强大的单片机在线方针和ISP下载编程。

3.丰富的编译工具链:

单片机核心板全面支持 SDCC,ARM,AVR,CCORE,Keil,GCCAVR,WindRiver的编译连接。

4.下载工具:

单片机可直接通过UART下载,也可通过USB转到UART下载,最主要是通过TKSstdio生成HEX文件,通过Flashmagic下载,即可运行。

3.2:硬件电路设计

本次小车项目采用的电路板从画电路原理图开始,到PCB板的布线以及电路板的焊接与检测一系列工作都是自己在周末利用空闲时间制作的,电路图是王老师画在黑板上,然后详细讲解后我们才按照老师讲的进行布线焊接的,石板几次,也浪费几件晓得不可在用材料。

3.2.1系统电源电路

交流电经过全桥电路在经过电容滤波,在经过稳压电源芯片做成稳压电路,输出电压5V、7.2V2的直流电压,其电源电路原理图大体如下图所示。

系统电源电图

小车的驱动电机的供电电压为9V左右,经过电容滤波后接7805进行稳压,稳压输出7.2V的电压。输出的电压经滤波后提供电源。最后输出的电压为5V。

小车行进过程一般用5V的电压。7.2V的电压会把寻迹模块和单片机烧坏,所以一般不用7,2V的,只有当电池电压特别低的时候,电量供应不足时才可使用,但时间应该很短,否则就会使电池亏损。

3.2.2电机驱动模块

1.      驱动原理:

其驱动采用H桥电路,电路图如下所示:

H桥电路使用四个三极管构造而成,每次只能有其中两个导通,这样就可以控制电机的停走了,从而达到控制小车转弯的目的了。

3.2.3:红外线检测电路

红外线检测电路,就是利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收单片机内核采集到的电压就是高电平;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光,然后单片机内核采集到的电压就是低电平。其基本原理图如下图所示:

图3.6 红外线检测电路原理图

鉴于本项目设计需实现的功能比较简单,故只要两路红外线检测电路即可,分别位于小车中心轴的两测即可,但是由于检测过程中的各种因素的影响,最后还是采用了四路检测。

3.2.4:遥控模块

遥控模块是现成的,所以不用设计电路图。

第四章:软件设计

4.1编译环境:

TKStudio集成开发环境是广州致远电子有限公司开发的一个微处理器软件开发平台,是一款具有强大内置编辑器的多内核编译调试环境,支持8051、ARM、AVR等多种微控制器,可以完成从工程建立和管理,编译,链接,目标代码的生成,到软件仿真,硬件仿真(挂接TKS系列仿真器等硬件)等完整的开发流程。

TKStudio集成开发环境包括工程管理器、代码编辑器、编译工具链、源码级调试器和外部工具等。

4.2模块的驱动:

4.2.1红外线传感器模块

红外线模块只要单片机处理器向其供5V电压就能工作,然后通过引脚接收其电平高低就可以根据不同情况做出相应的处理。

其具体程序控制见下面:

1:定义信号端口:

/*****信口管脚**/

#define S1   P0_1                 /****左信号*******/

#define S2   P0_3                 /****右信号*******/

#define S3   P0_5                 /****左信号*******/

#define S4   P0_7                 /****右信号*******/

2:判断信号执行相应的操作:

if ((S1==1&&S2==1||S1==0&&S2==0)||(S3==1&&S4==1||S3==0&&S4==0))

                                      { run() ; }

if ((S1==1&&S2==0)||(S3==1&&S4==0))   { left() ; }

if ((S1==0&&S2==1)||(S3==0&&S4==1))  { right() ;}

4.2.2电机模块的驱动:

电机的驱动是通过高低电平的输出来控制的,具体程序如下:

1:宏定义电机端口 :

/*****电机******/

#define PWM1 P1_0                 /****左电机*******/

#define PWM2 P1_2                 /****右电机*******/

#define DIR1 P1_4                  /****左电机*******/

#define DIR2 P1_6                  /****右电机*******/

前轮为方向轮,只有在需要转弯的时候才需要后边电机驱动其左右转动,在常态下则由后轮的推力使前轮向前转动。具体实现是通过控制后面两个电机的停转和快慢来控制的,由于这个项目做的比较简单,所以没有加上PWM,所以控制前轮的只能是后面两个电机的停和转。

具体的前进,后退等操作程序如下:

void run()                                        /****前进*******/

{ PWM1=1;PWM2=1;DIR1=0;DIR2=0; }              

void stop()                                       /****停止*******/

{ PWM1=0;PWM2=0;DIR1=0;DIR2=0;}               

void right()                                      /****右转*******/

{ PWM1=1;PWM2=0;DIR1=0;DIR2=0;}

void left()                                       /****左转*******/

{ PWM1=0;PWM2=1;DIR1=0;DIR2=0;}

void  bw()                                        /****后退*******/

{ PWM1=1;PWM2=1; DIR1=1;DIR2=1;}

具体判断框图如下所示:

图直流电机控制流程图

根据上图可以看到程序一开始就进行读取红外线传感器,如果左右两边都遇到黑线则前进;如果左边遇到黑线而且右边没有遇到黑线,则左转;如果右边遇到黑线而且左边没有遇到黑线,则右转;如果两边都没有遇到黑线则直行。具体程序控制详见程序清单见下面:

判断小车转向:

if(flag==0)

    { if((S1==1&&S2==1||S1==0&&S2==0)||

(S3==1&&S4==1||S3==0&&S4==0))

            { run() ; }

   if ((S1==1&&S2==0)||(S3==1&&S4==0))

            { left() ; }

   if ((S1==0&&S2==1)||(S3==0&&S4==1))

            { right() ;}

}

if(flag==1)     {  fw();   }

  

if(flag==2)      {  bw();   }

  

if(flag==3)      {  left(); }

  

if(flag==4)      {  right();}

  

if(flag==5)      {  stop(); }

   

4.2.3遥控模块的实现:

遥控模块属于外加的,由于没有相应的电路图和器材,所以就从淘宝上买了一套回来,直接加上去了具体程序如下:

1:定义端口

/*****遥控*******/

#define AD0  P2_1                 /****前进*********/

#define BD1  P2_3                 /****后退*********/

#define CD2  P2_5                 /****左转*********/

#define DD3  P2_7                 /****右转*********/

2:遥控实现:

if(AD0==0&&BD1==0&&CD2==0&&DD3==0)   {   flag=0;  }

if(AD0==1&&BD1==0&&CD2==0&&DD3==0)   {   flag=1;  }

if(AD0==0&&BD1==1&&CD2==0&&DD3==0)   {  flag=2;   }

if(AD0==0&&BD1==0&&CD2==1&&DD3==0)   {  flag=3;   }

if(AD0==0&&BD1==0&&CD2==0&&DD3==1)   {  flag=4;   }

if(AD0==1&&BD1==1&&CD2==0&&DD3==0)   {  flag=5;   }

if(flag==1){  fw();   }

if(flag==2){  bw();   }

if(flag==3){  left();   }

if(flag==4){  right();  }

if(flag==5){  stop();  }

 第五章:调试分析

5.1:注意事项

5.1.1:外部因素

外部因素主要有周围环境光线的强弱、轨道材质等因素。以采用光电寻迹方案的寻迹车为例来说明,如果接收的信号中有很多黑白区分不清晰,导致接收到的信号不是很清晰,就很难识别路线,从而对单片机的判断造成很大的影响,单片机判断不清晰就不能很好的发出命令,从而就不能很好的朱慧小车按照黑线路径来走,因此,合理的传感器离地间隙和反射角度、较好的滤波电路设计都是需要考虑的,当然传感器的高度可以随时更具要求调整高度,主要是角度问题,这是设计时需要认真考虑的。

5.1.2:内部因素

1:质量

车的质量的大小对车的行走有很大影响,由于这次的小车做的比较简单,没有加上去多少模块,所以小车车身较轻,轮子摩擦力太小,开始实验室总是轮子打滑。而不能前进,为了使小车美观,又不能加上其他东西,最后经过一番思考,把电池巧妙的安装在了轮子上面相应的位置,从而加大了摩擦力,小车可以不打滑前进了。

2:速度过快的问题

由于是后面的电机驱动,所以经常会导致在弯道的时候小车冲出轨道,由于小车没有PWM控制速度,只能通过电机的停转来控制,所以这种现象并不奇怪,但是这种情况是要解决的,最后经过思考,我有加上了两路寻迹,这样即使里面两块出去了,外面两块照样把他拉回来。

3:传感器的影响

由于轨道是临时做的,因而不是很平整,所以传感器太低有可能碰到地面,太高却又检测不到信号,这个问题同样决定小车能不能稳定寻迹,最后把传感器往两边掰开一些,就可以解决这个问题了。

5.2:硬软件总体调试

   当软件和硬件单独调试都成功以后,就进入整体调试阶段,把小车的各部分都组装好,然后用键盘显示板来显示寻迹效果,找一张白色纸片,在寻迹班前来回晃动,没经过一次传感器,数码管显示的值就加一,由于此次小车较简单,所以只考虑,寻迹板是否可以检测到高低电平即可,当左边的二极管熄灭时,就说明遇到黑线,此时如果左边电机停止转动,右边电机继续转动,则说明左边调试成功,右边一样,换方向即可,如果左右都调试成功,就可宣布小车整体调试成功。

  

第六章:小论文

这个课程设计做了整整一个月,听起来时间很长,其实真正没有那么长,这一个月并不是全部时间用来做小车,只是抽出部分时间做的,大部分时间还是在上课,做高数和大物,周末几乎没有了,周六学长或王老师来上一天课,周日又被自己关在实验室做小车,大家都说,小车就那么几块板子,几十行的程序,很简单的,但是问题并不这么简单,我提前下手的,别人还在焊板子是,我就已经开始调试程序了,但是当别人开始调试程序是我还在那条是程序,甚至原来焊板子的人已经成功了,我还在调试程序,虽然刚开始接触到这个课程设计,有点茫然,但是经过请教别人,查阅资料,逐渐理解了这个项目的精髓,觉得内什么问题了,可是总是调试不能成功,王老师要求一个人做一辆小车,开始我就觉得小车挺简单的,一个人完全可以做出来,最后才发现好多问题解决不了,才明白一个人的力量是有限的,不得不去请教别人了,比如就像同学告诉你我的,接上上拉电阻之后小车就会跑得很快,玩弯道是采用延时小车就不会冲出去了等很多细节问题,版还珠我解决好多问题,最后我的小车终于可以稳定寻迹了,此次课程设计我或获益匪浅呐,不仅增长了知识,更重要是看到了团体的力量,一个人的力量是有限的,但是团体的力量是无边的,一个人无论学的多么好,总会有疏忽的地方,大家合作才能共同进步,这个无论是在学习还是工作上都是真理,懂得合作的人才是人才,最后要说的就是感谢我们的王老师。他为了我们“3+1”实验班的教育事业,废寝忘食,呕心沥血,周内为我们补课,周末为我们加班,开始我很是不理解,觉得是占用我们时间,后来才渐渐良心发现,王老师是为了我们的将来不留遗憾,王老师的这份敬业精神着实令人感动,暑假我留校,自动化就剩10人左右,但是王老师还是来给我们讲课,我们只有努力学习专业课,才能报答王老师。

附完整版小车程序:

#include"config.h"

#include"Port.h"

/*****信口管脚**/

#define S1   P0_1                 /****左信号*******/

#define S2   P0_3                 /****右信号*******/

#define S3   P0_5                 /****左信号*******/

#define S4   P0_7                 /****右信号*******/

/*****电机******/

#define PWM1 P1_0                 /****左电机*******/

#define PWM2 P1_2                 /****右电机*******/

#define DIR1 P1_4                  /****左电机*******/

#define DIR2 P1_6                  /****右电机*******/

/*****遥控*******/

#define AD0  P2_1                 /****前进*********/

#define BD1  P2_3                 /****后退*********/

#define CD2  P2_5                 /****左转*********/

#define DD3  P2_7                 /****右转*********/

int flag=0;                                                  

void run()

{ PWM1=1;PWM2=1;DIR1=0;DIR2=0; }

void stop()

{PWM1=0;PWM2=0;DIR1=0;DIR2=0;}

void right()

{PWM1=1;PWM2=0;DIR1=0;DIR2=0;}

void left()

{PWM1=0;PWM2=1;DIR1=0;DIR2=0;}

void  fw()

{ PWM1=1;PWM2=1; DIR1=0;DIR2=0;}

void  bw()

{ PWM1=1;PWM2=1; DIR1=1;DIR2=1;}

char YK( )

{if(AD0==0&&BD1==0&&CD2==0&&DD3==0){flag=0;}

if(AD0==1&&BD1==0&&CD2==0&&DD3==0){flag=1;}

if(AD0==0&&BD1==1&&CD2==0&&DD3==0){flag=2;}

if(AD0==0&&BD1==0&&CD2==1&&DD3==0){flag=3;}

if(AD0==0&&BD1==0&&CD2==0&&DD3==1){flag=4;}

if(AD0==1&&BD1==1&&CD2==0&&DD3==0){flag=5;}

return flag;}

void main(void)

{ while(1

 { if(flag==0)

{

if ((S1==1&&S2==1||S1==0&&S2==0)||(S3==1&&S4==1||S3==0&&S

{ run() ; }

if ((S1==1&&S2==0)||(S3==1&&S4==0)) { left() ; }

if ((S1==0&&S2==1)||(S3==0&&S4==1)){ right() ;}

}

 if(flag==1){  fw();   }

 if(flag==2){  bw();   }

 if(flag==3){  left(); }

if(flag==4){  right();}

 if(flag==5){  stop();

 }

}

附小车实物图:

相关推荐