超声波传感器(HC-SR04)通常用于查找物体到一个特定点的距离。使用Arduino做到这一点相当容易,代码也非常简单。但是在本文中,我们将尝试对这些流行的HC-SR04传感器进行一些尝试。我们将尝试计算两个超声波传感器之间的距离,也就是说,我们将使一个传感器充当发送器,使另一个传感器充当接收器。通过这样做,我们可以使用许多超声波接收器跟踪一个发射器的位置,这种跟踪称为三角测量,可以用于自动对接机器人,行李箱随动装置和其他类似应用。寻找两个美国传感器之间的距离 听起来似乎是一个相当简单的任务,但我面临的挑战很少,本项目对此进行了讨论。
本文讨论的技术不是很准确,并且在未经修改的任何实际系统中可能都不有用。在撰写本文档期间,我没有发现任何人能像我这样接近结果,因此我只是分享了我对如何使其工作的看法,从而使尝试此操作的人们无需重新发明轮子。
所需材料:
- Arduino(2Nos)–任何型号
- HCSR04模块(2号)
电路原理图:
即使我们要使一个美国(超声波)传感器用作发送器,另一个要作为接收器,也必须将传感器的所有四个引脚与Arduino连接。我们为什么要呢?稍后将讨论更多内容,但现在电路图如下
如您所见,发射器和接收器的电路图都相同。还要检查:Arduino超声波传感器接口
HC-SR04模块实际如何工作:
在继续进行任何操作之前,让我们了解HC-SR04传感器的工作原理。下面的时序图将帮助我们理解其工作原理。
传感器具有两个引脚Trigger和Echo,用于测量距离,如时序图所示。首先开始测量,我们应该从发射器发送超声波,这可以通过将触发引脚设置为10uS的高电平来完成。完成此操作后,发射器引脚将发送8个US $声波。此US波将击中一个物体,然后反弹回接收器。
此处的时序图显示,一旦接收器接收到电波,它将使Echo引脚在一段时间内变为高电平,该时间等于电波从US传感器传播并回到传感器所需的时间。该时序图似乎并不正确。
我覆盖了传感器的Tx(发射器)部分,并检查了回波脉冲是否变高,是的,它确实变高了。这意味着回波脉冲不会等待其接收到US(超声波)波。一旦它传输了美国波浪,它就会变高并保持高水平,直到波浪返回。因此正确的时序图应如下所示(抱歉,我的写作技巧很差)
使HC-SR04仅用作发送器:
使HC-SR04仅用作发射器几乎是很直接的。如时序图所示,您必须将触发引脚声明为输出引脚,并使它保持高电平10毫秒。这将启动超声波爆裂。因此,每当我们要发送电波时,我们只需控制发送器传感器的触发引脚,其代码如下。
使HC-SR04仅用作接收器:
如时序图所示,我们无法控制Echo引脚的上升,因为它与触发引脚有关。因此,我们不可能使HC-SR04仅用作接收器。但是,我们可以使用黑客手段,只需用胶带覆盖传感器的发射器部分(如下图所示)或盖住US波不能逸出其发射器外壳,并且Echo引脚将不受此US波影响。
现在要使回波引脚变为高电平,我们只需要将该虚拟触发引脚拉高10微秒即可。一旦此接收器传感器获得了由发射器传感器发送的US波,回波引脚就会变低。
测量两个超声波传感器(HC-SR04)之间的距离:
到目前为止,我们已经了解了如何使一个传感器充当发送器,而另一个传感器充当接收器。现在,我们必须从发射器传感器发射超声波,并通过接收器传感器接收超声波,并检查超声波从发射器传播到接收器所花费的时间很容易,对吗?但可悲的是,我们在这里遇到问题,这将无法解决。
发射器模块和接收器模块相距较远,并且当接收器模块从发射器模块接收到US波时,它将不知道发射器何时发送了此特定波。在不知道开始时间的情况下,我们无法计算所花费的时间以及距离。为了解决此问题,必须在发送器模块已发送US波时使接收器模块的回波脉冲精确变高。换句话说,发送器模块和接收器模块应同时触发。这可以通过以下方法来实现。
在上图中,Tx代表发送器传感器,Rx代表接收器传感器。如图所示,将使发送器传感器以已知的周期性延迟发送US波,这就是它要做的全部。
在接收器传感器中,我们必须以某种方式使触发引脚在发送器引脚变为高电平期间准确地变为高电平。因此,最初我们随机使接收器触发器变为高电平,并一直保持高电平,直到回波引脚变为低电平。仅当它从发射器接收到US波时,此回波引脚才会变为低电平。因此,只要它变低,我们就可以假设变送器传感器刚刚被触发。现在,有了这个假设,只要回声变低,我们就可以等待已知的延迟,然后触发接收器触发。这将部分同步发送器和接收器的触发,因此您可以使用pulseIn()读取即时回波脉冲持续时间并计算距离。
变送器传感器程序:
变送器模块的完整程序可在页面底部找到。它什么也没有做,只是每隔一段时间触发一次发射器传感器。
digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW);
要触发传感器,我们必须使触发引脚保持高电平10uS。上面显示了执行相同操作的代码
接收器传感器程序:
在接收器传感器中,我们已遮盖了传感器的“发射器”孔,使其变得虚假,如前所述。现在我们可以使用上述技术来测量两个传感器之间的距离。完整的程序在本页底部。几条重要的线在下面解释
Trigger_US(); while(digitalRead(echoPin)== HIGH); delayMicroseconds(10); Trigger_US(); 持续时间= pulseIn(echoPin,HIGH);
最初,我们使用函数Trigger_US()触发US传感器,然后使用while循环等待直到回波引脚保持高电平。一旦变低,我们将等待预定的持续时间,该持续时间应在10到30微秒之间,可以通过反复试验确定(或者您可以使用下面给出的即兴想法)。在此延迟之后,使用相同的函数再次触发US,然后使用pulseIn()函数来计算波的持续时间。
现在,使用相同的旧公式,我们可以如下计算距离
距离=持续时间* 0.034;
加工:
按照程序中的说明进行连接。如图所示,覆盖接收器传感器的Tx部分。然后将下面给出的发送器代码和接收器代码分别上传到发送器和接收器Arduino。打开接收器模块的串行监视器,您应该注意到正在显示的两个模块之间的距离,如下视频所示。
注意:此方法只是一种意识形态,可能不准确或不令人满意。但是,您可以尝试下面的即兴创作,以获得更好的结果。
即兴的想法–使用已知距离校准传感器:
到目前为止,奇怪地解释了的方法似乎令人满意,但是对于我的项目来说已经足够了。但是,我也想分享这种方法的缺点以及克服它们的方法。这种方法的一个主要缺点是,我们假设在发送器传感器发送了US波之后,接收器的Echo引脚立即降为低电平,这是不正确的,因为该波从发送器到接收器将花费一些时间。因此,发射器的触发和接收器的触发将不会完全同步。
为了克服这个问题,我们可以最初使用已知距离来校准传感器。如果知道了距离,我们将知道US波从发射机到达接收机所花费的时间。如下所示,让我们将此时间设为Del(D)。
现在我们将确切地知道在多少时间后,我们应该将接收器的触发引脚设置为高电平,以与发送器的触发进行同步。该持续时间可以通过已知延迟(t)– Del(D)计算。由于时间限制,我无法测试该想法,因此我不确定它的准确性如何。因此,如果您碰巧尝试过,请通过评论部分让我知道结果。