风筝
发表于: 2022-6-24 14:50:30 | 显示全部楼层

使用HC-SR04超声波距离传感器为您的下一个Arduino项目提供强大的功能,该传感器可以检测最远13英尺范围外的物体。当你试图拯救你的机器人免于撞墙时,这是一件好事。


它们功耗低(适用于电池供电的设备)、价格合理、易于连接,非常受电子爱好者欢迎。


什么是超声波?

超声波是一种高频声波,其频率超过人类听觉的可听范围。

Ultrasonic-Frequency-Range-Spectrum.png


人类可以听到每秒振动约20次(低沉的隆隆声)到每秒20,000次(高音哨声)的声波。然而,超声波的频率超过20,000 Hz,因此人类听不见。


HC-SR04传感器硬件概述

HC-SR04超声波距离传感器实际上由两个超声波换能器组成。一个充当发射器,将电信号转换为40 KHz的超声波脉冲。另一个充当接收器并监听传输的脉冲。


当接收器接收到这些脉冲时,它会产生一个输出脉冲,其宽度与前面物体的距离成正比。该传感器在2厘米至400 厘米(~13 英尺)之间提供出色的非接触式范围检测,精度为3毫米。


由于它的工作电压为5V,因此可以直接连接到Arduino或任何其他5V逻辑微控制器。


以下是详细的规格参数:

●    工作电压:DC 5V

●    工作电流:15mA

●    工作频率:40KHz

●    最大范围:4m

●    最小范围: 2cm

●    测距精度: 3mm

●    测量角度:15度

●    触发输入信号: 10µS TTL 脉冲

●    尺寸: 45 x 20 x 15mm


HC-SR04 超声波传感器引脚排列

让我们来看看它的引脚排列。

HC-SR04-Ultrasonic-Distance-Sensor-Pinout.jpg


VCC 为HC-SR04超声波传感器供电。您可以将其连接到Arduino的5V输出。

Trig 引脚用于触发超声波脉冲。通过将此引脚设置为高电平10µs,传感器启动超声波脉冲串。

Echo 回波引脚,发射超声波脉冲串时,回波引脚变为高电平并保持高电平,直到传感器接收到回波,之后变为低电平。通过测量 Echo 引脚保持高电平的时间,可以计算出距离。

GND 是接地引脚。将其连接到Arduino的接地端。


HC-SR04超声波测距传感器如何工作?

当触发引脚设置为高电平10µs时,这一切都开始了。作为响应,传感器以40kHz发射8个脉冲的超声波脉冲串。这种8脉冲模式是专门设计的,以便接收器可以将发射的脉冲与环境超声波噪声区分开来。这8个超声波脉冲穿过空气远离发射器。同时,回波引脚变为高电平以启动回波信号。


如果这些脉冲没有被反射回来,则回波信号超时并在38毫秒后变低。因此,38ms的脉冲表明传感器范围内没有障碍物。

HC-SR04-Ultrasonic-Sensor-Working-Echo-when-no-Obstacle.gif


如果这些脉冲被反射回来,一旦接收到信号,回波引脚就会输出地电平。这会在回波引脚上产生一个脉冲,其宽度从150µs到25ms 不等,具体取决于接收信号所用的时间。

HC-SR04-Ultrasonic-Sensor-Working-Echo-reflected-from-Obstacle.gif


计算距离

接收到的脉冲宽度用于计算与反射物体的距离。这可以使用我们在高中学习的简单距离-速度-时间方程来计算。记住方程式的一种简单方法是将字母放在三角形中。

Distance-Speed-Time-Formula-Triangle.png


让我们举个例子来更清楚地说明。假设我们在传感器前面有一个未知距离的物体,我们在回波引脚上接收到一个500µs宽度的脉冲。现在让我们计算物体离传感器的距离。为此,我们将使用以下等式。

距离 = 速度 x 时间


这里我们有时间值,即500µs,我们知道速度。当然是音速!它是340米/秒。为了计算距离,我们需要将声速转换为厘米/微秒。它是0.034厘米/微秒。有了这些信息,我们现在可以计算距离!

距离 = 0.034 cm/µs x 500 µs


但我们还没有完成!请记住,回波脉冲表示信号发送和反射回来所需的时间。因此,要获得距离,您必须将结果除以二。

距离 = (0.034 cm/µs x 500 µs) / 2

距离 = 8.5 厘米


现在我们知道物体距离传感器8.5厘米。


将HC-SR04传感器连接到Arduino

现在我们已经完全了解了HC-SR04超声波传感器的工作原理,我们可以开始将它连接到Arduino!


将HC-SR04连接到Arduino非常简单。首先将传感器放在面包板上。将VCC引脚连接到Arduino的5V引脚,将GND引脚连接到接地引脚。现在将Trig和Echo引脚分别连接到数字引脚#9 和#10。


完成后,您应该有一些类似于下图所示的内容。

Arduino-Wiring-Fritzing-Normal-Mode-Connections-with-HC-SR04-Ultrasonic-Sensor.jpg


