使用HC-SR04超声波距离传感器为您的下一个Arduino项目提供动力,可以报告距离最远13cm的物体范围。如果你试图避免你的机器人开车进入墙壁,这是非常好的信息!它们功率低(适用于电池供电设备),价格低廉,易于连接,并且在业余爱好者中非常受欢迎。作为奖励,它甚至看起来很酷,就像一对Wall-E机器人的眼睛,为您的最新机器人发明!
目录
什么是超声波?
超声是高音声波,其频率高于人类听觉的可听限度。
人耳可以听到声波在大约20秒(深沉的隆隆声)到大约每秒20,000次(高音啸声)的范围内振动。然而,超声波的频率超过20,000Hz,因此对人类来说是听不见的。
HC-SR04硬件概述
HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作将电信号转换为40KHz超声波脉冲的发射器。接收器侦听发送的脉冲。如果它接收它们,它产生一个输出脉冲,其宽度可用于确定脉冲行进的距离。
该传感器体积小,易于在任何机器人项目中使用,并提供2厘米至400厘米(约1英寸至13英尺)的精确非接触范围检测,精度为3毫米。由于它工作在5伏特,因此可以直接连接到Arduino或任何其他5V控制器。
以下是完整的规格:
HC-SR04超声波传感器引脚
我们来看看它的Pinout。
VCC是HC-SR04超声波距离传感器的电源,我们连接Arduino上的5V引脚。
Trig(触发器)引脚用于触发超声波声音脉冲。
当接收到反射信号时,Echo引脚产生脉冲。脉冲的长度与检测发送信号所花费的时间成比例。
GND应连接到Arduino的地。
HC-SR04超声波距离传感器如何工作?
当触发引脚上施加至少10μS(10微秒)的脉冲时,一切都会启动。响应于此,传感器以40KHz发射八个脉冲的声音。这种8脉冲模式使得设备有“超声波特征”独特,允许接收器将传输的模式与环境超声波噪声区分开来。
八个超声波脉冲通过发射器发射。同时,Echo引脚变为高电平,开始形成回波信号的开始。
如果这些脉冲没有反射回来,那么Echo信号将在38 mS(38毫秒)后超时并返回低电平。因此,38 mS脉冲表示传感器范围内没有障碍物。
如果这些脉冲被反射回来,一旦接收到信号,Echo引脚就会变为低电平。这会产生一个脉冲,其宽度在150μS到25 mS之间变化,具体取决于接收信号所需的时间。
然后使用接收脉冲的宽度来计算到反射物体的距离。这可以通过简单的距离 – 速度 – 时间方程来计算。如果您忘了,记住距离,速度和时间方程式的简单方法是将字母放入三角形进行计算:
让我们举个例子来说明一点。假设我们在传感器前面有一个未知距离的物体,我们在Echo引脚上接收到宽度为500μS的脉冲。现在让我们计算传感器的物体距离。我们将使用以下等式。
距离=速度x时间
在这里,我们有时间的值,即500μs,我们知道速度。我们的速度有多快?声音的速度,当然!它的速度为340米/秒。为了计算距离,我们必须将声速转换为cm /μs。“以厘米每微秒为单位的声音速度”将表示它是0.034厘米/微秒。无论如何,有了这些信息,我们就可以计算出距离!
距离= 0.034 cm/μsx500μs
但这还没有完成!请记住,脉冲指示信号被发送出去并反射回来所需的时间,以便获得距离,因此,您需要将结果分成两半。
距离=(0.034 cm /μs×500μs)/ 2
距离= 8.5厘米
所以,现在我们知道物体距传感器8.5厘米。
接线 – 将HC-SR04连接到Arduino Uno
现在我们已经完全了解了HC-SR04超声波距离传感器的工作原理,我们可以开始将它连接到我们的Arduino!
将HC-SR04连接到Arduino非常简单。首先将传感器放在面包板上。将VCC引脚连接到Arduino上的5V引脚,并将GND引脚连接到Arduino上的接地引脚。
当你完成后,你应该有类似于下图所示的东西。
现在我们已经连接了超声波距离传感器,现在是时候编写一些代码并进行测试了。
Arduino代码 – 使用NewPing库
我们将使用一个特殊的库来代替触发超声波传感器并手动测量接收信号脉冲宽度。有很多可用的,最通用的是一个叫做“ NewPing ”的库。
首先下载库,只需单击此按钮即可下载zip:
要安装它,请打开Arduino IDE,转到Sketch> Include Library> Add .ZIP Library,然后选择刚刚下载的NewPing ZIP文件。
NewPing库非常先进,它大大提高了我们原始程序的准确性。它还可同时支持多达15个超声波传感器,并可以厘米,英寸或持续时间直接输出。
这是我们的程序,使用的是NewPing库:
上面的程序很简单,效果很好,但只有一厘米的分辨率。如果要恢复小数点值,可以在持续时间模式下使用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);
非接触式测距仪
让我们创建一个快速项目来演示如何将简单的超声波传感器变成一个复杂的非接触式测距仪。在这个项目中,我们将使用一个16×2字符LCD显示一个水平条,以图形方式表示与对象的距离,底线上的值。
如果您不熟悉16×2字符LCD,请考虑在教程下面阅读(至少略读)。
建议阅读:
想要你的Arduino项目显示状态信息,传感器读数,这些LCD显示器可能是……
接下来,我们需要连接到LCD,如下所示。
在我们上传代码并使用传感器之前,我们需要安装名为LCDBarGraph的库。此库有助于在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线模式下运行。
在3线模式下,单个I / O引脚既可用作输入,也可用作输出。这是可能的,因为从来没有使用过输入和输出的时间。通过消除一个I / O引脚要求,我们可以保存与Arduino的连接并将其用于其他方面。当使用像ATtiny85这样具有有限数量的I / O引脚的芯片时,它也很有用。
以下是使用3线模式将HC-SR04传感器连接到Arduino的方法。
如您所见,您需要做的就是将触发器和回波器连接到Arduino引脚9.
请注意,程序中唯一需要做的就是为Trigger和Echo引脚值定义引脚9。程序的其余部分是相同的。
#define TRIGGER_PIN 9 // Trigger and Echo both on pin 9
#define ECHO_PIN 9
有什么限制?
在精度和整体实用性方面,HC-SR04超声波距离传感器非常棒,特别是与其他低成本距离检测传感器相比。这并不意味着HC-SR04传感器能够测量“一切”。下图显示了HC-SR04未设计用于测量的一些情况:
a)传感器与物体/障碍物之间的距离超过13英尺。
b)物体的反射表面呈浅角,因此声音不会被反射回传感器。
c)物体太小,无法将足够的声音反射回传感器。此外,如果您的设备上的HC-SR04传感器安装不足,您可能会检测到地板反射的声音。
d)在对传感器进行试验时,我们发现一些具有柔软,不规则表面的物体(如填充动物)吸收而不是反射声音,因此HC-SR04传感器很难检测到。
温度对距离测量的影响
虽然HC-SR04对于我们的大多数项目来说都是相当准确的,例如入侵者检测或接近警报; 但有时您可能想要设计一种在室外或异常炎热或寒冷的环境中使用的设备。如果是这种情况,您可能需要考虑到空气中声音的速度随温度,气压和湿度而变化的事实。
由于声速因素影响我们的HC-SR04距离计算,这可能会影响我们的读数。如果已知温度(°C)和湿度,请考虑以下公式:
声速m/s = 331.4 +(0.606 * Temp)+(0.0124 * Humidity)
搬运过来也不好好翻译,机翻得奇奇怪怪的,资料还要收费