超声波测距在高中物理实验教学中的应用
2016-11-11吴建惠
吴建惠
当物体振动时会发出声音,科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹(Hz).人类耳朵能听到的声波频率为20 Hz-20000 Hz.因此,我们把频率高于20000赫兹的声波称为“超声波”.超声波具有方向性好、穿透能力强、易于获得较集中的声能等特性,在测距、测速等方面具有广泛应用.本文结合高中物理数字键、化实验开发实例,阐述如何利用arduino平台实现超声波测距和数据采集,实现精确、直观、高效率的实验测量和数据处理.
1超声波测距原理及方案对比
超声波测距有两种常见方案,一种是人教版高中物理必修Ⅰ教材第23页所示的方案,把超声波发射器件和接收器件分别置放在所测距离的起点和终点,在红外线遥控器件辅助下计算超声波从起点至终点的时间Δt,再根据s=v·Δt求得距离.另一种方案可称为“反射式”,是把超声波发射器件和接收器件并列安装在起点处,然后测得超声波从发射到经过终点反射回来被接受到的时间差Δt,再根据s=v·(Δt/2)求得距离.方案一的测量精度较高,但实现较繁琐、使用也不便,方案二的测试时间是方案一的两倍、理论上误差也翻倍,但使用较为方便、所需模块也更易于购置,因此我们采用了方案二“反射式”测距方式.
常见的“反射式”超声波测距模块有SR系列、US系列等,表1是我们试用过的几种模块的电性能参数,看上去都属于民用产品、差别并不大,因此网上的超声波测距应用都采用了常见且廉价的HC-SR04模块.但事实上HC-SR04模块和US-016模块并不能满足中学物理实验的必备要求,很多人都忽略了测量频率的问题,下面试分析之.
如前所述,在高中物理必修Ⅰ第二章第5节《自由落体运动》教学中,研究自由落体加速度(重力加速度)是一个非常重要的课堂演示实验,传统上采用打点计时器在纸带上打点记录距离,测量的频率是50 Hz,如果要用超声波测距代替打点计时器,那么测量频率同样必须达到50 Hz,也就是说测量周期不能大于20 ms.而几种模块不同的输出方式导致了他们实际输出效果的区别:
(1) HC-SR系列模块的测量时序如图1,它的测量结果是以脉冲时长的方式输出的,导致测量周期是超声波从起点到终点传播时间的4倍以上,严重限制了测量频率的提高.为了便于理解,我们以测量一米的距离为例分析测量过程:首先单片机向模块发送10 us的高电平,然后模块发射8个40 kHz超声波脉冲约耗时0.2 ms,超声波传播至目标需时t=1 m/(340 m/s)=2.94 ms,反射至接收器件又需2.94 ms,最后模块向单片机输出一个宽度为5.88 ms的高电平脉冲,单片机测得此脉冲宽度后再折算得到测量结果.整个过程约需12 ms,再加上两次测量之间的间隔时间、其他运行步骤消耗时间、尤其是单片机与PC计算机数据通讯时间(实测建议不少于5 ms),整个测量周期很难控制在20 ms之内.换个说法,50Hz的测量频率使得测量距离被限制在一米以内,严重影响了实验的可操作性.尽管HC-SR04模块的标称量程达到4米,但这么长的距离会导致测量周期在50 ms以上,不能达到实验的要求.
(2) US-016模块的输出方式是模拟电平,即把距离转换为输出端口的电压值再由数据采集模块测量取值发送PC,它的转换过程中必然经过积分环节,最终实际效果虽然没有明确的测量周期限制但难以测量距离突变,从数据采集的曲线来看就是测量曲线被修饰圆滑了,出现了较大的高频失真.
(3) US-100模块可采用UART输出模式(串口模式),工作过程简述如下:首先单片机向模块Trig/TX管脚输入0X55(波特率9600耗时<1ms),模块发出8个40KHZ的超声波脉冲(耗时约0.2ms),然后检测回波信号,仍以一米为例,5.88ms后检测到回波信号,然后模块根据此时间计算距离(同时还检测温度对声速进行修正),最后将结果通过Echo/RX管脚以串口数据直接输出给单片机.输出的距离值共两个字节,第一个字节是距离的高8位(HDate),第二个字节为距离的低8位(LData),单位为毫米(即距离值为(HData*256 +LData)mm).它与HC-SR04模块主要区别是:测量值是以两个字节的数据通过9600波特率串口输出,不管距离是多少,输出所耗的时间都是2*8/9600约1.6ms,而不像HC-SR04那样输出结果所需的时间会随着距离的增大而增大.
US-100模块的测量时序如图2,采用该模块进行超声波测距时,如果设定测量周期为20 ms,考虑到测量间隔和其他时间,我们认为实际测量过程时间可以达到12 ms,则最大测量距离可达340×12/2=2040mm,约为2米,比HC-SR04模块更符合重力加速度测量实验的需求.
此外,US-100模块内带自动温度测量并对结果进行校正,也能有效提高实验对环境温度的适应性.从下表可以看出,温度对超声波速度的影响还是很大的,当温度从0变化到20摄氏度时,超声波速度变化量达到3.6%,已经不能忽视.
所以,在反复测试对比后,最终决定采用US-100模块作为距离测量的传感器.
2利用arduino平台实现超声波测距和数据采集
Arduino是目前风靡全球的开源电子创新平台,它本质上是一个经过易用性封装的AVR单片机系统,具有13个数字输入/输出端口和5个模拟输入/输出端口,可以通过外接传感器实现对各类物理量的测量和数据采集.结合专用的编程开发环境,能够快速简便地实现对传感器进行控制、数据采集并与PC计算机软件结合,实现数字实验室的功能.
(1)系统硬件构成:我们采用Arduino Uno主控板控制US-100超声波测距模块,并通过USB连接线连接计算机,同时通过USB的5 V电源给主控板和模块供电,架构清晰制作容易.为了方便使用,我们又把主控板和模块都安装在一个铝合金盒子里,使用时只需要把盒子放在测试处,然后通过USB连接线连接计算机即可.图3即系统框架示意图;图4和图5分别为各模块实物图和安装后的成品图.
(2)系统软件设计和优化:由于超声波测距模块已经把发射、接收、计时整体设计在内,所以本系统的单片机程序很简洁,这也是采用成品测距模块的原因,主程序只负责触发模块、接收数据、向计算机转发数据三个环节.但想要得到比较稳定精确的试验效果还有许多问题需要解决,我们发现网络和杂志常见的一些测距方案或实验都缺乏必要的严谨性,本次设计重点思考并优化解决了如下几个问题:
问题一,如何提高测量量程?
如前所述,我们采用US-100模块进行超声波测距,摒弃了常用的HC-SR04模块,能够减少读取测量结果的时间,从而把量程扩大到2米左右,使之符合常见中学物理实验的要求.
问题二,如何提高测量频率?
为了进一步降低测量周期、提高测量稳定性,我们把Arduino向PC通讯常用的Serial.print命令改为Serial.write命令,每次发送四字节的二进制数据,前两字节为数据标志位,一方面可以作为起始位避免数据错位,另一方面第二字节还可以作为扩展位以提供功能扩展.后两字节是二进制的测量结果数据,并设定传输波特率为115200,使数据传输时间减少到0.27 ms,向计算机实际通讯时间小于一毫秒,从而进一步减小测量和通讯所需时间,保证测量频率为50 Hz时具有足够冗余时间,保障了试验的稳定性.
问题三,如何精确控制测量周期为20 ms?
测量周期的计时原则上可以由上位机或下位机决定,但实际上Windows作为多任务操作系统根本难以保证毫秒级的时间稳定性,而单片机从架构上来说就具有较好的时间稳定性,因此我们设定由单片机程序进行测量周期的计时和比较.单片机程序的各个步骤都有一些微秒级的操作时间,这个时间是固定的,但唯有单片机与计算机通讯的命令受计算机影响时间稳定性较差,有些类似程序没有考虑周全导致程序整体的时间精确性达不到要求.我们的解决方案是把初始计时放在程序之首,然后就是数据发送环节,之后是数据采集环节,大于0.05%.
(3)核心代码:
3PC数据采集与图形化显示程序
上述Arduino系统已经完成了超声波测距、数据采集并向计算机发送的工作,最后还需要通过一定的Windows程序接收数据、保存数据,并能以图形化显示.为此,我们用Vb6.0编写了数据接收和显示程序,并命名为“GeekFlash数据采集器”,如下图6是程序的运行界面和某次动态测距的曲线图.限于篇幅,PC端程序不做详细说明.
4超声波测距与采集在高中物理实验中的实践案例
下面是采用本系统测量重力加速度实验的一组数据,限于超声波测距模块的精度(实测在+-1 mm左右),去除首尾无效数据,所测得重力加速度在9.7-9.8左右,学生不仅可以通过图像直观了解物体下落过程位移随时间变化的特点,也可以根据现场采集的数据计算当地重力加速度值,在实验误差范围内,其精确度、直观性以及实验效率均大大优于打点计时器的效果.