巡线小车参考设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在2001、2003年连续两届全国大学生电子设计竞赛中,均出现了简易智能小车这种集光、机、电于一体的题目。

本文具体介绍一下小车如何正确地进行循迹并给出必要的源代码。

1.小车控制及驱动单元的选择
此部分是整个小车的大脑,是整个小车运行的核心部件,起着控制小车所有运行状态的作用。

通常选用单片机作为小车的核心控制单元,本文以台湾凌阳公司的SPCE061A
单片机为例予以介绍。

SPCE061是一款拥有2K RAM、32KFlash、32 个I/O 口,并集成了AD/DA 功能强大的16位微处理器,它还拥有丰富的语音处理功能,为小车的功能扩展提供了相当大的空间。

只要按照该单片机的要求对其编制程序就可以实现很多不同的功能。

小车驱动电机一般利用现成的玩具小车上的配套直流电机。

考虑到小车必须能够前进、倒退、停止,并能灵活转向,在左右两轮各装一个电机分别进行驱动。

当左轮电机转速高于右轮电机转速时小车向右转,反之则向左转。

为了能控制车轮的转速,可以采取PWM调速法,即由单片机的IOB8、IOB9输出一系列频率固定的方波,再通过功率放大来驱动电机,在单片机中编程改变输出方波的占空比就可以改变加到电机上的平均电压,从而可以改变电机的转速。

左右轮两个电机转速的配合就可以实现小车的前进、倒退、转弯等功能。

2.小车循迹的原理
这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。

红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。

单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。

红外探测器探测距离有限,一般最大不应超过15cm。

对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头。

(1)自制红外探头电路如图1所示,红外光的发送接收选用型号为ST168的对管。

当小车在白色地面行驶时,装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。

将检测到的信号送到单片机I/O口,当I/O口检测到的信号为高电平时,表明红外光被地上的黑色引导线吸收了,表明小车处在黑色的引导线上;同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。

此种方法简单,价格便宜,灵敏度可调,但是容易受到周围环境的影响,特别是在图1较强的日光灯下,对检测到的信号有一定的影响。

(2)集成式红外探头可以采用型号为E3F-DS10C4集成断续式光电开关探测器,它具有简单、可靠的工作性能,只要调节探头上的一个旋钮就可以控制探头的灵敏度。

该探头输出端只有三根线(电源线、地线、信号线),只要将信号线接在单片机的I/O口,然后不停地对该I/O口进行扫描检测,当其为高电平时则检测到白纸,当为低电平时则检测到黑线。

此种探头还能有效地防止普通光源(如日光灯等)的干扰。

其缺点则是体积比较大,占用了小车有限的空间。

3.红外探头的安装
在小车具体的循迹行走过程中,为了能精确测定黑线位置并确定小车行走的方向,需要同时在底盘装设4个红外探测头,进行两级方向纠正控制,提高其循迹的可靠性。

这4个红外探头的具体位置如图2所示。

图中循迹传感器共安装4个,全部在一条直线上。

其中InfraredMR与InfraredML 为第一级方向控制传感器,InfraredSR 与InfraredSL 为第二级方向控制传感器。

小车行走时,始终保持黑线(如图2 中所示的行走轨迹黑线)在InfraredMR和InfraredML这两个第一级传感器之间,当小车偏离黑线时,第一级探测器一旦探测到有黑线,单片机就会按照预先编定的程序发送指令给小车的控制系统,控制系统再对小车路径予以纠正。

若小车回到了轨道上,即4个探测器都只检测到白纸,则小车会继续行走;若小车由于惯性过大依旧偏离轨道,越出了第一级两个探测器的探测范围,这时第二级动作,再次对小车的运动进行纠正,使之回到正确轨道上去。

可以看出,第二级方向探测器实际是第一级的后备保护,从而提高了小车循迹的可靠性。

4.软件控制
其程序控制框图如图3。

小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号,即进入判断处理程序(switch),先确定4个探测器中的哪一个探测到了黑线,如果InfraredML(左面第一级传感器)或者
InfraredSL(左面第二级传感器)探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是InfraredMR(右面第一级传感器)或InfraredSR(右面第二级传感器)探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。

在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作。

由于第二级方向控制为第一级的后备,则两个等级间的转向力度必须相互配合。

第二级通常是在超出第一级的控制范围的情况下发生作用,它也是最后一层保护,所以它必须要保证小车回到正确轨迹上来,则通常使第二级转向力度大于第一级,即
level2>level1(level1、level2为小车转向力度,其大小通过改变单片机输出的占空比的大小来改变),具体数值在实地实验中得到。

