如何使用HC-SR04超声波传感器,Arduino和Millis()检测对象

障碍物检测适用于从初始位置移动到目标位置的任何机器人避免其路径中的任何障碍。检测障碍物的过程适用于各种机器人,包括移动机器人和机器人臂。在本教程中,您将学习如何使用带有Arduino的HC-SR04传感器板并在某些条件下确定传感器的检测范围。

不同的项目可能有不同的要求。在本教程结束时,您将具有一个灵活的结构,可用于不同的机器人,并可以添加更多传感器,或仅使用一个传感器,或者使用其他类型的传感器(例如,红外传感器)。

如果您计划以富有成效和专业的方式构建高级机器人,这是您可以启动的重点。

在开始连接传感器并写第一行代码之前,让我们确定我们拥有所有硬件部件。以下是我用来编写教程的硬件列表:

  • 1 x arduino uno
  • 1 x USB电缆
  • 1 x HC-SR04
  • 1 x面包板
  • 女性到女性/男性到男性/女性到男性跳线电线

1.使用Arduino读取HC-SR04输出

在本文的这一部分中,我将向您展示如何将一个HC-SR04传感器连接到Arduino并写下读取和转换传感器的输出的Arduino草图。

目前,我使用USB电缆为Arduino UNO供电。个人计算机或笔记本电脑的5V USB端口提供足够的电源来运行5V Arduino和三个超声波传感器。

上面的设置只是为了连接和测试超声波声检测系统。当传感器和Arduino板将安装在移动机器人上时,整个检测系统将在电池上运行。

1.1将传感器连接到Arduino

首先,让我们看看HC-SR04规格:

  • 工作电压:DC 5V
  • 工作电流:15mA
  • 工作频率:40kHz
  • 范围:从2cm到4米
  • 测距准确度:3mm
  • 触发输入信号:10μsttl脉冲

传感器的工作电压与Arduino 5V输出引脚相同–DC 5V。超声波传感器的工作电流为15mA,即使它连接到计算机的USB端口,也可以由Arduino支持。 Arduino UNO的5V输出引脚适用于USB上的〜400 mA,使用外部电源适配器时〜900 mA。在此步骤中,我们将仅考虑这两种规格并开始将传感器连接到电路板。

对于连接,我使用女性到男性跳线,面包板,一个HC-SR04和Arduino Uno板。

连接:

  • Vcc -> breadboard -> 5V
  • Trig -> pin 3 (digital pin)
  • Echo -> pin 2 (digital pin)
  • GND -> breadboard -> GND
HC-SR04传感器连接到Arduino Uno

HC-SR04传感器连接到Arduino Uno

1.2写入传感器的代码样本

一旦传感器连接到Arduino板,我们就可以开始写草图以读取输出并从传感器转换读数。为了写下草图,我使用Arduino IDE。我喜欢使用简单的工具,不要花时间在自定义和配件上。暂时,Arduino IDE在编程微控制器方面满足我的需求。

在编写第一行代码之前,让我们重新制作超声波传感器的工作原理。

它引起了声波(根据规格至少10US),它通过空气传播,如果有一个物体反射声波,则传感器测量Ping返回接收器的时间。为了计算传感器和检测到的对象之间的距离,我们考虑行程时间和声音的速度。

信息:根据温度,声音通过不同的速度移动空气。由于我们正在使用声音的速度来测量Ping返回接收器的时间,因此环境温度会影响超声波传感器的精度。温度补偿不是本教程的一部分,但您可以在稍后在代码中添加它。

让我们开始建立我们的超声波传感器测量素描:

距离测量素描结果

距离测量素描结果

一旦传感器连接到Arduino并且输出以厘米变换,我们就可以继续并进行测试以确定传感器的范围。

2. HC-SR04的操作检测范围

我们的目标是,无论物体的形状或大小如何,都可以检测传感器前面的特定区域中的所有物体。因为最终,我们计划使用该传感器进行对象检测,首先我们必须确定一个传感器的操作检测范围。接下来,我们必须计算如何定位每个传感器单元以在检测对象的最大效率。

物体目标的大小,形状和方向影响可以检测到它的最大距离。例如,圆形物体或吸音材料如织物反射较少的能量或者没有直接回到传感器。超声波传感器不受光学特性的影响,例如颜色,反射率,透明度或非透明度。而且,可以从任何方向引入检测区域的物体。

笔记:我在嘈杂的环境中进行了测试,我使用统治者和一个纸质议程,这是一个可以很容易可检测的对象。我没有’T确实在具有圆形的物体上测试,这些物体在所有方向上偏转的大部分回声。请不要 ’忘记这只是一个测试,可能有结果不是非常准确的。

确定HC-SR04超声波传感器范围的第一步是决定机器人所需的范围。让我解释一下它的意思!

例如,我有一个2WD移动机箱,我想用它来检测和避免障碍物。我从规范中知道HC-SR04传感器的范围在2到400厘米之间。

我用一个传感器进行了测试,结果是在5厘米以下,传感器不得可靠测量。 5cm是从传感器头开始的最小检测范围。 0cm和5cm之间的区域面积应被视为盲区。

下一步是确定我们需要应用程序的操作检测范围。这是传感器可以在始终以高精度中进行检测或测量的范围。如果我们搜索规格,我们可以看到400厘米的最大检测范围。在这种情况下,无法考虑此范围。当所有条件对最佳方式非常好时,这些值最可能是拍摄的。在真实的应用中,我们正在使用不同的温度和湿度的嘈杂环境中使用传感器。