安装库文件

手动触发超声波传感器并测量接收到的信号脉冲宽度需要做很多工作,但幸运的是,我们可以使用许多库。其中比较流行的库是NewPing库。这是我们将在示例中使用的库。


NewPing库非常先进。它一次最多支持15个超声波传感器,可以直接以厘米、英寸或时间段为单位输出。


该库不包含在 Arduino IDE 中,因此您需要先安装它。要安装库,请导航至 Sketch > Include Libraries > Manage Libraries... 等待库管理器下载库索引并更新已安装库的列表。


通过输入“newping”过滤您的搜索。单击第一个条目,然后选择安装。

NewPing-Library-Installation.jpg


Arduino示例代码

这是一个简单的草图,它使用串口监视器显示以厘米为单位的距离。在我们开始对其进行详细分析之前,请先尝试一下这个草图。

  1. // Include NewPing Library
  2. #include "NewPing.h"

  3. // Hook up HC-SR04 with Trig to Arduino Pin 9, Echo to Arduino pin 10
  4. #define TRIGGER_PIN 9
  5. #define ECHO_PIN 10

  6. // Maximum distance we want to ping for (in centimeters).
  7. #define MAX_DISTANCE 400        

  8. // NewPing setup of pins and maximum distance.
  9. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

  10. void setup() {
  11.         Serial.begin(9600);
  12. }

  13. void loop() {
  14.         Serial.print("Distance = ");
  15.         Serial.print(sonar.ping_cm());
  16.         Serial.println(" cm");
  17.         delay(500);
  18. }
复制代码

上传草图后,打开串口监视器,将波特率设置为9600 bps。尝试将传感器指向您周围的物体。您应该看到测量的距离开始输出。

HC-SR04-Ultrasonic-Sensor-Arduino-Distance-Measurement-Sketch-Output-Serial-Monitor.jpg


代码说明

首先包含新安装的NewPing库。

  1. #include "NewPing.h"
复制代码

然后定义HC-SR04模块的Trig和Echo引脚连接到的Arduino引脚。我们还定义了一个名为MAX_DISTANCE的常量。它将设置一个最大距离,超过该距离的脉冲认为是没有物体。MAX_DISTANCE当前设置为 400 [默认 = 500cm]。

  1. #define TRIGGER_PIN 9
  2. #define ECHO_PIN 10
  3. #define MAX_DISTANCE 400
复制代码

在此之后,创建了一个NewPing 库实例sonar。

  1. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
复制代码

在setup()函数中,我们初始化与计算机的串口通信。

  1. void setup() {
  2.         Serial.begin(9600);
  3. }
复制代码

在loop()函数中,我们只需调用ping_cm()函数并在串口监视器上打印结果。此函数发送ping并返回以厘米为单位的距离。

  1. void loop() {
  2.         Serial.print("Distance = ");
  3.         Serial.print(sonar.ping_cm());
  4.         Serial.println(" cm");
  5.         delay(500);
  6. }
复制代码

NewPing库中的其他有用函数

有一些有用的函数可以用于NewPing对象。


●  上面的代码返回以厘米为单位距离。如果您希望结果以英寸为单位,请使用 sonar.ping_in() 函数。

  1. Serial.print(sonar.ping_in());
复制代码

●  上面的草图只有一厘米的分辨率。如果您想获得十进制形式的结果,您可以在持续时间模式而不是距离模式下使用NewPing。您需要将下面这行代码:

  1. Serial.print(sonar.ping_cm());
复制代码

线更改为:

  1. Serial.print((sonar.ping() / 2) * 0.0343);
复制代码

●  NewPing库中有一个名为ping_median(iterations) 的方法可以提高HC-SR04的准确性。该函数进行多次测量而不是一次测量,并丢弃超出范围的读数,然后平均剩余读数。默认情况下,它只需要5个读数,但您可以指定任意数量。

  1. int iterations = 5;
  2. Serial.print((sonar.ping_median(iterations) / 2) * 0.0343);
复制代码

跳转到指定楼层
风筝
发表于: 2022-6-24 15:20:35 | 显示全部楼层

Arduino项目 - 非接触式测距仪

让我们制作一个简易项目来演示如何将简单的超声波传感器变成复杂的非接触式测距仪。在这个项目中,我们将使用一个1602字符型LCD,它显示一个水平条来表示与对象的距离。


硬件接线

接下来,我们需要如下所示连接到LCD显示屏。

Arduino-Wiring-Fritzing-Connections-with-HC-SR04-Ultrasonic-Sensor-and-16x2-LCD.jpg


安装库

在我们上传代码并开始使用传感器之前,我们需要安装一个名为LCDBarGraph的库。该库将有助于在LCD上绘制水平条,其中条的长度将表示到对象的距离。


要安装库,请导航至Sketch > Include Libraries > Manage Libraries... 等待库管理器下载库索引并更新已安装库的列表。通过输入“lcdbargraph”过滤您的搜索。单击第一个条目,然后选择安装。