专家点评:根据本文所讲述的方法,我们可以较容易地做出按照一定轨迹行走的智能电动小车。

但是按照该方法行走的小车如果是走直线,有可能会是蛇形前进。

为了使小车能够按轨迹行走的更流畅,可以在软件编程时运用一些简单的算法。

例如,在对小车进行纠偏时,适当提前停止纠偏,而不要等到小车完全不偏时再停止,以防止小车的过冲。

华中科技大学电工电子科技创新基地张立杨立
Line Follower ROBOT
Plermjai Inchuay, plermjai@loxinfo.co.th
Award winner from VingPeaw Competition 2543, the robot built with 2051, L293D, and
four IR sensors. Simple circuit and platform, quick tracking and easy-understand program using C language.
I designed my Robot, which use two motors control rear wheels and the single front wheel is free. It has 4-infrared sensors on the bottom for detect black tracking tape, when the sensors detected black color, output of comparator, LM324 is low logic and the other the output is high.
Microcontrollor AT89C2051 and H-Bridge driver L293D were used to control direction and speed of motor.
Fig 1. Circuit diagram of my Robot.
Fig 2. Circuit diagram of Infrared sensors and comparators.
Fig 4. Position of sensors, left hand side is side view and right hand side
is top view.
Software
Software for write to AT89C2051 is robot1.hex ,which was written by
C-language ,the source code is robot1.c compiled by using MC51 in TINY model with
my start up code robot.asm .
MPEG files
Sample of competition between 2051 and 68HC11.
∙movie1.mpg (1,303kB)
∙movie2.mpg (373kB)
基于单片机的自动巡线轮式机器人控制系统设计来源:国外电子元器件关慧贞字体:[ 大中小] 2007-02-27
关键词:机器人控制
摘要:设计了一种自动巡线轮式行走机器人控制系统,采用A T89S52型单片机作为主控CPU,外加一个复杂可鳊程逻辑器件(CPID)协助CPU处理数据,扩展了程序参数存储器,能够进行检测引导线和直流电机、舵机的PWM控制。

关键词:控制系统;复杂可编程逻辑器件;存储器;光电检测;脉冲宽度调制
1 引言
轮式移动机器人是机器人研究领域的一项重要内容.它集机械、电子、检测技术与智能控制于一体。

在各种移动机构中,轮式移动机构最为常见。

轮式移动机构之所以得到广泛的应用。

主要是因为容易控制其移动速度和移动方向。

因此.有必要研制一套完整的轮式机器人系统。

并进行相应的运动规划和控制算法研究。

笔者设计和开发了基于5l型单片机的自动巡线轮式机器人控制系统。

2 控制系统总体设计
机器人控制系统由主控制电路模块、存储器模块、光电检测模块、电机及舵机驱动模块等部分组成,控制系统的框图如图1所示。

3 主控制模块设计
3.1 CPLD设计
在机器人控制系统中.需要控制多个电动机和行程开关.还要进行光电检测.如果所有的任务都由AT89S52型单片机来完成.CPU的负担就会过重。

影响系统的处理速度。

因此扩展1个CPLD.型号为EPM7128。

它属于.MAX7000系列器件。

包括2个通用1/0口.2个专用I/O 口,专用I/O口可作为每个宏单元和输入输出引脚的高速控制信号(时钟、清除和输出使能等),电动机的。

PWM信号也由其产生。

EPM7128的引脚排列如图2所示。

MlP—M4P引脚的输出为PWM脉宽调制信号,M1FB—M4FB引脚为电机的方向控制信号,P00一P07接单片机的PO口,100一1015为扩展的2个通用I/O口,SIl—S17引脚为行程开关输入信号,LI11一LI17引脚为光电探头输入信号。

CPLD 的编程用VHDL语言,产生1路PWM信号的部分程序源代码如下:
单片机采用24MHz的晶体振荡器,ALE信号的频率fALE=f16=6MHz,最终输出PWM信号的引脚MlP的频率为:
调节这个信号的占空比可以使直流电动机获得O-255级的转速。

基于单片机的自动巡线轮式机器人控制系统设计来源:国外电子元器件关慧贞字体:[ 大中小] 2007-02-27 关键词:机器人控制
3.2 机器人运行参数存储器的扩展
机器人运行路径和动作可以根据比赛情况的不同而发生变化,这样,每改变1次运行参数就必须对单片机的Flash进行1次擦写。

