- 机器人等级考试
超声波传感器测距学习笔记教程
- 2025-8-24 10:38:31 @
超声波传感器测距学习笔记教程
一、知识储备
(一)超声波基础
- 超声波概念:频率高于20000赫兹的声波,人耳听不到,具有方向性好、反射能力强等特点,可用于测距、测速等场景 。
- 测距原理:超声波传感器发射超声波,遇到障碍物反射,通过测量发射与接收回波的时间差,结合声速(空气中约340米/秒 ),利用公式
距离 = (声速×时间差)/ 2
计算距离(除以2是因为声波往返 )。
(二)Arduino 相关函数
delayMicroseconds(value)
:让程序暂停运行设定时间,单位微秒(1毫秒 = 1000微秒 ),用于精准控制触发信号时长。pulseIn(pin, value, timeout)
:读取指定引脚的脉冲(高电平或低电平 )持续时间,返回微秒值。pin
是引脚号,value
是脉冲类型(HIGH
或LOW
),timeout
是等待脉冲的超时时间(默认1秒 ),用于获取超声波回波高电平持续时间。
二、代码实现(Arduino 控制超声波传感器测距)
(一)完整代码
// 定义超声波传感器触发引脚(Trig),连接到 Arduino 数字引脚 2
const int trigPin = 2;
// 定义超声波传感器回声引脚(Echo),连接到 Arduino 数字引脚 3
const int echoPin = 3;
void setup() {
// 初始化触发引脚为输出模式,用于发送触发信号
pinMode(trigPin, OUTPUT);
// 初始化回声引脚为输入模式,用于接收反射信号
pinMode(echoPin, INPUT);
// 初始化串口通信,波特率 9600,用于在串口监视器显示测量结果
Serial.begin(9600);
// 串口打印提示信息,确认程序启动
Serial.println("超声波开始工作啦!");
}
void loop() {
// 1. 触发超声波模块发射超声波
// 先将触发引脚拉低 2 微秒,确保初始状态稳定
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// 向触发引脚发送 10 微秒高电平,触发超声波发射(模块要求的触发条件)
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
// 触发完成,拉低触发引脚结束信号
digitalWrite(trigPin, LOW);
// 2. 接收反射信号并计算距离
// 测量回声引脚高电平持续时间(即超声波往返时间),单位微秒
long duration = pulseIn(echoPin, HIGH);
// 根据公式计算距离,340 米/秒 = 0.034 厘米/微秒,往返距离除以 2,简化为除以 58.0(0.034/2 的倒数约 58 )
double distance = duration / 58.0;
// 3. 串口输出测量结果
Serial.print("前方障碍物的距离:"); // 打印提示文字
Serial.print(distance); // 打印距离数值
Serial.println("cm"); // 打印距离单位
// 延迟 20 毫秒后再次测量,避免频繁测量导致结果不稳定
delay(20);
}
(二)代码逐行注释解析
- 引脚定义:
// 定义超声波传感器触发引脚(Trig),连接到 Arduino 数字引脚 2
const int trigPin = 2;
// 定义超声波传感器回声引脚(Echo),连接到 Arduino 数字引脚 3
const int echoPin = 3;
- 明确超声波传感器两个关键引脚
trigPin
(触发 )和echoPin
(回声 )在 Arduino 上的连接引脚,const
修饰表明引脚号程序运行中不变。
setup()
函数:
void setup() {
// 初始化触发引脚为输出模式,让其能输出电信号触发超声波发射
pinMode(trigPin, OUTPUT);
// 初始化回声引脚为输入模式,用于接收反射波的信号
pinMode(echoPin, INPUT);
// 初始化串口通信,设置波特率 9600,后续通过串口打印测距结果
Serial.begin(9600);
// 串口打印提示,方便在串口监视器确认程序启动状态
Serial.println("超声波开始工作啦!");
}
- 完成引脚模式初始化(输出/输入 )和串口初始化,还给出程序启动提示。
loop()
函数:- 触发超声波发射:
// 先拉低触发引脚 2 微秒,让初始电平稳定,避免干扰
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// 输出 10 微秒高电平,触发超声波模块发射超声波(符合模块触发时序要求)
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
// 触发完成,拉低引脚,结束触发信号
digitalWrite(trigPin, LOW);
- 通过控制 `trigPin` 电平变化,严格按照超声波模块触发时序,先稳初始电平,再发触发高电平,最后结束触发。
- **计算距离**:
// 测量回声引脚高电平持续时间,也就是超声波从发射到返回的总时间(微秒)
long duration = pulseIn(echoPin, HIGH);
// 利用公式简化计算距离,(340m/s 换算为 0.034cm/μs,往返距离除以 2,即 0.034/2 = 0.017 ,1/0.017≈58 ,所以除以 58.0 得到厘米距离 )
double distance = duration / 58.0;
- 用 `pulseIn` 获取超声波往返时间,再通过简化公式快速算出距离(单位厘米 )。
- **串口输出与延时**:
Serial.print("前方障碍物的距离:"); // 打印提示文本
Serial.print(distance); // 打印测距数值
Serial.println("cm"); // 打印距离单位
// 延迟 20 毫秒,让测量间隔合理,避免结果波动大
delay(20);
- 串口打印清晰展示测距结果,`delay(20)` 控制测量频率,保障结果稳定。
三、实际操作与扩展
(一)硬件连接
将超声波传感器的 VCC
接 Arduino 5V ,GND
接 Arduino GND ,Trig
接代码中定义的触发引脚(如数字引脚 2 ),Echo
接回声引脚(如数字引脚 3 )。
(二)功能扩展
- 数据滤波:多次测量取平均值,减少测距波动,比如连续测 5 次,去掉最大最小值后求平均。
- 阈值报警:设定距离阈值,当小于阈值(如距离障碍物过近 ),让 Arduino 控制蜂鸣器报警或指示灯闪烁。
- 结合显示屏:连接 OLED 显示屏,实时在屏幕显示测距数值,让结果展示更直观。
通过学习上述内容,就能掌握 Arduino 配合超声波传感器实现测距的核心逻辑与实操方法,后续可基于此拓展更多有趣的智能项目,比如自动避障小车、智能垃圾桶测距开盖等 。
0 条评论
目前还没有评论...