找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 33515|回复: 4
打印 上一主题 下一主题
收起左侧

Arduino超声波测距实验示例教程

[复制链接]
跳转到指定楼层
楼主


全部资料51hei下载地址:
超声波测距.zip (2.58 MB, 下载次数: 133)


Arduino示例教程模块版——超声波测距实验
超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即:s=340m/s× t / 2 。这就是所谓的时间差测距法。本实验利用超声波测得的距离从串口中显示。
元器件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
1p杜邦线 × 4 ;
超声波传感器 × 1;

知识要点:
pulseIn():用于检测引脚输出的高低电平的脉冲宽度。
pulseIn(pin, value)
pulseIn(pin, value, timeout)
Pin---需要读取脉冲的引脚
Value---需要读取的脉冲类型,HIGH或LOW
Timeout---超时时间,单位微秒,数据类型为无符号长整型。
使用方法及时序图:
1、使用Arduino采用数字引脚给SR04的Trig引脚至少10μs的高电平信号,触发SR04模块测距功能;
2、触发后,模块会自动发送8个40KHz的超声波脉冲,并自动检测是否有信号返回。这步会由模块内部自动完成。
3、如有信号返回,Echo引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。此时,我们能使用pulseIn()函数获取到测距的结果,并计算出距被测物的实际距离。
SR04与Arduino接线示意图:
Arduino示例程序:
  1. /*
  2. IDE 版本:1.0.1
  3. 功能:利用SR04超声波传感器进行测距,并用串口显示测出的距离值
  4. */

  5. // 设定SR04连接的Arduino引脚
  6. const int TrigPin = 2;
  7. const int EchoPin = 3;
  8. float distance;
  9. void setup()
  10. {   // 初始化串口通信及连接SR04的引脚
  11.         Serial.begin(9600);
  12.         pinMode(TrigPin, OUTPUT);
  13.     // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
  14.         pinMode(EchoPin, INPUT);
  15.     Serial.println("Ultrasonic sensor:");
  16. }
  17. void loop()
  18. {
  19.     // 产生一个10us的高脉冲去触发TrigPin
  20.         digitalWrite(TrigPin, LOW);
  21.         delayMicroseconds(2);
  22.         digitalWrite(TrigPin, HIGH);
  23.         delayMicroseconds(10);
  24.         digitalWrite(TrigPin, LOW);
  25.     // 检测脉冲宽度,并计算出距离
  26.         distance = pulseIn(EchoPin, HIGH) / 58.00;
  27.         Serial.print(distance);
  28.         Serial.print("cm");
  29.         Serial.println();
  30.         delay(1000);
  31. }
复制代码

连线实物图:
下载完程序后,打开串口监视器,并将超声波传感器对向需要测量的物体,即可看到当前超声波传感器距物体的距离,如下图:

第56讲Arduino入门教程实验16超声波实验

1实验原理
    科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹(Hz)。我们人类耳朵能听到的声波频率为20Hz~20000Hz。当声波的振动频率小于20Hz或大于 20000Hz时,我们便听不见了。因此,我们把频率高于20000赫兹的声波称为“超声波”。由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。
超声波测距原理:超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。
超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。
测距的公式表示为:
L=C×T

式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。
这节课我们就介绍一下怎样使用SR04超声波模块来进行距离测量。会用到上节课脉冲计时所学到的知识,通过计算脉冲时常来算出来超声波传感器所感知到的距离.
                              
4-16-1SR04超声波模块参数
2硬件电路
超声波测距实验参考表4-16-2。

实验器件

数量
landzoduino开发板
1
编程线
1
杜邦线
若干
面包板
1
超声波模块
1

4-16-2超声波测距实验器件表
4-16-3超声波测距实验电路图
3程序设计
测试程序如下:
  • /****************************************************
  • 超声波测距实验程序
  • 使用超声波传感器测距并串口显示距离值
  • This example code is in the public domain.
  • ****************************************************/
  • const int TrigPin = 8;
  • const int EchoPin = 9;
  • float cm;
  • /****************************************************
  • 初始化部分_setup()函数
  • ****************************************************/
  • void setup()
  • {
  • Serial.begin(9600);
  • pinMode(TrigPin, OUTPUT);
  • pinMode(EchoPin, INPUT);
  • }
  • /****************************************************
  • 执行部分_loop()函数
  • ****************************************************/
  • void loop()
  • {
  • //低高低电平发一个短时间脉冲去TrigPin
  • digitalWrite(TrigPin, LOW);
  • delayMicroseconds(2);
  • digitalWrite(TrigPin, HIGH);
  • delayMicroseconds(10);
  • digitalWrite(TrigPin, LOW);
  • //将回波时间换算成cm
  • cm= pulseIn(EchoPin, HIGH) / 58.0;
  • Serial.print(cm);
  • Serial.print("cm");
  • Serial.println();
  • delay(1000);
  • }