为了解决这一问题.扩展了程序参数存储器,用来存放机器人的运行路径和动作参数.扩展电路如图3所示。

其中IC1为24LC08B,是I2E总线的串行E2PROM存储器,最多能够存储lK字节的数据。

IC2为MAX3232型电平转换器,其内部有1个电源电压变换器,可以将计算机的电平转换为标准TTL电平,实现计算机与单片机之间通过串行口传输数据,使单片机完成对24/LC08B的数据存储操作。

单片机运行时,直接从24LC08中读取机器人的运行参数,控制机器人运行。

4 光电检测模块设计
4.1 光电检测过程
设计光电检测模块是为了让机器人能够检测地面上的白色引导线。

光电检测电路主要包括发射部分和接收部分,其原理如图4所示。

发射部分的波形调制采用了频率调制方法。

由于发光二极管的响应速度快,其工作频率可达几MHz或十几MHz,而检测系统的调制频率在几十至几百kHz的范围内,能够满足要求。

光源驱动主要负责把调制波形放大到足够的功率去驱动光源发光。

光源采用红外发光二极管,工作频率较高,适合波形为方波的调制光的发射。

接收部分采用光敏二极管接收调制光线,将光信号转变为电信号。

这种电信号通常较微弱,需进行滤波和放大后才能进行处理。

调制信号的放大采用交流放大的形式,可使调制光信号与背景光信号分离,为信号处理提供方便。

调制信号处理部分对放大后的信号进行识别,判断被检测对象的特性。

因此,此模块的本质是将“交流”的、有用的调制光信号从“直流”的、无用的背
景光信号中分离出来,从而达到抗干扰的目的。

4.2 光电探头
光电探头安装在机器人底盘前部,共设置了5个检测点。

从理论上讲,检测点越多、越密,识别的准确性与可靠性就越高,但是硬件的开销与软件的复杂程度也相应的增加。

采用该巡线系统保证了检测的精确度,节约了硬件的开销。

发光二极管发出的调制光经地面反射到光敏二极管。

光敏二极管产生的光电流随反射光的强弱而线性变化。

把这种变化检测出来,就可以判断某一个检测点是否在白色引导线的上方,从而判断机器人和白色引导线的相对位置。

5 电机驱动模块
机器人的驱动件主要是电机和舵机,都可以采用PWM进行调速与控制。

根据脉冲编码器的反馈信号,对机器人的运动状态进行实时控制。

直流伺服电机的控制原理如图5所示。

调节:PWM的信号就能够快速调节舵机的转角,从而实现机器人的方向控制。

6 结束语
基于5l型单片机的自动巡线轮式机器人控制系统运行平稳可靠,抗干扰能力强,不仅满足了机器人大赛的设计要求,同时也为智能机器人搭建了良好的控制平台。

共2页上一页[1] [2]
机器人循线算法原理与实践
来源:字体:[ 大中小] 2007-03-05
关键词:机器人循线
[硬件基本构架]
对于机器人的循线,为了获得场地上白线(黑线)的信息,硬件结构一般有如下几种种类。

1、红外对管阵列。

采取这种方式的机器人比较多,尤其在各种机器人竞赛中,几乎是标准
配置。

但是这种技术有一个致命的弱点,就是对于场地光线的干扰特别敏感,而且也很难把红色和白线区别开来,所以使用受到一定的限制。

一般解决这类问题的方法是在红外光上加载一个调制波,通过检测这个调制波来消除场地光线的干扰,至于如何解决红色和白色的区别问题,那就几乎是五花八门了。

2、光纤传感器阵列。

采用这种传感器阵列的原因是,光纤非常细,在单位面积内可以安装更多的传感器,从而获得更精确地场地信息。

当然,钱也也花得更多。

3、线性CCD。

这种硬件方法几乎是一种对场地信息分辨率的BT追求,如果说红外对管阵列还是离散信息的话,那么线性CCD就是线性的连续数据。

当然驱动它也不是一件容易的事情,对于单片机也有更高的速度要求。

4、视觉。

废话少说——否则明天我都别想吃饭。

[基本原理]
所谓循线,就是通过一定的传感器探测地面色调迥异的两种色彩从而获得引导线位置,修正机器人运动路径的一种技术。

——说的太拗口了。

不说太多理论的东西,我们就从基于红外对管阵列的循线技术来说起。

假设,我们使用的是黑底白线的场地。

红外对管阵列由3个红外对管1字摆开组成。

白线的宽度略小于或等于红外对管阵列的宽度。

