登录    注册      
    
  

News Message

超声波传感器



超声波传感器



使用HC-SR04超声波距离传感器为您的下一个Arduino项目提供强大的功能,该传感器可以报告最远13英尺远的物体范围。如果您要避免机器人撞墙,那是非常有用的信息!它们具有低功耗(适用于电池供电的设备),价格低廉,易于连接以及在业余爱好者中疯狂流行的特点。另外,它甚至看起来很酷,就像一双Wall-E机器人的眼睛注视着您的最新机器人发明!

什么是超声波?

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


人耳可以听到的声波振动范围从每秒20次左右(隆隆的隆隆声)到每秒20,000次左右(尖锐的啸叫声)。但是,超声波的频率超过20,000 Hz,因此人类听不到。

HC-SR04硬件概述

HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器,将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们,它将产生一个输出脉冲,其宽度可用于确定脉冲传播的距离。就是如此简单!

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

以下是完整的规格:

Operating Voltage工作电压直流5V
Operating Current工作电流15毫安
Operating Frequency运行频率40K赫兹
Max Range最大范围4m
Min Range最小范围2厘米
Ranging Accuracy测距精度3毫米
Measuring Angle测量角度15度
Trigger Input Signal触发输入信号10µS TTL脉冲
Dimension尺寸45 x 20 x 15毫米


HC-SR04超声波传感器引脚

让我们看一下它的引脚排列。

VCC 是HC-SR04超声波距离传感器的电源,我们连接了Arduino上的5V引脚。

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

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

GND 应该连接到Arduino的地。

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

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

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

如果这些脉冲没有被反射回来,则回波信号将在38毫秒(38毫秒)后超时并返回低电平。因此38 ms的脉冲表示在传感器范围内没有阻塞。



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

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

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

距离=速度x时间

在这里,我们的时间值为500 µs,我们知道速度。我们有什么速度?声音的速度,当然!其340 m / s。为了计算距离,我们必须将声速转换为cm / µs。Google快速搜索“以厘米/微秒为单位的声音速度”时,它会显示为0.034 cm / µs。您可以进行数学运算,但搜索更为容易。无论如何,有了这些信息,我们就可以计算出距离!

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

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

距离=(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 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);
}

在串行监视器上输出

代码说明:

上面的草图很简单,效果很好,但是分辨率只有1厘米。如果要恢复小数点值,可以在持续时间模式而不是距离模式下使用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接口


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

将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);
}

这就是输出的样子。

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-Wire模式是您只需要一个连接到单个Arduino数字I / O引脚的连接,而不是两个。如果您不知道,有很多超声波传感器只能在3线模式下运行,例如超赞的视差ping)))传感器

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

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


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

如您所见,您需要做的就是将触发器和回声都连接到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* 温度)+(0.0124 * 湿度)



Share Http URL:  http://www.wittx.cn/get_news_message.do?new_id=799



请输入评论