SR04声波传感器原理详解及其Arduino编程——人人都能玩硬件
来源:互联网 发布:软件科技有限公司 编辑:程序博客网 时间:2024/06/03 07:15
通过前两篇文章,我们已经熟悉了Arduino的基本GPIO编程和PC与Arduino的串口通信。接下来我们将开始一边学习各种传感器操作,一边深入学习Arduino编程。
再开始编程之前,首先我们需要熟悉SR04的原理。这里说个题外话:绝大多数的传感器电路和接口都是标准的,只要一样的型号,网上的文档都一样。这里我们用SR04声波传感器,某宝能买,不一定贵的就好,学习用的话随便买个价格不贵的就行。
一、SR04工作原理及接口
SR04是常见的一种声波传感器,可以用于测量距离,但实际使用中不易精确,不适宜用于精确测距(精确测距有激光测距模块,某宝就有夏普产的激光测距模块,七八十到几百块的都有,前期学习没必要用这么贵的,而且接口通信复杂,不适用于入门),理论上SR04能达到10米,实际大多标称是四道五米,但实际使用又受环境影响,博主现在手里用的SR04是只有三米以内能比较准确,三米以上的范围就没法测了。
SR04都有四个引脚,VCC、GND(或者是类似〨这样的符号)、Echo、Trig。VCC一般可以接3.3V-5V电源,GND接地也就是负极,你可以直接接Arduino上的5V和GND引脚供电。Trig是启动信号引脚,使用的时候先给他10us以上的高电平,再拉低,SR04就会发送八个40khz的超声波,这时,我们直接对echo拉低(所谓拉高拉低就是输出高电平或者输出低电平),然后就开始等待Echo啥时候变高了我们就开始计时,直到他变低为止,当它变低的时候,我们就可以根据这个时间计算距离了。
简单的说就是:Trig拉高10us以上》Trig拉低》ECHO变高》开始计时》ECHO变低结束计时。根据计算的时间经过计算可以得到距离。计算公式是距离=计算时间(单位:秒)×340米/秒÷2
需要注意的是Trig拉高10us以上!
也就是说你也可以拉高1ms,1s。反正只能多不能少。
如果你仅仅关心怎么编程的话,到这里为止已经足够了,你可以直接看后面的Arduino编程部分。如果你还希望了解SR04工作过程请继续往下看。
SR04有两个喇叭,Trig拉高10us以上再拉低后,SR04就会认为收到开始信号,其中一个喇叭会发出一个特定频率的超声波,发送后拉高Echo引脚,另一个喇叭接受这个超声波,在接受结束后拉低Echo引脚。这时候Echo保持高电平的时间就代表了这段超声波的往返时间,因为是往返的,所以计算过程需要÷2,变成单程的时间,再将这个单程时间乘以声速即340米/秒,得到的就是从当前位置到对面障碍物的距离
二、SR04的Arduino编程
这里我们先将Echo接13,Trig接12。如下图(接线为自己画的,Arduino和SR04的模型源于网络)
接下来是代码部分。但是在上代码之前我们需要先了解一个脉冲计时函数pulseIn(pin,stat,timeout),返回值是微秒数
其中pin是监听的端口号,stat可选LOW或HIGH,表示是低电平脉冲还是高电平脉冲,timeout为可选参数,单位是微秒,默认值是1000*1000us,用于指定脉冲等待时限
如pulseIn(12,HIGH,1000)表示从12号口计算高电平脉冲时间,最多等待1000us。这时候,Arduino会监听12号口变高电平,12号口变高后开始计时,变低后停止计时,并返回计算的微秒数。如果等待超过1000us,12号口都没变高,则等待超时返回0
这个函数清楚后我们就可以开始编程了
int sr_echo=13;int sr_trig=12;//-----------------------------------------------////这是距离获取函数//这个函数执行时将执行对应操作通过sr04获取距离//-----------------------------------------------//float get_distances() { float sr_time=0,sr_dis=0; digitalWrite(sr_trig,LOW); //先发送低电平,为发送启动信号做准备 delay(1); //延时1ms digitalWrite(sr_trig,HIGH); //发送准备信号,准备信号是10us以上的高电平,这里我们发送1ms的高电平 delay(1); //让12号口保持高电平1ms digitalWrite(sr_trig,LOW); //高电平发送后,延时结束,这时我们拉低电平,为读取回信做准备 sr_time=pulseIn(sr_echo,HIGH); //开始读取回信时间,即echo读入为高电平的时间 sr_time=sr_time/1000/1000; //将微秒单位转为秒单位 sr_dis=sr_time*340/2; //回信时间是往返时间所以要除2得到单程时间,声速大约是340M/S,因此再乘 sr_dis*=100; //将米单位转为厘米单位 return sr_dis;}//-----------------------------------------------////这是设置程序//这个函数将在单片机通电后或reset时执行//-----------------------------------------------//void setup() { // put your setup code here, to run once: pinMode(sr_echo, INPUT); //设定sr_echo为输入模式 pinMode(sr_trig, OUTPUT); //设定sr_trig为输出模式 Serial.begin(115200); //设定的波特率}//-----------------------------------------------////这个函数是循环执行程序,它将在setup()之后被执行//当这个函数执行完毕后将会自动重新执行//-----------------------------------------------//void loop() { // put your main code here, to run repeatedly: Serial.println("read data"); float sr_dis=get_distances(); Serial.println(sr_dis); //通过USB转串口向PC发送测得的距离 delay(1000);}
程序上传后,打开串口检测工具,你应该可以看到如下情况(如果你还不会使用串口工具,建议参考上一篇Serial博文)
小心转动你的SR04,或者用你的手去遮挡它,对比串口工具显示的数值变化,再去阅读代码以及注释,或许你就能完全懂了
- SR04声波传感器原理详解及其Arduino编程——人人都能玩硬件
- Arduino第一个程序详解——人人都能玩硬件
- 认识Arduino——人人都能玩硬件
- Arduino的模数转换(以Arduino读取摇杆信息为例)——人人都能玩硬件
- arduino 声波
- Arduino Yun的硬件——Arduino Yun快速入门教程
- Arduino学习笔记—Arduino编程基础
- 【Arduino】超声波模块(HC-SR04)
- arduino 超声波 HC-SR04模块
- HC-SR04超声波模块传感器
- arduino小车入门教学——第四天(传感器)
- arduino学习系列——DHT11温湿度传感器的使用
- Serial的基本使用和ArduinoIDE的串口工具——人人都能玩硬件
- Arduino+HC-SR04 实现超声波测距
- Arduino UNO R3 + HC-SR04测距代码
- Arduino 和 HC-SR04 超声波传感器 测距
- Arduino—一款影响世界的开源硬件
- 人人都能学会程序设计3编程原理—跨平台
- BZOJ P1967[Ahoi2005]CROSS 穿越磁场
- Java学习----day7——(1)Object类
- 【 日常 】 链表的游标 17年4月01日20:39 [ 4 ]
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 垒骰子(编程大题)
- 和服务器进行数据传输的相关问题
- SR04声波传感器原理详解及其Arduino编程——人人都能玩硬件
- twofive(记忆搜索)
- jFree Chart学习-柱状图
- Java基础学习笔记--匿名对象
- 集群session共享机制
- 最少步数
- VMware中虚拟机网卡的四种模式
- 字符串比较
- 使用opencv训练自己的检测器(1)