1、数据的采集。

对于机器人来说,通过传感器感知周围事物的信息,利用这些信息并不作太多智能上的计算而直接通过一定的转换,指导机器人的运动——这种形式在人工智能学上叫做机器人的“反应范式”。

所以,我们要想让我们的机器人能够寻着我们给定的轨迹线运动,第一步就必须让他感知到轨迹线的存在。

一般的做法就是通过AD采样,获得红外对管(传感器)反馈回来的电压信息。

然而,这样获得的电压值信息是无法直接指导运动的,必须把他们转化为二值的(也就是二进制信息,1表示线存在,0表示线不存在)信息,然后通过处理每一个管子反馈回来的二值信息获得白线的位置信息。

>>技术点A AD信号的阀值化。

(你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)
所谓阀值化,就是通过一定的范围把握,从而把线性的数据转化为离散数据的一种变换。

简单的说,就是通过分段函数的方法,将数据分类。

在我们这个应用中,就是想方设
法使AD采集回来的电压值变化为一个恰恰能够准确表示白线位置信息的二进制信息,1代表白线存在,0代表白线不存在。

由于白色和黑色在电压差异上非常之巨大,所以可以简单的通过一个标志线来区分它们,当电压值高于这个标志线了,就把他标志为1,否则就标志为0,算法描述为:
if (AdValue[i] > MarkLing)
{
LineInfor[i] = 1;
}
else
{
LineInfor[i] = 0;
}
这样做非常简单,适合于比较标准的场地,然而对于那些模糊了的场地或者是非标准场地,虽然人的肉眼能够看出来,但是对于机器人来说,可能看到的就是花白的一片或者是黑色的夜幕。

当标志线值过高时,机器人能看到的只是那些特别明显的白线,其他则是黑色的夜幕,很容易丢失轨迹线;当标志线值过低时,机器人眼中就是白茫茫的一片毛刺。

总而言之,对场地的适应性非常差。

解决方法是,通过设定两个标志线来标定轨迹线信息,当AD值高于某一值时,标志1;当AD值低于另外某一值时,则标定0。

算法描述为:
if (AdValue[i] > High_MarkLine)
{
LineInfor[i] = 1;
}
else if (AdValue[i] < Low_MarkLine)
{
LineInfor[i] = 0;
}
else
{
LineInfor[i] = NoInfor;
}
>>技术点 B 动态预值。

(你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)
当然,这种算法在简单的机器人循线中不是很常用。

比较常见,适应性强的方法是,首先从AD值中找到一个中间值作为MarkLine,(或者可以从AD值中找那些比较接近最大值和最小值之差的0.618倍的数值),然后再使用第一种方法标记,这样的算法叫做动态预值。

如果把这种算法应用于第二种当然也不多啦。

2、数据的简单加工——第一个循线程序。

到目前为止,我们已经把AD的值的数组转变为了一个表示白线位置的二进制位的数组——我们不妨直接把他用一个字节表示哈。

那么,这个字节的状态就表示了当前白线的位置信息。

再假设,我们已经写好了几个函数用来分别控制小车的左右运动。

那么我们就可以通过以下的简单方式来实现循线了。

//用字节的高三位表示三个管子检测到的白线信息。

switch (LineInforByte)
{
case 0b11100000: //全部在白线上
Motor_Left_GoFront(FullSpeed);
Motor_Right_GoFront(FullSpeed);
break;
case 0b01100000: //明显车子向左偏了哈
Motor_Left_GoFront(FullSpeed);
Motor_Right_GoFront(NormalSpeed);
break;
case 0b00100000:
Motor_Left_GoFront(FullSpeed);
Motor_Right_GoFront(LowSpeed);
break;
……
//其他情况仿照上面自己写了哈。

default:
Motor_Left_GoFront(StopNow);
Motor_Right_GoFront(StopNow);
break
}
呵呵,这样就完成了一个循线小车的程序了哈。

简单吧。

顺便说明一下下,Motor_Left_GoFront()函数是一个控制电机PWM输出的函数。

FullSpeed NormalSpeed LowSpeed StopNow StopFree 是一些控制PWM的宏定义,你可以修改这些宏定义的值来实现以上的功能。

我想,你看了这个程序应该已经对循线的基本原理了然于胸了吧。

哈哈哈哈哈哈哈哈。

3、数据的高级加工——复杂地面情况的模糊识别算法。

以上的算法的确可以应付规范场地下的情况了,但是由于其类似查表式的数据处理方式,一旦出现真值表中没有的情况——哪怕是很明显的直线存在——机器人都没有办法处理了。

