|
在本篇文章中,我们将主要介绍如何在Arduino Uno开发板中使用超声波传感器HC-SR04。 HC-SR04包含两个部分:超声波发射器和接收器。发射器发出一个40 kHz的突发信号(人类听不到)。如果信号被障碍物反射,则接收器会捕获到信号。因此,HC-SR04可用于距离测量和警报检测系统。 HC-SR04支持每秒50次测量,测量距离在2厘米至300厘米之间。
所需的材料清单: – Arduino Uno开发板 – 跳线 – 超声波传感器模块HC-SR04
如何将HC-SR04连接到Arduino? HC-SR04模块具有四个引脚。模块的Vcc引脚必须与Arduino的5V引脚连接。在本文中,模块的Trig引脚连接到Arduino的数字引脚2,而Echo引脚连接到Arduino的数字引脚3。最后,模块的Gnd引脚连接到Arduino任意一个GND引脚。本文使用了一个小型面包板,因此HC-SR04可以竖着连接到Arduino。
HC-SR04超声波传感器模块与Arduino的连接示意图。
如何编程HC-SR04用于距离测量? 超声波模块用于测量模块与障碍物之间的距离。为了测量距离,模块需要准备好发送40 kHz突发信号。当Trig引脚的信号从高电平变为低电平时,将发送突发信号。此外,HIGH信号必须存在至少10微秒。该模块会在脉冲串信号往返时间的持续时间内在echo引脚上发送一个脉冲。往返时间是从发射器到障碍物以及从障碍物到接收器的时间。幸运的是,pulseIn函数可完美包含该用例。如果第二个参数为高电平,则pulseIn函数将等待引脚变为高电平,开始计时,然后等待引脚变为低电平。 为了得到距离值,持续时间需要除以2,因为只有单向距离是有意义的(从模块到障碍物)。接下来,必须考虑空气的声速,该速度约为每秒343.5米(在20°C的温度下)。由于使用pulseIn函数测量的持续时间以微秒为单位,而我们以cm为单位,因此持续时间必须乘以0.03435。 - const int pinTrigger = 2; // pin for sending out the signal
- const int pinEcho = 3; // pin for receiving the echo of the signal
- long duration = 0; // the roundtrip duration of the signal in us
- void setup() {
- pinMode(pinTrigger, OUTPUT);
- pinMode(pinEcho, INPUT);
- Serial.begin(9600); // open serial connection to print out distance values
- }
- void loop() {
- digitalWrite(pinTrigger, LOW); // turn off the trigger
- delayMicroseconds(3);
- noInterrupts(); // disable interrupts as they might interfere with the measurement
- digitalWrite(pinTrigger, HIGH);// prepare to send "trigger" command to module
- delayMicroseconds(10); // wait for 10us (module sends signal only, if trigger had a HIGH signal for at least 10 us)
- digitalWrite(pinTrigger, LOW); // module sends signal now
- duration = pulseIn(pinEcho, HIGH); // waiting for a HIGH signal on the echo pin.
- interrupts(); // enable interrupts, we are done with the measurement
-
- // from roundtrip duration to distance:
- long durationOneWay = duration / 2; // divided by two, since duration is a roundtrip signal
- // acoustic velocity of air at a temperature of 20°C => ~343.5 m/s
- // => 0.03435 cm/us
- long distance = durationOneWay * 0.03435; // distance in cm
- Serial.print("Distance[cm]: ");
- Serial.println(distance);
-
- delay(500); // wait for 500ms (added only for debugging reasons)
- }
复制代码
将代码上传到Arduino后,则串口监视器的输出应显示模块与障碍物之间的距离。
由于许多因素(例如温度、障碍物的材料和表面特性)都会影响测量的准确性,因此使用这种低成本的超声波传感器实现高精度的测量是非常具有挑战性的。 但是,HC-SR04是一种便宜且易于使用的超声模块,具有广泛的应用前景。
|