引言
安全避障是移动机器人研究的一个基本问题。障碍物与机器人之间距离的获得是研究安全避障的前提;超声波传感器以其信息处理简单、价格低廉、硬件容易实现等优点,被广泛用作测距传感器。本超声波测距系统选用了SensComp公司生产的Polaroid 6500系列超声波距离模块和600系列传感器。
超声波测距技术是一种有源非接触测距技术,是利用超声波在空气中的定向传播和固体反射特性,通过接收自身发射的超声波反射信号,根据超声波发出及回波接收时间差和传播速度,计算出传播距离,从而得到障碍物到研究平台的距离。由于超声波传感器具有成本低,采集信息速率快,距离分辨率高,质量轻、体积小,易于装卸等优点,并且超声波传感器在采集环境信息时不存在复杂的图像匹配技术,不需要通过大量的计算而获得距离数据,因此其测距速度快,实时性好。同时超声波传感器不易受到如天气条件,环境光照及障碍物阴影,表面粗造度、裂缝等外界环境条件的影响。鉴于以上种种优点,使得超声波传感器在室外环境的自主移动的研究平台车应用中具有很大优势。
超声波是指频率高于20 kHz的机械波。为了以超声波作为检测手段, 必须产生超生波和接收超声波。实现这种功能的装置就是超声波传感器,习惯上称为“超声波换能器”或“超声波探头”。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。超声波测距的原理一般采用渡越时间法TOF(Time Of Flight)。首先测出超声波从发射到遇到障碍物返回所经历的时间t, 再乘以超声波的速度就得到2倍的声源与障碍物之间的距离, 即
式中: d为传感器与被测障碍物之间的距离,c为声波在介质中的传输速率。在空气中,声波的传输速率为:
式中: T为绝对温度,c0 =331.4 m/s[1]。c的单位为m/s,在测距精度不是很高的情况下,一般认为c为常数340 m/s。
1 超声波硬件电路设计
笔者设计的超声波测距系统由Polaroid 600系列传感器、Polaroid 6500系列超声波距离模块组成。Polaroid 600系列超声波传感器是一种集发送与接收为一体的传感器。传感器内有一个圆形的塑料薄片,在其正面涂了一层金属薄膜,背面有一个铝制的后板。薄片和后板构成了一个电容器。当给薄片加上频率为49.4 kHz、电压峰峰值为AC 300 V的方波电压时,薄片以同样的频率振动,从而产生频率为49.4 kHz 的超声波。当接收回波时, Polaroid 6500内有一个调谐电路,使得只有频率接近49.4 kHz的信号才能被接收,而其他频率的信号则被过滤。Polaroid 600 系列超声传感器发送的超声波具有角度为30°的波束角。
超声波传感器既可以作为发射器,又可以作为接收器。传感器用一段时间发射一串超声波束, 只有待发送结束后才能启动接收,设发送波束的时间为t, 则在t时间内从物体反射回的信号就无法捕捉; 另外,超声波传感器有一定的惯性,发送结束后还留有一定的余振,这种余振经换能器同样产生电压信号,扰乱了系统捕捉返回信号的工作[2]。因此,在余振未消失以前,还不能启动系统进行回波接收。以上两个原因造成了超声传感器具有测量一定的测量范围。此超声波可以测量的最近距离为37 cm。
1.1 硬件电路
图1为超声波距离模块的硬件电路。
图1 超声波距离模块的硬件电路图
TL851是一种经济的数字12步测距控制集成电路。内部有一个420 kHz的陶瓷晶振, 6500 系列超声波距离模块开始工作时,在发送的前16个周期,陶瓷晶振被8.5分频,形成49.4 kHz 的超声波信号,然后通过晶体管Q1 和变压器T1 输送至超声波传感器。发送之后陶瓷晶振被4.5分频,以供单片机定时用。TL852是专门为接收超声波而设计的芯片。因为返回的超声波信号比较微弱,需要进行放大才能被单片机接收,因此TL852 主要提供了放大电路。当TL852接收到4个脉冲信号时,就通过REC 给TL851 发送高电平,表明超声波已经接收。
1.2 芯片集成后的超声波测距方法
首先,将声纳的INIT信号拉到高电平,此时声纳换能器将激发出超声波。INIT信号高电平的时间可以由用户来设定。图2所示的INIT信号的高电平时间是32 ms。高电平的时间与需测量的最长距离有关。当超声波遇到障碍物时,超声波将被返回,声纳传感器检测到回波信号后,将ECHO置为高电平。当INIT信号变为低电平时,ECHO同时也变为低电平,因此可以通过下式计算障碍物的距离:
图2 超声波原理
障碍物的距离=(INIT高电平时间-ECHO高电平的时间)×声纳速度/2
2 超声波的实现
2.1 ARM9中超声波的测距方法
采用一个定时器控制4路超声波,分为前后左右。选择定时器的周期应比超声传感器探测最长距离所需的渡越时间稍长。每一次探测大约32 ms,故定时器周期应稍大于32 ms。
超声波测距系统工作流程为:定时器4中断打开前、后、左、右4路超声波,(如打开前方超声波)然后外部中断关闭该路超声波并在中断中测距。在一个定时器周期内采集4路超声波数据,然后根据距离的不同选择转弯的方向。
此超声波传感器精确测量距离为36 cm~5 m。对于大于5 m的测量数据的时间数,给出超出测距范围的标志,不作时间记录。
2.2 超声波测距模块驱动程序设计
Linux系统中超声波传感器为只读的字符设备[3]。在应用程序下打开超声波设备,然后在驱动中测距,测得的数据传到应用程序。应用程序中有超声波的避障算法,根据算法判断障碍物的位置给直流电机控制信号进行避障。图3为超声波测距流程。
图3超声波测距流程
超声波传感器设备驱动中定义的file_operations数据结构为:
static struct file_operations sonar_fops={
open:sonar_open,
release:sonar_release,
ioctl:sonar_ioctl,
};
在该驱动中只需用到3个操作: open、release、ioctl。通过ioctl的第3参量可以传输数据。
模块初始化函数int init_sonar(void)用于实现设备的初始化、中断初始化及处理、设备注册等。超声波传感器设备的初始化选择了在打开设备时,主要实现了中断处理函数的绑定、中断申请以及中断初始化,避免了每次初始化设备时都要进行中断的相关操作。static void cleanup_sonar(void)函数用于模块卸载时中断停止、资源的释放等,同时进行字符设备的注销。另外,释放中断选择了在sonar_release()函数中完成。
模块初始化函数如下:
intinit_sonar(void) {
Major = register_chrdev(0, DEVICE_NAME, &sonar_fops);
if (Major < 0) {
printk("<1>Registering the sonar device failed with %d\\n",Major);
return Major;
}
printk("<1>Registered, got Major no= %d\\n",Major);
printk("Hello,I'm in kerne mode\\n");
return 0;
}
卸载模块函数,在该函数中应释放在Open中申请的中断:
static void cleanup_sonar(void) {
free_irq(IRQ_TIMER4, DEVICE_NAME);
free_irq(IRQ_EINT4, DEVICE_NAME);
free_irq(IRQ_EINT5, DEVICE_NAME);
free_irq(IRQ_EINT6, DEVICE_NAME);
printk("<1>Unregistered\\n");
printk("Hello, I'm going to out,goodbye my sonar device\\n");
unregister_chrdev(Major,DEVICE_NAME);
}
module_init(init_sonar);//驱动调用该函数才能真正实现模块初始化
module_exit(cleanup_sonar);//驱动调用实现卸载函数调用
sonar_open()函数用于打开设备。这是设备的入口,其中有关于设置中断的set_external_irq(IRQ_EINT4,EXT_RISING_EDGE,GPIO_PULLUP_DIS)函数,该函数与内存地址映射有关,必须用该函数设置中断。这里超声波用到的4路中断为IRQ_EINT4、IRQ_EINT5、IRQ_EINT6、IRQ_EINT7。sonar_release()函数主要调用free_irq()完成了中断释放。sonar_ioctl()主要用于超声波设备的多路选择和获得各路设备的测距值。驱动中sonar_ioctl()函数具体实现了各宏的操作,Sonar0_On、Sonar0_Off、Sonar1_On、Sonar1_Off分别用于使能和关闭Sonar0、Sonar1两组传感器;Linux应用程序ioctl()函数使用Sonar0_Range_Front、Sonar0_Range_Back、Sonar1_Range_Left、Sonar1_Range_Right,可以获得前后左右4个方向的测距值。
static void timer4_interrupt(int irq,void *dev_id,struct pt_regs *regs) {
printf("\\n\\ntimer0is running.\\n");
ClearPending(BIT_TIMER4);
m++;
TCON =TCON&~0xf00000|0xa00000;
//只开启手动装载timer0
TCON =TCON&~0xf00000|0x900000;
//开自动重载,关反转,关手动更新,开timer0
rGPCDAT=0xf;
//启动对应的I/O口,启动发射超声波,接init
}
static void eint4_interrupt(int irq, void *dev_id, struct pt_regs *regs) {
sonar_time_front =((60000 TCNTO4) >> 1);
//外部中断中测距
ClearPending(BIT_EINT4_7);
GPCDAT&=0xfffe;//关闭超声波传感器
i++;
printk("\\nEINT4occured times=%d\\n",i);
front_range= sonar_time_front*0.204;
printk("\\n\\nfront_distance=%d\\n",front_range);
}
3 总结
以ARM与嵌入式Linux为平台,设计基于超声波的机器人避障系统是可行的。在项目开发中利用ARM作为机器人的总处理器,同时控制运动系统和超声波系统。目前该平台已成功应用于机器人的开发。