典型的就是在地上有大块的白色斑点,导致机器人对白线视而不见。

解决以上问题的方法还要从人眼识别白线的原理上说起。

在破坏严重的场地上,人类的眼睛仍然可以识别出原先的白线,这是为什么呢?通过重心。

人类的眼睛通过捕捉白线的重心确立白线的大体轨迹,从而辨认出白线的位置。

从概率的角度上说,在破坏严重的场地上,出现在白线两边的浅色干扰的概率是一样的,即使不同,由于白线本身的存在,其重心至少是不会偏离白线很远的,所以,只要简单的获得地面浅色标志的重心,就可以大体确立白线的所在。

我们可以利用物理学上质心的算法获得这一信息。

忘了说一点,要想机器人增
强对环境的适应力,就需要增加传感器的数目。

我们不妨用8个红外管作为传感器。

这样通过处理后获得的场地信息就整整1个字节了。

假设1个光电管的1拥有1单位的重量,八个光电管的坐标分别为-7 -5 -3 -1 1 3 5 7,其间距都是2个单位,通过置信公式很容易计算出质心的坐标,通过这个坐标和0的绝对值,就可以知道当前机器人偏离白线的多少,而这个偏离值则可以通过简单的比例直接指导运动函数。

典型实例如下:
/********************************************************
* 函数说明:电机动作调速函
数*
* 说明:该函数放在定时器或者主循环里面用于产生软PWM*
********************************************************/
void SpeedPWM(char PWMLine)
{
char PWMLine_L = PWMLine;
char PWMLine_R = PWMLine;
static char PWMCount_L = 0;
static char PWMCount_R = 0;
char Temp = 0;
if (FollowLineEnable == True)
{
Temp = (char)fabs((float)CG_X);
if (AdcValueFlag == 0)
{
Temp = 0;
}
else
{
if (CG_X <0)
{
if ((Temp<<4) <= PWMLine_R)
{
PWMLine_R -= ((Temp<<5)+Temp<<2);
}
else
{
PWMLine_R = 0;
}
}
else
{
if ((Temp<<4) <= PWMLine_L)
{
PWMLine_L -= (Temp<<5);
}
else
{
PWMLine_L = 0;
}
}
}
}
PWMCount_L ++;
PWMCount_R ++;
if (PWMCount_L > Fastest)
{
PWMCount_L = Stop;
}
if (PWMCount_R > Fastest)
{
PWMCount_R = Stop;
}
if (PWMCount_L < PWMLine_L)
{
switch (GoDirection)
{
case Front:
Motor_Left_GoFront;
break;
case Back:
Motor_Left_GoBack;
break;
case Left:
Motor_Left_GoFront;
break;
case Right:
Motor_Left_GoBack;
break;
case Stop:
Motor_Left_Stop_Free;
break;
}
}
else
Motor_Left_Stop_Free;
}
if (PWMCount_R < PWMLine_R)
{
switch (GoDirection)
{
case Front:
Motor_Right_GoFront;
break;
case Back:
Motor_Right_GoBack;
break;
case Left:
Motor_Right_GoBack;
break;
case Right:
Motor_Right_GoFront;
break;
case Stop:
Motor_Right_Stop_Free;
break;
}
}
else
{
Motor_Right_Stop_Free;
}
/********************************************************
* 函数说明:获取偏离轨迹线的数
值*
* 输入:表明寻线状态的字
节*
* [说
明]
*
* 通过类质心算法获取当前机器人偏离轨迹线的量* * - 表示偏左+ 表示偏
右*
********************************************************/
signed char GetCG_X(unsigned char AdcValues)
{
signed char a = 0;
signed char Temp = 0;
signed char Totals = 0;
for (a = 0;a<8;a++)
{
if ((AdcValues <<a)>>7)
{
Temp += ((-7)+ (a<<1));
Totals++;
}
}
if (Totals ==0)
{
return 0;
}
return (Temp / Totals);
}
函数调用GetCG_X函数,用来获取CG_X,CG_X直接在PWM输出函数里面指导机器人的运动。

以上方法的好处是,提供了一个比例调节循线动作的可能。

支持多传感器的情况,尤其适合线性CCD类的线性数据的处理。

为机器人提供了一个相对完整的视觉,不可能出现无法识别的情况,而且,这种情况可以使机器人在不加修改程序的情况下直接在在白线循线和黑线循线状态下切换。

相关文档
最新文档