Arduino - 超声波传感器
Arduino - 使用超声波距离传感器 (HC-SR04)
Section titled “Arduino - 使用超声波距离传感器 (HC-SR04)”HC-SR04 是一种廉价且流行的超声波传感器,用于非接触式距离测量。它像蝙蝠的声纳一样工作,通过发射超声波脉冲并测量回波返回所需的时间。这使得它能够测量大约 2 厘米到 400 厘米(1 英寸到 13 英尺)的距离。
它的读数不受阳光或深色表面的影响,但柔软、不规则或倾斜的表面(如布料)可能难以准确检测,因为它们可能会吸收或偏转声波。
- 供电电压:+5V DC
- 工作电流:约 15mA
- 有效角度:<15°
- 测距范围:2cm – 400cm
- 分辨率:约 0.3 cm
- 1 × Arduino Uno R3(或类似板)
- 1 × HC-SR04 超声波传感器
- 1 × 面包板
- 跳线
该传感器有四个引脚。连接方式如下:
VCC→ Arduino5VTrig(触发引脚)→ Arduino 数字引脚9Echo(回响引脚)→ Arduino 数字引脚10GND→ ArduinoGND
工作原理:物理学原理
Section titled “工作原理:物理学原理”- 我们向
Trig引脚发送一个 10 微秒的短脉冲。 - 传感器发射出一连串 8 个 40kHz 的超声波。
- 传感器随后在
Echo引脚上监听这些波的回波。 Echo引脚在声音往返传播期间保持高电平。- 我们测量这段持续时间并利用声速计算距离。
公式:距离 = (传播时间 / 2) * 声速
我们将时间除以 2 是因为它是一个往返行程(到物体再返回)。
Arduino 代码:一个清晰且带有解释的程序(sketch)
Section titled “Arduino 代码:一个清晰且带有解释的程序(sketch)”// 为清晰起见定义引脚号const int TRIG_PIN = 9;const int ECHO_PIN = 10;
// 定义一个厘米/微秒为单位的声速常量// (343 米/秒 = 34300 厘米/秒 = 0.0343 厘米/微秒)const float SPEED_OF_SOUND_CM_US = 0.0343;
void setup() { Serial.begin(9600); // 初始化串口通信
// 设置引脚模式 pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT);}
void loop() { // --- 1. 生成触发脉冲 --- // 确保触发引脚为低电平以获得干净的脉冲 digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2);
// 发送一个 10 微秒的高电平脉冲 digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW);
// --- 2. 测量回波脉冲持续时间 --- // pulseIn() 等待引脚变为高电平,开始计时, // 并在引脚变为低电平时停止计时。它以微秒为单位返回持续时间。 unsigned long duration_us = pulseIn(ECHO_PIN, HIGH);
// --- 3. 计算距离 --- // 距离 = (持续时间 / 2) * 声速 float distance_cm = (duration_us / 2.0) * SPEED_OF_SOUND_CM_US;
// --- 4. 打印结果 --- if (distance_cm > 400 || distance_cm < 2) { Serial.println("Out of range"); } else { Serial.print("Distance: "); Serial.print(distance_cm); Serial.println(" cm"); }
delay(500); // 等待半秒钟再进行下一次读数}超越基础:NewPing 库
Section titled “超越基础:NewPing 库”对于更高级的项目,基本的 pulseIn() 函数可能会受到限制,因为它会阻塞——在等待回波时会暂停您的整个程序(sketch)。更好的方法是使用 NewPing 库。
NewPing 的优势:
Section titled “NewPing 的优势:”- 非阻塞代码结构(使用定时器)。
- 内置滤波:轻松平均多次读数以获得更稳定的距离。
- 轻松管理多个传感器。
您可以通过 Arduino 库管理器安装它。这是提高测距项目可靠性的重要一步。
常见问题排查
Section titled “常见问题排查”- 读数始终为 0 或最大值:仔细检查您的
VCC、GND、Trig和Echo引脚接线。连接松动是最常见的问题。 - 读数不稳定:传感器可能指向柔软、倾斜或非常小的物体,这些物体无法产生清晰的回波。确保测试时有一个清晰、平坦的表面。电源上的电噪声也可能导致问题。
pulseIn()超时:如果没有检测到回波,pulseIn()将会超时(默认 1 秒后),返回 0。这就是代码检查超出范围值的原因。