超声波传感器

作者:头像   周建锋   |   贡献者:   hardihuang   Sunny   

HC-SR04 超声波传感器如何工作并与 Arduino 连接 #

使用 HC-SR04 超声波距离传感器为您的下一个 Arduino 项目提供动力,该传感器可以报告最远 13 英尺远的物体范围。如果你想避免你的机器人撞墙,这真是个好信息!它们功耗低(适用于电池供电的设备)、价格低廉、易于连接并且在爱好者中非常受欢迎。作为奖励,它甚至看起来很酷,就像您最新机器人发明的一双 Wall-E 机器人眼睛!

什么是超声波?

超声波是频率高于人类听觉听觉极限的高频声波。

超声波频率范围谱

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

HC-SR04 硬件概述 #

HC-SR04 超声波距离传感器的核心由两个超声波换能器组成。一个充当发射器,将电信号转换为 40 KHz 的超声波脉冲。接收器侦听传输的脉冲。如果它接收到它们,它会产生一个输出脉冲,其宽度可用于确定脉冲行进的距离。像馅饼一样简单!

该传感器体积小,易于在任何机器人项目中使用,并提供 2 厘米至 400 厘米(约 1 英寸至 13 英尺)的出色非接触范围检测,精度为 3 毫米。由于它在 5 伏电压下工作,因此可以直接连接到 Arduino 或任何其他 5V 逻辑微控制器。

以下是完整的规格:

工作电压直流5V
工作电流15mA
工作频率40KHz
最大范围4米
最小范围2厘米
测距精度3mm
测量角度15度
触发输入信号10µS TTL 脉冲
尺寸45 x 20 x 15 毫米

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

我们来看看它的Pinout。

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

电压互感器 是 HC-SR04 超声波距离传感器的电源,我们将其连接到 Arduino 上的 5V 引脚。

触发(触发器) 引脚用于触发超声波脉冲。

回声当接收到反射信号时,引脚会产生一个脉冲。脉冲的长度与检测到传输信号所用的时间成正比。

地线 应该连接到Arduino的地。

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

当一个持续时间至少为 10 µS(10 微秒)的脉冲施加到触发引脚时,一切就开始了。作为响应,传感器以 40 KHz 的频率传输 8 个脉冲的声波。这种 8 脉冲模式使来自设备的“超声波特征”独一无二,使接收器能够将传输模式与环境超声波噪声区分开来。

八个超声波脉冲在空气中远离发射器传播。同时,Echo 引脚变为高电平以开始形成回声信号的开头。

如果这些脉冲没有被反射回来,那么回声信号将在 38 毫秒(38 毫秒)后超时并返回低电平。因此,一个 38 毫秒的脉冲表示传感器范围内没有障碍物。

HC-SR04 超声波传感器工作 - 无障碍时回声

如果这些脉冲被反射回来,一旦接收到信号,Echo 引脚就会变低。这会产生一个宽度在 150 µS 到 25 mS 之间变化的脉冲,具体取决于接收信号所用的时间。

HC-SR04 超声波传感器工作 - 障碍物反射回波

然后使用接收到的脉冲宽度来计算到反射物体的距离。这可以使用我们在高中学到的简单的距离-速度-时间方程来计算。如果您忘记了,记住距离、速度和时间方程的一种简单方法是将字母放入三角形中。

距离速度时间公式三角形

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

距离 = 速度 x 时间

在这里,我们有时间值,即 500 µs,我们知道速度。我们有什么速度?当然是音速!其 340 m/s。我们必须将声速转换为 cm/µs 才能计算距离。在 Google 上快速搜索“以厘米/微秒为单位的声速”会说它是 0.034 厘米/微秒。你可以做数学,但搜索它更容易。不管怎样,有了这些信息,我们就可以计算出距离了!

距离 = 0.034 厘米/微秒 x 500 微秒

但这还没有完成!请记住,脉冲表示信号发出并反射回来所需的时间,因此为了获得距离,您需要将结果分成两半。

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

距离 = 8.5 厘米

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

接线 – 将 HC-SR04 连接到 Arduino Uno #

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