LCDBarGraph-Library-Installation.jpg


Arduino代码

安装库后,请上传以下草图。

  1. // includes the LiquidCrystal Library
  2. #include <LiquidCrystal.h>

  3. // includes the LcdBarGraph Library
  4. #include <LcdBarGraph.h>

  5. // Maximum distance we want to ping for (in centimeters).
  6. #define max_distance 200

  7. // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
  8. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

  9. LcdBarGraph lbg(&lcd, 16, 0, 1); // Creates an LCD Bargraph object.

  10. const int trigPin = 9;
  11. const int echoPin = 10;
  12. long duration;
  13. int distance;

  14. void setup()
  15. {
  16.         lcd.begin(16,2); // Initializes the interface to the LCD screen
  17.         
  18.         pinMode(trigPin, OUTPUT);
  19.         pinMode(echoPin, INPUT);
  20. }

  21. void loop()
  22. {
  23.         // Write a pulse to the HC-SR04 Trigger Pin
  24.         digitalWrite(trigPin, LOW);
  25.         delayMicroseconds(2);
  26.         digitalWrite(trigPin, HIGH);
  27.         delayMicroseconds(10);
  28.         digitalWrite(trigPin, LOW);
  29.         
  30.         // Measure the response from the HC-SR04 Echo Pin
  31.         duration = pulseIn(echoPin, HIGH);
  32.         
  33.         // Determine distance from duration
  34.         // Use 343 metres per second as speed of sound
  35.         distance= duration*0.034/2;
  36.         
  37.         // Prints "Distance: <value>" on the first line of the LCD
  38.         lcd.setCursor(0,0);
  39.         lcd.print("Distance: ");
  40.         lcd.print(distance);
  41.         lcd.print(" cm");

  42.         // Draws bargraph on the second line of the LCD
  43.         lcd.setCursor(0,1);
  44.         lbg.drawValue(distance, max_distance);
  45.         delay(500);
  46. }
复制代码

代码的输出看起来像这样。

HC-SR04-Ultrasonic-Sensor-Arduino-Distance-Measurement-Bargraph-Output-on-16x2-LCD.jpg


代码说明

首先,您必须像往常一样设置LiquidCrystal库。接下来,使用您刚刚创建的LiquidCrystal实例创建一个LcdBarGraph实例。您应该将LiquidCrystal引用到LcdBarGraph的构造函数。


LcdBarGraph的构造函数需要另外三个参数。第二个是LCD中字符列的编号(在我们的例子中是 16)。最后两个参数是可选的,允许自定义定位条。

  1. // creating bargraph instance
  2. LcdBarGraph lbg(&lcd, 16, 0, 1);
复制代码

在计算与传感器的距离后,我们使用 drawValue(value, maxValue) 函数来显示条形图。它绘制一个值介于0和maxValue之间的条形图。

  1. //display bargraph
  2. lbg.drawValue(distance, max_distance);
复制代码

采用3线模式连接HC-SR04

当您的Arduino上的数字I/O引脚数量有限时,您可以利用3线引脚模式。通常,当您将HC-SR04传感器连接到Arduino时,您需要两个I/O引脚。然而,在3线模式下,您只需要一个I/O引脚而不是两个。


在这种模式下,单个I/O引脚同时用作输入和输出。这是可能的,因为没有同时使用Trig和Echo。


以下就是使用3线模式将HC-SR04传感器连接到Arduino的方法。

Arduino-Wiring-Fritzing-3-Wire-Mode-Connections-with-HC-SR04-Ultrasonic-Sensor.jpg


您所要做的就是将TRIG和ECHO引脚都连接到数字引脚#9,并将代码中的两个引脚值定义为引脚 9。其余代码相同。

  1. #define TRIGGER_PIN 9 // Trigger and Echo both on pin 9
  2. #define ECHO_PIN 9
复制代码

有哪些不足?

HC-SR04超声波传感器在准确度和整体可用性方面非常出色,尤其是与其他低成本超声波传感器相比。这并不意味着HC-SR04传感器总是很好的工作。下图显示了HC-SR04的一些不足之处:


●    传感器与物体/障碍物之间的距离大于13英尺时无法测量。

HC-SR04-Limitation-cannot-measure-distance-more-than-13-feet.png


●    物体的反射表面角度较浅,因此声波不会反射回传感器。

HC-SR04-Limitation-cannot-detect-object-at-a-shallow-angle.png


●    物体太小,无法将足够的声波反射回传感器。此外,如果您的HC-SR04传感器安装在设备的较低位置,您可能会监听到地板反射的声波。

HC-SR04-Limitation-cannot-detect-small-objects.png


●    某些表面柔软或不规则的物体(例如毛绒玩具)会吸收声波,而非反射声波,因此HC-SR04传感器可能无法检测到此类物体。

HC-SR04-Limitation-cannot-detect-soft-irregular-surface-object.png


回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-19 22:47 , Processed in 0.133472 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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