信息:如果传感器非常接近物体,小于3厘米,则会注意到传感器返回的距离的一些奇怪值。这种行为是当传感器不会检测到第一回波但可以检测到第二或第三回波的情况,该第二或第三回波被翻译为比实际值更长的距离。

HC-SR04不是高精度的传感器,但足以使用它来学习如何构建机器人。因此,我考虑了100厘米的操作检测范围–在传感器前面1米。此范围足以了解如何使用DIY组件构建自主移动机器人并在起居室区域测试。

HC-SR04操作检测范围

HC-SR04操作检测范围

HC-SR04的超声波束角通常为10-15度和圆锥形。我在上面的图片中添加了当传感器精度高的最佳值在5到100厘米的范围内。

目前,我们检测到物体并知道操作检测范围。在本教程的下一部分中,我将向您展示如何编写类并构建可在不同机器人中使用的灵活结构,并可以添加更多传感器。

3.在标签中构建类

每个类都将在Arduino IDE中有一个标签。使用标签允许我们更好地组织。该类将用扩展文件写入文件中。H.

步骤1:要在Arduino IDE中创建一个新选项卡,请转到右上角,然后按按钮1.然后从菜单2中选择“新标签“:

创建一个新标签以编写课程

创建一个新标签以编写课程

第2步:在IDE的下半部分,应该出现一个新的领域。在此字段中,我们编写新文件的名称。对于第一个选项卡,类型“范围” –我们将为范围检测传感器存储类的文件–然后按OK按钮。

范围

范围

第3步:此时,您应该在您的Arduino IDE中看到这样的标签:

标签范围

标签范围

按照步骤1和2,为类计时器创建一个新选项卡。标签名称是timer.h..

TIMER.H.

TIMER.H.

从本文中开始,我们将在这三个标签上工作。
具有主和循环的第一个选项卡 - “Ultrasonic_sensors_to_detect_obstacles.”。在范围内.H选项卡已写入超声波传感器的类,并且在Timer.h中是计时器类。

让我们在三个选项卡中的每个选项卡中看到代码:

3.1 Ultrasonic_sensors_to_detect_obstacles.

Ultrasonic_sensors_to_detect_obstacles.

Ultrasonic_sensors_to_detect_obstacles.

第11-12行我们导入我们所需的课程。

第15-16行:我们正在使用面向对象的编程,我们必须实例化范围计时器班级es创建对象和类的实例。

第19行:我们处于设置功能,我们所做的第一件事是打开串行端口并将数据速率设置为9600 BPS。

第23行和27号线:我们检查时间并每50毫秒发布。

3.2范围

标签范围

标签范围

第1-2和68行:防止标题的多个包括。它检查是否有一个唯一的价值范围被定义为。那么如果它’没有定义,它定义范围并继续与页面的其余部分继续。

第4行:我们导入我们的计时器班级。

第6行: Tm值 对象是从类计时器创建的。

第9-14行:枚举传感器的状态。我们开始取消激活触发器引脚,然后激活触发器,最后,我们激活回声引脚以返回脉冲的持续时间。

第22-27行:班级的构造函数范围。在构造函数中定义了引脚和销的模式。

第29-54行:我使用Switch语句来选择传感器的一个逐个状态。在第一种情况下trig_low.,确保触发引脚较低,然后在我们切换到后两毫秒Trig_high. –传感器的第二个状态。

如果是Trig_high.,请确保触发引脚高,并且直到切换到下一个状态,直到1毫秒echo_high..

如果是echo_high.,确保触发引脚较低,读取脉冲的持续时间,将下一个状态设置为trig_low.,并以厘米从传感器读数转换。

第57-65行:在课程的私有部分中添加了两个功能。一个函数是将触发状态更改为低电平,第二个功能将触发状态更改为高。

3.3 TIMER.H.

TIMER.H.

TIMER.H.

第1,2和21行: 防止标题的多个包括。它检查是否有一个唯一的价值timer.h.被定义为。那么如果它’没有定义,它定义timer.h.并继续与页面的其余部分继续。

第4-5行:在类的私有部分中,定义启动变量的时间。

第8-10行:开始计数时间的功能 Millis()。我更喜欢使用Millis()代替延迟()从两个原因起:Millis()比它更准确延迟(),并且是一个非阻塞的替代方案延迟().

第12-18行:做同样的两种功能,检查时间是否通过并返回真的。根据情况,我们称之为两个功能之一。

编译并将草图上传到Arduino。

经历本教程后,您了解如何使用Millis(),如何构建类,确定检测范围,并打印超声波传感器的输出。

1条评论» Write a comment

  1. 伟大的教程…而不是使用millis()为什么不’你使用micros()吗? Millis()计数ms,<2 ms or 2) {
    Curstate = Trighigh;
    timstart = sys;
    }
    休息;
    案例三脚:
    Trigpin(1);
    如果(sys.– timStart >10){
    Curstate = Echohohigh;
    timstart = sys;
    }
    休息;
    案例echohigh:
    Trigpin(0);
    定时=脉冲蛋白(echopin,高);
    Curstate = Triglow;
    休息;
    }
    serial.print(“测量的距离是:“);
    serial.print(定时/ 29/2);
    serial.println(” cm”);
    }

发表评论

您的电子邮件地址不会被公开。必需的地方已做标记*