将 HC-SR04 连接到 Arduino 非常简单。首先将传感器放在面包板上。将 VCC 引脚连接到 Arduino 上的 5V 引脚,并将 GND 引脚连接到 Arduino 上的接地引脚。

完成后,您应该看到类似于下图所示的内容。

带有 HC-SR04 超声波传感器的 Arduino Wiring Fritzing 正常模式连接
将 HC-SR04 超声波传感器连接到 Arduino UNO – 正常模式

所以现在我们已经连接了我们的超声波距离传感器,是时候编写一些代码并进行测试了。

Arduino 代码——使用 NewPing 库 #

我们将使用一个特殊的库,而不是手动触发超声波传感器并测量接收到的信号脉冲宽度。有很多可用的,最通用的是一种叫做“ NewPing ”的。

首先通过访问Bitbucket 存储库下载库,或者只需单击此按钮即可下载 zip:NewPing_v1.9.0.zip

要安装它,请打开 Arduino IDE,转到 Sketch > Include Library > Add .ZIP Library,然后选择您刚刚下载的 NewPing ZIP 文件。如果您需要有关安装库的更多详细信息,请访问此安装 Arduino 库教程。

NewPing 库非常先进,它大大提高了我们原始草图的准确性。它还同时支持多达15个超声波传感器,可以直接以厘米、英寸或持续时间为单位输出。

这是我们重写的草图以使用 NewPing 库:

// This uses Serial Monitor to display Range Finder distance readings

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

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

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

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

void setup() 
{
	Serial.begin(9600);
}

void loop() 
{
	// Send ping, get distance in cm
	distance = sonar.ping_cm();
	
	// Send results to Serial Monitor
	Serial.print("Distance = ");
	
	if (distance >= 400 || distance <= 2) 
	{
		Serial.println("Out of range");
	}
	else 
	{
		Serial.print(distance);
		Serial.println(" cm");
	}
	delay(500);
}
HC-SR04 超声波传感器 Arduino 距离测量草图输出在串行监视器上
串行监视器上的输出

代码说明:

上面的草图很简单,效果很好,但它的分辨率只有一厘米。如果您想恢复小数点值,您可以在持续时间模式而不是距离模式下使用 NewPing。你需要更换这一行

// Send ping, get distance in cm
distance = sonar.ping_cm();

用下面的线

duration = sonar.ping();
distance = (duration / 2) * 0.0343;

为了将您的 HC-SR04 的准确性提高到一个新的水平,NewPing 库中有另一个称为“迭代”的功能。迭代意味着不止一次地重复某件事,而这正是迭代模式所做的。它需要多次持续时间测量而不是一次,丢弃任何无效读数,然后对剩余的读数求平均值。默认情况下需要 5 个读数,但您实际上可以指定任意数量的读数。

int iterations = 5;
duration = sonar.ping_median(iterations);

Arduino项目 #

非接触式测距仪 #

让我们创建一个快速项目来演示如何将简单的超声波传感器变成复杂的非接触式测距仪。在这个项目中,我们将使用一个 16×2 字符 LCD 来显示一个水平条,以图形方式表示与底线上的值的对象的距离。

如果您不熟悉 16×2 字符 LCD,请考虑阅读(至少略读)以下教程。将 16×2 字符 LCD 模块与 Arduino 接口想让您的 Arduino 项目显示状态消息或传感器读数吗?那么这些液晶显示器可能是完美的选择。它们非常常见,而且…

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

带有 HC-SR04 超声波传感器和 16x2 LCD 的 Arduino Wiring Fritzing 连接
将 HC-SR04 超声波传感器和 16×2 LCD 连接到 Arduino UNO

在我们开始上传代码和使用传感器之前,我们需要安装名为LCDBarGraph的库。该库有助于在 LCD 上绘制水平条形图,其中条形的长度与提供的值成正比。

首先通过访问Arduino Playground下载库,或者只需单击此按钮即可下载 zip:LcdBarGraph-1.5.zip

安装库后,请尝试下面的草图。

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

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

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

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

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

const int trigPin = 9;
const int echoPin = 10;
long duration;
int distance;

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

