第二章智能寻迹避障小车寻迹系统设计1.任务任务一:产生智能寻迹避障小车沿黑线转圈的控制程序;任务二:产生智能寻迹避障小车带状态显示沿黑线转圈的控制程序;2.要求(1)能控制智能寻迹避障小车沿黑线实现转圈功能;(2)行走过程中小车一直压着黑线走,不得冲出黑线圆圈之外或之;(3)智能寻迹避障小车可以从小于90度的任意方向寻找到黑线圆圈;2.1 项目描述该项目的主要容是:在智能寻迹避障小车电机控制系统之上扩展寻迹电路,然后运用C 语言对系统进行编程,使智能寻迹避障小车实现沿黑线转圆圈的功能,并且在行走过程中小车一直压着黑线走,不得冲出黑线圆圈之外或之;当人为将小车拿开,再从小于90度的任意方向放置小车,小车应能重新找回轨道,并沿黑线继续转圈。
通过该项目的学习与实践,可以让读者获得如下知识和技能:继续掌握单片机I/O端口的应用;掌握红外线收、发对管的工作原理与控制方法;掌握数码管的工作原理与控制方法;掌握单片机C语言的编程方法与技巧;能够编写出智能寻迹避障小车沿黑线实现转圈功能的控制函数;2.1 必备知识2.1.1 关于红外线传感器红外线定义:在光谱中波长自0.76至400微米的一段称为红外线,红外线是不可见光线。
所有高于绝对零度(-273.15℃)的物质都可以产生红外线。
现代物理学称之为热射线。
医用红外线可分为两类:近红外线与远红外线。
红外线发射器:红外线发射管在LED封装行业中主要有三个常用的波段,如下850NM、875NM、940NM。
根据波长的特性运用的产品也有很大的差异,850NM波长的主要用于红外线监控设备,875NM主要用于医疗设备,940NM波段的主要用于红外线控制设备。
如:红外线遥控器、光电开关、光电计数设备等。
红外线对管应用:本项目中,小车的寻迹功能采用红外线收、发对管实现。
具体工作过程如下:两对红外线收、发对管安装在智能寻迹避障小车底盘正前方,红外发射管一直发射信号,接收管时刻准备接收信号。
两对对着地的红外管发射红外信号,信号在白色的地面上反射回接收管,通过接收管把信号送回单片机进行处理,完成相应的动作。
假如在黑色的地面上,信号被地面吸收,就无信号返回,单片机检测到无信号,根据程序也会做出相应的动作。
如图2.1所示为红外线收、发对管外型示意图。
图2.1 红外收、发对管外形图2.3 案例设计2.3.1 系统设计方案本项目采用单片机最小系统+红外寻线传感器来实现小车寻线功能。
系统设计框图如图2.2所示。
STC89C52复位电路时钟电路红外寻迹传感器单片机最小系统电机驱动芯片直流电机P0口P3口图2.2 系统设计框图2.3.2 硬件电路设计智能寻迹避障小车寻线电路原理图如图2.3所示:它是在单片机最小系统的基础上直接由单片机的P3连接红外线收、发对个构成的,其中单片机的P3.5端口控制左边寻线电路模块,右边寻线电路模块由P3.6控制。
为了保准巡线信号的准确度,一般要求左、右红外发射对管安装时离地面高度控制在0.5cm 比较理想,距离太大,可能造成信号不灵敏,巡线不够准确,距离太小,也可能造成小车前进会与地面产生刮擦,从而损坏器件;另外,左、右收、发对管安装的距离应保持在比黑线条的宽度多一点,做到夹在黑线条,并处于黑线条的边缘,不能压在黑线上。
这样巡线才能准确。
图2.3 智能寻迹避障小车寻线电路原理图2.3.3 系统软件设计任务一:产生智能寻迹避障小车沿黑线转圈的控制程序;1、源程序#include<at89x52.h>#define uint unsigned int#define uchar unsigned char#define out P2sbit zuo1=P0^1;sbit zuo2=P0^0;sbit you1=P0^3;sbit you2=P0^2;sbit zuod=P3^5;sbit youd=P3^6;sbit qiand=P3^7; //左右前 3个红外传感器sbit jiao=P0^6;sbit D1=P2^0;sbit D2=P0^7;void delay(uint x){uchar i;while(x--)for(i=0;i<123;i++);}void qian(){zuo1=0;zuo2=1; //左边往前you1=0;you2=1; //右边往前}void hou(){zuo1=1;zuo2=0; //左边往后you1=1;you2=0; //右边往后}void zuo(){zuo1=1;zuo2=0; //左边往后you1=0;you2=1; //右边往前}void you(){zuo1=0;zuo2=1; //左边往前you1=1;you2=0; //右边往后}void main(){while(1){if(zuod==0&youd==0) //如果左右两个传感器没有检测到黑线{qian(); //直走}if(zuod==1&youd==0) //如果左边的传感器检测到黑线{while(1){zuo(); //左转D1=0;if(zuod==0) //一直左转到传感器检测不到为止{D1=1;break; //跳出循环}}}if(youd==1&zuod==0){while(1){you();D2=0;if(youd==0){D2=1;break; //道理同上}}}}}2、程序运行及调试按图2.3连接智能寻迹避障小车控制电路,编译以上程序,将产生的可执行文件烧写到智能寻迹避障小车的单片机程序存储器,然后将小车放置在黑线圆圈的任意位置,开启电源,小车会沿着黑线不断转圈;将小车从黑线上拿走,然后再放放置黑线旁边,只要小车与黑线不成90度放置,则小车通过自我修正,会重新找到黑线轨迹,继续转圈。
3、程序设计思路基本思路是:先判断智能寻线小车左、右寻线传感器是否夹在黑线边缘,如果是说明寻线传感器处于白色区域,则小车前进;如果不是,则再判断左、右传感器所处的位置,如果左边传感器压到黑线,左传感器指示灯D1亮,说明小车已经偏右,则应调左转函数修正,使左边传感器退出黑色区域;当退出黑色区域后,左传感器指示灯D1灭;当右边传感器压到黑是,方法跟左边处理类是:调用右转函数修正,同时D2亮,修正完,D2灭。
总之,小车在沿黑线转圈过程中,左、右寻线传感器始终是夹在黑线边缘(即白色区域)的,如果不在白色区域,就要根据情况调用左转、或右转函数进行修正。
程序流程图如图2.4所示:图2.4 智能寻迹避障小车寻黑线转圈流程图任务二:产生智能寻迹避障小车带状态显示沿黑线转圈的控制程序;1、源程序#include<at89x52.h>#define uint unsigned int#define uchar unsigned char#define out P2sbit zuo1=P0^1;sbit zuo2=P0^0;sbit you1=P0^3;sbit you2=P0^2;sbit zuod=P3^5;sbit youd=P3^6;sbit qiand=P3^7; //左右前 3个红外传感器sbit jiao=P0^6;sbit D1=P2^0;sbit D2=P0^7;uchar code ZM[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,};void delay(uint x){uchar i;while(x--)for(i=0;i<123;i++);}void qian(){zuo1=0;zuo2=1; //左边往前you1=0;you2=1; //右边往前}void hou(){zuo1=1;zuo2=0; //左边往后you1=1;you2=0; //右边往后}void zuo(){zuo1=1;zuo2=0; //左边往后you1=0;you2=1; //右边往前}void you(){zuo1=0;zuo2=1; //左边往前you1=1;you2=0; //右边往后}void main(){while(1){if(zuod==0&youd==0) //如果左右两个传感器没有检测到黑线{qian(); //直走out=ZM[1];}if(zuod==1&youd==0) //如果左边的传感器检测到黑线{while(1){zuo();out=ZM[3]; //左转D1=0;if(zuod==0) //一直左转到传感器检测不到为止{D1=1;break; //跳出循环}}}if(youd==1&zuod==0){while(1){you();out=ZM[4];D2=0;if(youd==0){D2=1;break; //道理同上}}}}}2、程序运行及调试程序的运行与调试与任务一相同,当程序下载到小车控制电路单片机中,开机运行,小车除完成任务一的动作外,还会在小车行进过程中在数码管上显示小车的状态,比如,小车前进,则在数码管上显示“1”;小车左转弯则在数码管上显示“3”;小车右转弯则在数码管上显示“4”。
3、程序设计思路程序设计思路与任务一基本相同,只是在小车直行、左转、右转函数后面调用相应的状态显示字符。
其程序流程图如图2.5所示。
图2.5 带小车行走状态显示、转圈程序流程图2.4相关知识2.4.1 显示模块显示器是最常用的输出设备,其种类繁多,但在单片机系统设计中常用的是发光二极管显示器(LED)和液晶显示器(LCD)两种。
由于这两种显示器结构简单,价格便宜,接口容易实现,因而得到广泛应用。
下面介绍发光二极管显示器(LED)的结构、工作原理及其接口电路。
1、LED结构与原理LED显示器又称为数码管,它主要由8个发光二极管组成,如图2.6(a)所示。
图中,a~g为数字或字符显示段,h段为小数点显示,通过a~g为7个发光段的不同组合,可以显示0~9和A~F共16个数字和字母。
例如,当a、b、g、e、d段亮时,显示数字“2”,当a、f、e、g段亮时,则显示字母“F”。
LED可以分为共阴极和共阳极两种结构,如图2.6(b)和(c)所示。
其中图(b)为共阴极结构。
即把8个发光二极管阴极连在一起。
这时如果需要点亮a~g中的任何一盏灯,则只需要在相应端输入高电平即可;输入低电平则截止。
比如我们现在要显示数字“3”,则只要在对应的a、b、c、d、g段送入高电平,在其他端送入低电平即可,点亮为“3”。
图(c)为共阳极结构。
其显示端输入低电平有效,高电平截止。
abcdefgh(a)引脚分布图(b)共阴LED (c)共阳LED图2.6八段LED显示块表2-1列出了共阳极与共阴极LED显示器显示数字、字母与显示代码之间的对应关系。