Skip to content

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 → Arduino 5V
  • Trig(触发引脚)→ Arduino 数字引脚 9
  • Echo(回响引脚)→ Arduino 数字引脚 10
  • GND → Arduino GND
  1. 我们向 Trig 引脚发送一个 10 微秒的短脉冲。
  2. 传感器发射出一连串 8 个 40kHz 的超声波。
  3. 传感器随后在 Echo 引脚上监听这些波的回波。
  4. Echo 引脚在声音往返传播期间保持高电平。
  5. 我们测量这段持续时间并利用声速计算距离。

公式:距离 = (传播时间 / 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); // 等待半秒钟再进行下一次读数
}

对于更高级的项目,基本的 pulseIn() 函数可能会受到限制,因为它会阻塞——在等待回波时会暂停您的整个程序(sketch)。更好的方法是使用 NewPing 库。

  • 非阻塞代码结构(使用定时器)。
  • 内置滤波:轻松平均多次读数以获得更稳定的距离。
  • 轻松管理多个传感器。

您可以通过 Arduino 库管理器安装它。这是提高测距项目可靠性的重要一步。

  • 读数始终为 0 或最大值:仔细检查您的 VCC、GND、Trig 和 Echo 引脚接线。连接松动是最常见的问题。
  • 读数不稳定:传感器可能指向柔软、倾斜或非常小的物体,这些物体无法产生清晰的回波。确保测试时有一个清晰、平坦的表面。电源上的电噪声也可能导致问题。
  • pulseIn() 超时:如果没有检测到回波,pulseIn() 将会超时(默认 1 秒后),返回 0。这就是代码检查超出范围值的原因。