复制代码
4实验操作
1)   按照图4-16-3将电路连接到landzoduino开发板上。
2)   插上编程线,把程序下载到Landzoduino控制板。
3)   观察运行情况。
5实验结果
通过超声波模块的收发,可以准确的检测3米之内事物到超声波模块的距离。

6实验视频

Arduino连接超声波传感器测距

注:方法已经过时,新方法使用timer去计时,请看https://code.google.com/p/arduino-new-ping/

超声波传感器适用于对大幅的平面进行静止测距。普通的超声波传感器测距范围大概是2cm~450cm,分辨率3mm(淘宝卖家说的,笔者测试环境没那么好,个人实测比较稳定的距离10cm~2m左右,超过此距离就经常有偶然不准确的情况发生了,当然不排除笔者技术问题。)

测试对象是淘宝上面最便宜的SRF-04超声波传感器,有四个脚:5v电源脚(Vcc),触发控制端(Trig),接收端(Echo),地端(GND)


模块工作原理:
  •        采用IO触发测距,给至少10us的高电平信号;
  •        模块自动发送840KHz的方波,自动检测是否有信号返回;
  •        有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340m/s))/2;
电路连接方法:


Arduino程序例子:
  1. const int TrigPin = 2;
  2. const int EchoPin = 3;
  3. float cm;
  4. void setup()
  5. {
  6. Serial.begin(9600);
  7. pinMode(TrigPin, OUTPUT);
  8. pinMode(EchoPin, INPUT);
  9. }
  10. void loop()
  11. {
  12. digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
  13. delayMicroseconds(2);
  14. digitalWrite(TrigPin, HIGH);
  15. delayMicroseconds(10);
  16. digitalWrite(TrigPin, LOW);

  17. cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
  18. cm = (int(cm * 100.0)) / 100.0; //保留两位小数
  19. Serial.print(cm);
  20. Serial.print("cm");
  21. Serial.println();
  22. delay(1000);
  23. }
复制代码




Arduino教程(提高篇)——SR04超声波类库的使用
SR04是最常见的超声波传感器之一,价格便宜,好用,是arduino开发的必备良品~


其工作原理如下
  •        采用IO触发测距,给至少10us的高电平信号;
  •        模块自动发送840KHz的方波,自动检测是否有信号返回;
  •        有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.距离=(高电平时间*声速(340m/s))/2;


下面使用的是arduino官方推荐的SR04超声波传感器类库
  •        将附件下载后解压到arduinoIDE下的libraries文件夹即可,如下图

  •        打开ArduinoIDE,选择SR04例程


  •        打开后即可见到如下程序
  1. #include "SR04.h"
  2. #define TRIG_PIN 2
  3. #define ECHO_PIN 3
  4. SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
  5. long a;
  6. void setup() {
  7. Serial.begin(9600);
  8. Serial.println("Example written by Coloz From Arduino.CN");
  9. delay(1000);}
  10. void loop() {
  11. a=sr04.Distance();
  12. Serial.print(a);
  13. Serial.println("cm");
  14. delay(1000);}
复制代码
  •        如下连接你的超声波传感器
#define TRIG_PIN 2
#define ECHO_PIN 3

TRIG接到arduino的第二脚
ECHO接到arduino的第三脚
VCC、GND接上
  •        打开串口调试,即可看到效果了


最后提供一个不用库直接驱动SR04的程序(上面库,就是把这个程序封装了一次)
  1. const int TrigPin = 2;
  2. const int EchoPin = 3;
  3. float cm;
  4. void setup()
  5. {
  6. Serial.begin(9600);
  7. pinMode(TrigPin, OUTPUT);
  8. pinMode(EchoPin, INPUT);
  9. }
  10. void loop()
  11. {
  12. //发一个10ms的高脉冲去触发TrigPin
  13. digitalWrite(TrigPin, LOW);
  14. delayMicroseconds(2);
  15. digitalWrite(TrigPin, HIGH);
  16. delayMicroseconds(10);
  17. digitalWrite(TrigPin, LOW);

  18. cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
  19. cm = (int(cm * 100.0)) / 100.0; //保留两位小数
  20. Serial.print(cm);
  21. Serial.print("cm");
  22. Serial.println();
  23. delay(1000);
  24. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:471632 发表于 2019-4-23 20:47 | 只看该作者
就是不知道那个58是怎么来的?
回复

使用道具 举报

板凳
ID:538902 发表于 2019-5-15 15:00 | 只看该作者
这个可以有
回复

使用道具 举报

地板
ID:281512 发表于 2019-8-21 14:56 | 只看该作者
好全啊    谢谢分享
回复

使用道具 举报

5#
ID:710934 发表于 2020-4-29 17:40 | 只看该作者
tigerzq 发表于 2019-4-23 20:47
就是不知道那个58是怎么来的?

pulseIn()单位为微秒,声速344m/s,所以距离cm=344*100/1000000*pulseIn()/2约等于pulseIn()/58.0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表