Arduino - 超声波测距

本文介绍了一种简单的超声波模块使用方法,重点讲解了脉冲发送和距离计算的过程。通过Arduino平台演示了如何利用pulseIn()函数读取回声脉冲宽度并计算距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

超声波模块使用比较简单,不需要额外的库文件,接线对针脚也没有特殊要求。
主要要点就是脉冲发送方式和距离计算方式。

接线如图:

这里写图片描述

知识要点:
pulseIn():用于检测引脚输出的高低电平的脉冲宽度。
pulseIn(pin, value)
pulseIn(pin, value, timeout)
Pin—需要读取脉冲的引脚
Value—需要读取的脉冲类型,HIGH或LOW
Timeout—超时时间,单位微秒,数据类型为无符号长整型。

代码如下:

// 设定连接的Arduino引脚,随便接两个IO口即可,这里用2和3口进行测试。
const int TrigPin = 2; 
const int EchoPin = 3; 
float distance; //距离用浮点数,根据计算公式,可以精确到0.01厘米
void setup() 
{   // 初始化串口通信及连接SR04的引脚
        Serial.begin(9600); 
    //  用TrigPin口发送脉冲信号。
        pinMode(TrigPin, OUTPUT); 
    //  用EchoPin口检测脉冲高电平持续的时间。
        pinMode(EchoPin, INPUT); 
} 
void loop() 
{ 
    // 产生一个10us的高脉冲去触发TrigPin 
        digitalWrite(TrigPin, LOW); 
        delayMicroseconds(2); 
        digitalWrite(TrigPin, HIGH); 
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW); 
    // 检测脉冲宽度,并计算出距离
        distance = pulseIn(EchoPin, HIGH) / 58.00;
        Serial.print(distance); 
        Serial.print("cm"); 
        Serial.println(); 
        delay(1000); 
}
### 使用 Arduino 和 HC-SR04 进行超声波测距 HC-SR04 是一种常用的超声波传感器,能够测量物体的距离。通过连接到 Arduino 的数字引脚,可以实现精确的测距功能。 #### 硬件连接 为了使 HC-SR04 正常工作,需将其 VCC 接入 5V 或者 Arduino 的电源端子,GND 接地;TRIG 引脚用于触发信号发送,应接入 Arduino 的一个数字输出引脚(通常为 D8),而 ECHO 引脚则接收返回信号,建议连接至另一个数字输入引脚(通常是 D9)。这种配置允许 Arduino 控制并读取来自传感器的数据[^1]。 #### 示例代码:基本测距程序 以下是未加入任何滤波处理的基础版本代码: ```cpp #define TRIGGER 8 // 定义触发引脚 #define ECHO 9 // 定义回响引脚 long duration; // 存储脉冲时间变量 float distance; // 记录实际距离 // 设定最大探测范围 (单位: 厘米) const float MAX_DISTANCE = 200; const unsigned long TIMEOUT_MICROSECONDS = static_cast<unsigned long>(MAX_DISTANCE * 2 / 0.034); void setup() { pinMode(TRIGGER, OUTPUT); // 设置触发引脚为输出模式 pinMode(ECHO, INPUT); // 设置回响引脚为输入模式 Serial.begin(9600); // 初始化串口通信波特率设为 9600bps } void loop() { digitalWrite(TRIGGER, LOW); delayMicroseconds(2); // 将触发引脚置低电平持续至少 2 微秒 digitalWrite(TRIGGER, HIGH); delayMicroseconds(10); // 发送高电平脉冲保持约 10 微秒激活超声发射器 digitalWrite(TRIGGER, LOW); duration = pulseIn(ECHO, HIGH, TIMEOUT_MICROSECONDS); // 测量回响时间为多少微秒 distance = duration * 0.034 / 2; // 转化成厘米数 if (distance > 0 && distance <= MAX_DISTANCE) { // 如果检测有效,则打印数值 Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); } else { Serial.println("Out of range or error"); // 否则提示超出范围或者错误情况发生 } delay(100); // 每次循环间隔 100ms 避免频繁操作影响精度 } ``` 此段代码实现了基础的功能需求,即利用 HC-SR04 对目标物进行连续不断的距离测定,并把结果经由串口传输显示出来[^1]。 #### 数据过滤改进方案 对于更复杂的应用场景来说,仅依靠原始采集值可能不够稳定可靠,因此引入简单的平均法或其他高级算法来提升最终输出质量是非常必要的。下面给出了一种基于滑动窗口均值的方法作为参考实例之一: ```cpp #include <SimpleKalmanFilter.h> #define TRIGGER_PIN 8 #define ECHO_PIN 9 int sampleSize = 5; float samples[sampleSize]; unsigned int timeout_us = ((long)(200 * 2 * 29)) ; SimpleKalmanFilter kalmanFilter(1., .01f , .1f ); void setup(){ ... } void loop(){ ... for(int i=0;i<sampleSize;i++)samples[i]=getFilteredValue(); float avg=sum(samples)/sampleSize; Serial.println(avg); delay(100); } float getFilteredValue(){ long dur=pulseIn(ECHO,HIGH,timeout_us ); double dist=dur*.034/2.; return kalmanFilter.updateEstimate(dist); } ``` 该部分扩展了原生逻辑,增加了卡尔曼滤波器以减少噪声干扰的影响,从而获得更加平稳的结果表现[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值