void loop() 
{
	// Write a pulse to the HC-SR04 Trigger Pin
	digitalWrite(trigPin, LOW);
	delayMicroseconds(2);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	
	// Measure the response from the HC-SR04 Echo Pin
	duration = pulseIn(echoPin, HIGH);
	
	// Determine distance from duration
	// Use 343 metres per second as speed of sound
	distance= duration*0.034/2;
	
	// Prints "Distance: <value>" on the first line of the LCD
	lcd.setCursor(0,0);
	lcd.print("Distance: "); 
	lcd.print(distance);
	lcd.print(" cm");

	// Draws bargraph on the second line of the LCD
	lcd.setCursor(0,1);
	lbg.drawValue(distance, max_distance);
	delay(500);
}

这就是输出的样子。

HC-SR04 超声波传感器 Arduino 距离测量条形图输出,16x2 LCD
16×2 字符 LCD 上的条形图输出

代码说明:

首先,您需要像往常一样设置 LiquidCrystal 库。在此之后,您可以使用刚刚创建的 LiquidCrystal 实例创建 LcdBarGraph 实例。您应该将 LiquidCrystal 的引用传递给 LcdBarGraph 的构造函数。

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

// creating bargraph instance
LcdBarGraph lbg(&lcd, 16, 0, 1);

现在一旦我们计算出与传感器的距离,我们就可以使用drawValue(value, maxValue)函数来显示条形图。这将绘制一个值在 0 和 maxValue 之间的条形图。

//display bargraph
lbg.drawValue(distance, max_distance);

HC-SR04 与 3 线模式的接口 #

3 线模式是您只需要一个连接到单个 Arduino 数字 I/O 引脚而不是两个的连接。如果您不知道,有许多超声波传感器只能在 3 线模式下运行,例如令人敬畏的视差 ping))) 传感器

在 3 线模式下,单个 I/O 引脚用作输入和输出。这是可能的,因为从来没有同时使用输入和输出的时间。通过消除一个 I/O 引脚要求,我们可以保存与 Arduino 的连接并将其用于其他用途。当使用像 ATtiny85 这样的 I/O 引脚数量有限的芯片时,它也很有用。

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

Arduino Wiring Fritzing 3 线模式连接与 HC-SR04 超声波传感器
将 HC-SR04 超声波传感器连接到 Arduino UNO – 3 线模式

如您所见,您需要做的就是将触发器和回声连接到 Arduino 引脚 9。请注意,您需要在草图中做的唯一区别是为触发器和回声引脚值定义引脚 9。草图的其余部分是相同的。

#define TRIGGER_PIN 9 // Trigger and Echo both on pin 9
#define ECHO_PIN 9

有哪些限制? #

就精度和整体实用性而言,HC-SR04超声波距离传感器确实很棒,尤其是与其他低成本距离检测传感器相比。这并不意味着 HC-SR04 传感器能够测量“一切”。下图显示了 HC-SR04 无法测量的几种情况:

a) 传感器与物体/障碍物之间的距离超过 13 英尺。

HC-SR04 限制 - 不能测量超过 13 英尺的距离

b) 物体的反射面呈小角度,因此声音不会反射回传感器。

HC-SR04 限制 - 无法以浅角度检测物体

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

HC-SR04 限制 - 无法检测小物体

d) 在对传感器进行试验时,我们发现一些表面柔软、不规则的物体(例如毛绒玩具)会吸收而不是反射声音,因此 HC-SR04 传感器可能难以检测到。

HC-SR04 限制 - 无法检测柔软的不规则表面物体

温度对距离测量的影响 #

尽管 HC-SR04 对于我们的大多数项目(例如入侵者检测或接近警报)来说相当准确;但有时您可能想要设计一种在户外或异常炎热或寒冷环境中使用的设备。如果是这种情况,您可能需要考虑这样一个事实,即空气中的声速随温度、气压和湿度而变化。

由于声速会影响我们的 HC-SR04 距离计算,这可能会影响我们的读数。如果温度 (°C) 和湿度已知,请考虑以下公式:

声速 m/s = 331.4 + (0.606 * Temp) + (0.0124 * Humidity)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注