当前位置: 首页 > news >正文

基于Raspberry Pi Pico与HC-SR04的超声波测距系统实战指南

1. 项目概述与核心价值

超声波传感器,这个听起来有点“高大上”的名字,其实在咱们的日常生活中无处不在。从你倒车时“滴滴滴”响的雷达,到商场门口自动打开的玻璃门,再到工厂里测量液位的设备,背后都有它的身影。它的核心原理其实很简单,就像蝙蝠在黑暗中飞行一样:发出一段人耳听不见的超声波,然后竖起耳朵听回声,通过计算声音“跑出去”和“跑回来”的时间,就能知道前方障碍物有多远。这种非接触式的测量方式,让它比那些需要碰触的传感器(比如限位开关)灵活、耐用得多。

这次,咱们不用那些复杂的工业控制器,就用一块巴掌大小、价格亲民的Raspberry Pi Pico,再配上一个经典的HC-SR04超声波模块,亲手搭建一个属于自己的测距系统。Pico 是树莓派基金会推出的微控制器,主打的就是极致的性价比和灵活的编程能力,特别适合我们这些喜欢动手的开发者、电子爱好者或者学生,用来学习嵌入式系统和物联网的入门再合适不过了。而 MicroPython,作为一种可以在微控制器上运行的 Python 语言,大大降低了嵌入式开发的门槛,让你能用写脚本的思维来操控硬件。

所以,这篇文章要解决的,就是如何把这两者结合起来,实现一个稳定、准确的测距应用。我会从最基础的原理讲起,手把手带你完成硬件连接,深入解析每一行代码背后的逻辑,并分享我在调试过程中踩过的坑和总结的经验。无论你是刚接触硬件的软件工程师,还是想给机器人项目增加“眼睛”的学生,这篇文章都能给你提供一份可直接“抄作业”的详细指南。

2. 核心硬件解析与选型考量

2.1 为什么选择 Raspberry Pi Pico?

在开始接线之前,我们得先搞清楚手里的“武器”。选择 Raspberry Pi Pico 作为本项目的主控,绝非偶然,而是基于几个非常实际的考量。

首先,性价比无敌。Pico 的核心是一颗 RP2040 微控制器芯片,双核 ARM Cortex-M0+ 处理器,运行频率最高 133 MHz,虽然比不上那些动辄上 GHz 的处理器,但对于处理超声波传感器的信号、进行简单的距离计算和串口输出,完全是绰绰有余。它的价格通常只有几十元,却提供了 26 个多功能 GPIO 引脚、2个 SPI、2个 I2C、2个 UART 接口,以及可编程的 I/O(PIO)这个独门绝技。PIO 允许你以极低的CPU开销实现特定的时序协议,对于需要精确时序控制的应用(比如驱动 NeoPixel灯带)是神器,虽然我们这个超声波项目用不上,但也说明了其扩展潜力。

其次,开发体验友好。Pico 完美支持 MicroPython 和 C/C++ 开发。对于快速原型开发和学习来说,MicroPython 的优势太大了。你不用去折腾复杂的交叉编译环境,只需要一根 USB 线,把 Pico 当成一个 U 盘,把写好的.py文件拖进去就能运行。交互式的 REPL(读取-求值-打印循环)环境,让你可以像在电脑上使用 Python 一样,实时测试命令和调试,这对于排查硬件问题、验证传感器读数至关重要。

最后,社区与生态丰富。作为树莓派生态的一员,Pico 有着庞大的用户群和丰富的学习资源。你遇到的大部分问题,几乎都能在社区论坛或开源项目里找到答案。各种传感器、显示屏的驱动库也很容易找到,方便你后续扩展项目,比如加上一个 OLED 屏来实时显示距离。

2.2 HC-SR04 传感器模块深度剖析

HC-SR04 可以说是超声波传感器里的“明星产品”,便宜、易用、资料多。但要用好它,必须了解其内部工作机制和电气特性。

这个模块大致可以分成两部分:发射端接收端。发射端有一个超声波发射探头,当我们给 Trig(触发)引脚一个至少 10 微秒的高电平脉冲时,它内部的振荡电路就会驱动探头发出一束 8 个 40kHz 的超声波脉冲。40kHz 远超人类听觉上限(20kHz),所以我们听不见。

声音在空气中以大约 343 米/秒(室温下)的速度传播,碰到障碍物后反射回来。接收端探头接收到这些回波后,模块内部的放大和比较电路会进行处理,并在 Echo(回响)引脚输出一个高电平脉冲。这个高电平脉冲的宽度,严格等于超声波从发射到返回所经过的时间。这就是我们计算距离的关键数据。

这里有一个至关重要的细节:HC-SR04 模块通常有两个版本,工作电压分别是 5V 和 3.3V。市面上最常见的是 5V 版本。而我们的 Raspberry Pi Pico,其 GPIO 引脚的工作电压是 3.3V,并且其耐受电压也是 3.3V。这意味着:

  1. Trig 引脚:Pico 的 GPIO 输出高电平是 3.3V。对于 5V 的 HC-SR04,其 Trig 引脚的触发高电平阈值通常在 2.0V - 5.0V 之间。3.3V 高于 2.0V,因此Pico 的 3.3V 输出可以直接触发 5V 模块,没问题。
  2. Echo 引脚:问题出在这里。5V 版本的 HC-SR04,其 Echo 引脚在输出高电平时,电压是 5V。如果把这个 5V 信号直接接到 Pico 的 GPIO(仅耐受 3.3V)上,就存在烧毁 Pico 芯片的风险。

所以,原始资料里那句“If you have a 5v HC-SR04 module like me, please connect it through a LOGIC LEVEL SHIFTER”是绝对的金玉良言,不是可选项。电平转换器(Logic Level Shifter)就像一个翻译官,能把 5V 的信号“翻译”成 3.3V 给 Pico 安全读取。常用的有基于 MOSFET 的 TXS0108E 模块或分立元件搭建的分压电路。忽略这一步,轻则读数不稳定,重则永久损坏你的 Pico。

3. 硬件连接与电平转换方案实战

3.1 连接原理图与物料清单

我们先明确需要哪些东西:

  1. Raspberry Pi Pico 一块
  2. HC-SR04 超声波传感器模块(5V 版本)一个
  3. 双向逻辑电平转换模块(例如 TXB0108、TXS0108E 或 74LVC245)一个
  4. 杜邦线(母对母、公对母)若干
  5. 面包板一块(可选,但强烈推荐,方便连接和测试)

连接的核心思想是:Pico 用 3.3V 触发传感器,传感器用 5V 回传信号,但这个 5V 信号必须经过电平转换器“降压”成 3.3V 后再给 Pico。

具体接线步骤如下:

  1. 供电

    • 将 Pico 的VBUS引脚(即直接来自 USB 的 5V)连接到电平转换器的HV(高压侧)VCC。
    • 将 Pico 的3V3(OUT)引脚(输出 3.3V)连接到电平转换器的LV(低压侧)VCC。
    • 将 HC-SR04 的VCC引脚连接到电平转换器的HVVCC(即与 Pico VBUS 同一点),从而为传感器提供 5V 电源。
    • 将 Pico 的GND、电平转换器的GND、HC-SR04 的GND三者连接在一起。共地是电路正常工作的基础,务必确保可靠连接。
  2. 信号连接

    • 触发信号(Pico -> Sensor):Pico 的GP14引脚(你也可任选其他GPIO)连接到电平转换器LV侧的某个通道(如 A1)。再将电平转换器HV侧对应的通道(如 B1)连接到 HC-SR04 的Trig引脚。这样,Pico 发出的 3.3V 信号经转换器“抬升”到 5V(对于TXB0108这类双向转换器,其实原样通过,但电压域已匹配)去触发传感器。
    • 回响信号(Sensor -> Pico):HC-SR04 的Echo引脚连接到电平转换器HV侧的另一个通道(如 B2)。再将电平转换器LV侧对应的通道(如 A2)连接到 Pico 的GP15引脚。这样,传感器返回的 5V 高电平信号,经过转换器后被“降低”到 3.3V,安全地送入 Pico。

注意:如果你使用的是 TXB0108/TXS0108E 这类自动双向转换芯片,其两侧(A端和B端)是自动识别方向的,接线时无需区分输入输出。但务必查阅你所用转换模块的数据手册,确认其电压匹配和使能引脚连接。

3.2 不使用电平转换器的“冒险方案”及其风险

也许你会想:“我手头没有电平转换器,能不能用简单电阻分压?” 理论上可以,但不推荐用于正式项目。一个经典的方案是用两个电阻(例如 1kΩ 和 2kΩ)串联在 Echo 引脚和 Pico GPIO 之间,从中间分压点接 GPIO。这样,5V 输入会在 GPIO 处变为约 3.33V (5V * 2k/(1k+2k))。

但这个方案有显著缺点:

  • 响应速度:电阻和GPIO的输入电容会形成一个低通滤波器,可能延缓上升/下降沿,在测量极高精度或近距离时引入误差。
  • 信号完整性:抗干扰能力较弱。
  • 可靠性:电阻值误差或温度漂移可能使电压超出安全范围。

最不推荐的做法是直接连接。我曾抱有侥幸心理试过,短时间读取可能正常,但系统运行一段时间后,Pico 会变得不稳定甚至某个GPIO永久失效。修复的成本远高于一个几块钱的电平转换模块。所以,请务必做好电平转换。

4. MicroPython 代码实现与逐行精解

硬件连接妥当后,就到了赋予系统“灵魂”的环节——编程。我们将使用 MicroPython,其语法与标准 Python 高度相似,但针对嵌入式环境做了优化。

4.1 基础测距代码实现

首先,我们将完整的测距功能封装成一个函数。创建一个名为hcsr04.py的文件。

from machine import Pin, Timer import utime class HCSR04: """ HC-SR04 超声波测距传感器驱动类。 使用前请确保 Echo 引脚已通过电平转换器连接。 """ def __init__(self, trigger_pin, echo_pin, sound_speed=343): """ 初始化超声波传感器。 :param trigger_pin: 触发信号连接的 GPIO 编号 (例如 14) :param echo_pin: 回响信号连接的 GPIO 编号 (例如 15) :param sound_speed: 声速,单位 米/秒,默认343 (25摄氏度干燥空气) """ self.trigger = Pin(trigger_pin, Pin.OUT) self.echo = Pin(echo_pin, Pin.IN) self.sound_speed = sound_speed / 10000 # 转换为 厘米/微秒 (34300 cm/s -> 0.0343 cm/μs) self.timeout_us = 30000 # 超时时间(微秒),对应约 5米 距离 def distance_cm(self): """ 执行一次测距,返回以厘米为单位的距离。 如果超时或测量无效,返回 None。 """ # 1. 确保触发引脚先保持低电平 self.trigger.low() utime.sleep_us(2) # 短暂稳定 # 2. 发出至少10微秒的高电平脉冲 self.trigger.high() utime.sleep_us(10) # 标准要求至少10μs,这里给足余量 self.trigger.low() # 3. 等待 Echo 引脚变为高电平(回波开始) # 添加超时机制,防止因物体太远或无回波导致死循环 pulse_start = utime.ticks_us() while self.echo.value() == 0: if utime.ticks_diff(utime.ticks_us(), pulse_start) > self.timeout_us: return None # 超时,未检测到回波开始 # 短暂空循环等待 # 记录回波开始的精确时刻 signal_off = utime.ticks_us() # 4. 等待 Echo 引脚变为低电平(回波结束) pulse_start = utime.ticks_us() while self.echo.value() == 1: if utime.ticks_diff(utime.ticks_us(), pulse_start) > self.timeout_us: return None # 超时,回波持续时间异常长 # 短暂空循环等待 # 记录回波结束的精确时刻 signal_on = utime.ticks_us() # 5. 计算时间差(微秒) time_passed = utime.ticks_diff(signal_on, signal_off) # 6. 计算距离:距离 = (时间 * 声速) / 2 # 声速已转换为 0.0343 cm/μs,除以2是因为时间是往返时间 distance = (time_passed * self.sound_speed) / 2 return distance # 使用示例 if __name__ == "__main__": # 初始化传感器,Trig 接 GP14, Echo 接 GP15 sensor = HCSR04(trigger_pin=14, echo_pin=15) # 循环测量并打印距离 while True: dist = sensor.distance_cm() if dist is not None: print(f"距离: {dist:.2f} cm") else: print("测量超时或无效") utime.sleep(0.5) # 每次测量间隔0.5秒

4.2 代码逻辑深度解析与优化技巧

上面的代码已经是一个健壮性更好的版本了,我们来拆解其中的关键点:

  1. 声速的转换 (self.sound_speed = sound_speed / 10000)

    • 公式距离 = (时间 * 声速) / 2中,声速常用 343 m/s。
    • 我们的时间time_passed单位是微秒 (μs),1秒 = 1,000,000 微秒。
    • 要把声速转换成“厘米/微秒”:343 m/s = 34300 cm/s。34300 cm/s ÷ 1,000,000 μs/s = 0.0343 cm/μs。
    • 所以计算时直接用time_passed * 0.0343 / 2即可得到厘米数。在类初始化时做这个转换是为了更清晰。
  2. 超时机制 (self.timeout_us)

    • 这是原始代码没有但极其重要的改进。如果传感器前方没有障碍物,或者障碍物太远(超过传感器量程,HC-SR04通常约2cm-450cm),Echo 引脚可能永远不会变高或一直保持高电平,导致while循环无限等待,程序“卡死”。
    • 我们设置一个超时时间(例如30000微秒)。在等待 Echo 引脚电平变化时,不断检查是否超时。一旦超时,函数返回None,提示本次测量失败。超时时间对应最大测量距离,30000μs 对应距离约为(30000 * 0.0343) / 2 ≈ 514.5 cm,略大于传感器标称量程,是合理的。
  3. utime.ticks_us()utime.ticks_diff()

    • ticks_us()返回一个从某个任意起点开始的微秒计数器,用于高精度时间测量。
    • ticks_diff(a, b)用于计算两个“ticks”值之间的差值,它会正确处理计数器的溢出(wrap-around)问题。在嵌入式系统中,计数器位数有限,计满后会归零(溢出),直接相减会得到错误结果。ticks_diff()内部处理了这种情况,必须用它来计算时间间隔
  4. 触发脉冲宽度

    • 数据手册要求 Trig 引脚高电平脉冲至少 10 微秒。代码中给了utime.sleep_us(10),这是满足要求的。有些教程用 5 微秒,在大多数模块上也能工作,但遵循官方规格是最稳妥的。

实操心得:在初始化传感器后,最好先连续读取几次并丢弃结果(例如在循环开始前加一个for _ in range(5): sensor.distance_cm())。我发现有些 HC-SR04 模块在首次上电或长时间闲置后的第一次测量会返回一个异常大的值,预热几次后读数就稳定了。

5. 高级应用与数据滤波处理

基础的连续测距已经实现了,但直接读取的原始数据往往包含毛刺和跳动。为了获得更稳定、可靠的读数,尤其是在移动的机器人或动态环境中,我们必须对数据进行处理。

5.1 软件滤波算法实现

单一的测量值容易受到声波干扰、测量角度、物体表面材质(如柔软布料可能吸收声波)的影响。我们可以通过连续多次测量,然后进行统计滤波来得到更可信的结果。

修改我们的主循环部分,加入滤波功能:

# ... 保留 HCSR04 类的定义 ... def median_filter(readings): """ 中值滤波:返回读数列表的中值。 能有效滤除偶发的、幅度大的脉冲干扰。 """ sorted_readings = sorted(readings) n = len(sorted_readings) if n % 2 == 1: # 奇数个 return sorted_readings[n // 2] else: # 偶数个,取中间两个的平均值 return (sorted_readings[n // 2 - 1] + sorted_readings[n // 2]) / 2.0 def moving_average_filter(new_value, history, window_size=5): """ 移动平均滤波:更新历史队列,并返回平均值。 使输出变化平滑,但对突变的响应较慢。 """ history.append(new_value) if len(history) > window_size: history.pop(0) # 移除最旧的数据 return sum(history) / len(history) # 使用滤波的示例 if __name__ == "__main__": sensor = HCSR04(trigger_pin=14, echo_pin=15) # 用于移动平均滤波的历史数据队列 distance_history = [] # 先进行几次预热测量 for _ in range(5): sensor.distance_cm() utime.sleep(0.1) while True: # 1. 连续采样5次 samples = [] for _ in range(5): dist = sensor.distance_cm() if dist is not None and 2 < dist < 450: # 忽略超范围和无效值 samples.append(dist) utime.sleep(0.02) # 采样间隔20ms,避免声波干扰 if not samples: # 如果所有采样都无效 print("本次采样无效") utime.sleep(0.5) continue # 2. 先应用中值滤波,滤除明显异常点 median_dist = median_filter(samples) # 3. 再将中值结果送入移动平均滤波,获得平滑输出 smoothed_dist = moving_average_filter(median_dist, distance_history, window_size=5) print(f"原始采样: {samples}") print(f"中值滤波后: {median_dist:.2f} cm") print(f"移动平均后: {smoothed_dist:.2f} cm") print("-" * 20) utime.sleep(0.3) # 主循环周期

为什么选择中值滤波+移动平均?

  • 中值滤波:对采样集合排序取中值。它能完美滤除由于偶然电磁干扰或第一次回波误判产生的“野值”。比如采样值为 [15.2, 15.5, 120.0, 15.3, 15.6],其中的 120.0 显然是个错误读数,取中值 15.5 就能将其排除。
  • 移动平均滤波:对一段时间内的数据取平均。它能平滑掉小幅度的、高频的随机跳动,让读数看起来更稳定。但它有个缺点:当距离真实值发生快速变化时(比如物体快速靠近),滤波后的输出会有延迟。window_size越大,越平滑但延迟也越大,需要根据应用场景权衡。

5.2 非阻塞式定时测量与事件驱动

上面的while True循环是“阻塞式”的,程序会一直卡在测距和睡眠中,无法同时处理其他任务(比如响应按钮、更新显示屏)。在嵌入式系统中,我们更常用定时器实现“非阻塞”操作。

from machine import Pin, Timer # ... 保留 HCSR04 类和滤波函数的定义 ... class NonBlockingDistanceMonitor: def __init__(self, sensor, update_interval_ms=500): self.sensor = sensor self.current_distance = None self.filter_history = [] self.timer = Timer() # 启动一个周期定时器,定期执行测量 self.timer.init(period=update_interval_ms, mode=Timer.PERIODIC, callback=self._measure_callback) def _measure_callback(self, timer): """定时器回调函数:执行一次测量并滤波""" dist = self.sensor.distance_cm() if dist is not None and 2 < dist < 450: # 简单的移动平均滤波 self.filter_history.append(dist) if len(self.filter_history) > 5: self.filter_history.pop(0) self.current_distance = sum(self.filter_history) / len(self.filter_history) # 这里不打印,避免在中断回调中做耗时操作 # 实际应用中,可以设置一个标志位,在主循环中检查并处理新数据 def get_distance(self): """主循环中调用此函数获取最新的滤波后距离""" return self.current_distance def stop(self): """停止定时测量""" self.timer.deinit() # 使用示例 if __name__ == "__main__": sensor = HCSR04(14, 15) monitor = NonBlockingDistanceMonitor(sensor, update_interval_ms=300) try: while True: # 主循环可以自由处理其他任务 dist = monitor.get_distance() if dist: print(f"当前距离: {dist:.2f} cm") # 模拟其他任务,比如读取按键 utime.sleep(0.1) except KeyboardInterrupt: monitor.stop() print("监控已停止")

这种方式将耗时的超声波测距过程放在定时器中断中自动进行,主循环while True被解放出来,可以非常快速地轮询其他设备状态或执行逻辑判断,极大地提高了系统的响应能力和多任务处理潜力。

6. 典型问题排查与调试经验实录

即使按照教程一步步来,你也可能会遇到各种稀奇古怪的问题。下面是我在多个项目中总结出来的常见问题清单和排查步骤,希望能帮你快速定位问题。

6.1 常见问题速查表

问题现象可能原因排查步骤与解决方案
读数恒为None或超时1. 电平转换器未接或接错。
2. 电源供电不足。
3. Echo 引脚接触不良或接错。
4. 物体超出量程或表面不反射声波。
1.检查电平转换器:确认 HV/LV VCC 和 GND 已正确连接至5V和3.3V电源。用万用表测量 Echo 信号线在经过转换器后,高电平是否为~3.3V。
2.检查电源:尝试单独给 HC-SR04 供电(仍共地),或使用带外部供电的 USB Hub 给 Pico 供电。HC-SR04 发射超声波瞬间电流较大,USB 口供电不足可能导致模块复位。
3.检查接线:重新插拔杜邦线,尤其是 Echo 引脚。尝试交换 Trig 和 Echo 的 GPIO 引脚号测试。
4.测试环境:换一个平整、坚硬的物体(如木板、墙壁)在 30cm 处测试。
读数不稳定,跳动很大1. 声波干扰(多个传感器、空旷环境回声)。
2. 电源噪声。
3. 未进行软件滤波。
4. 测量对象表面粗糙或角度倾斜。
1.隔离干扰:确保传感器前方没有其他障碍物造成多重反射。如果有多个超声波传感器,让它们分时工作(一个测完再触发下一个)。
2.加强电源滤波:在 HC-SR04 的 VCC 和 GND 之间并联一个 10uF 电解电容和一个 0.1uF 陶瓷电容,越靠近模块引脚越好。
3.应用滤波:务必使用上文介绍的中值滤波和移动平均滤波。
4.规范测量:对准物体正面测量,避免极端角度。
读数存在固定偏差1. 声速常数不准确(受温湿度影响)。
2. 传感器自身误差。
1.校准声速:在已知精确距离(如 100.0 cm)处测量,反算出实际的声速值,替换代码中的0.0343。公式:实际声速 = (2 * 已知距离) / 测量时间
2.软件补偿:测量多个已知距离点,计算出一个偏移量或线性修正公式,在代码结果上加上/减去这个偏差。
测量最小距离不准确(>2cm)HC-SR04 存在约 2-3cm 的盲区。这是由物理结构(发射和接收探头有间距)和电路恢复时间决定的。硬件层面无解,这是模块特性。如果需要测量更近的距离,需换用其他原理(如红外 ToF)或型号(有些超声波模块盲区更小)的传感器。在软件中,可以将小于某个阈值(如 3cm)的读数视为“盲区”,返回一个特定值或上次有效值。
程序运行一段时间后卡死1. 没有超时处理,在无回波时陷入死循环。
2. 内存泄漏(在复杂代码中)。
3. 硬件接触不良导致异常状态。
1.务必添加超时机制:如代码示例中的while循环配合utime.ticks_diff()检查。
2.检查代码:避免在循环中不断创建新对象(如列表、字符串)。使用micropython.mem_info()查看内存使用情况。
3.检查硬件:紧固所有连接,或换用质量更好的杜邦线和面包板。

6.2 使用逻辑分析仪进行深度调试

如果软件排查都无效,问题可能出在硬件时序上。这时,一个几十块钱的逻辑分析仪(比如 Saleae 的克隆版)就能派上大用场。它可以同时抓取 Trig 和 Echo 引脚上的数字信号波形。

连接与观测

  1. 将逻辑分析仪的两个通道分别接到 Trig 引脚和 Echo 引脚。
  2. 设置合适的采样率(如 10MHz)和触发条件(设置为 Trig 通道上升沿触发)。
  3. 运行测距程序。
  4. 观察抓取到的波形,你应该能看到:
    • Trig 引脚上有一个清晰的、宽度约 10μs 的高脉冲。
    • 在 Trig 脉冲结束后,经过一段空闲时间,Echo 引脚会拉高,并持续一段时间后拉低。

通过波形诊断问题

  • 没有 Trig 脉冲:说明 Pico GPIO 输出或连接有问题。检查代码引脚定义、GPIO 模式(Pin.OUT)、以及物理连接。
  • 有 Trig 脉冲,但没有 Echo 高电平:说明传感器没有工作或没有收到回波。检查传感器供电(5V)、GND、以及电平转换器 HV 侧连接。确保前方有障碍物。
  • Echo 高电平脉冲宽度异常:如果脉冲宽度极短(几微秒)或极长(数毫秒),可能是收到了错误反射(如传感器对准了边缘)或模块本身故障。
  • Echo 高电平电压不足:如果测量到 Echo 高电平只有 3.3V 但模块是 5V 供电,说明电平转换器工作正常。如果 Echo 高电平达到了 5V 但直接进入了 Pico GPIO,请立即断开连接,否则会损坏 Pico。

这种“眼见为实”的调试方式,能让你彻底理解传感器的工作流程,并对硬件连接的正确性有百分之百的把握。

7. 项目扩展与进阶思路

一个能稳定输出距离数据的系统已经完成了,但这只是起点。基于这个核心,我们可以拓展出许多有趣的应用。

7.1 添加可视化输出:OLED 显示屏

将距离实时显示在屏幕上,比看串口打印直观多了。我们可以使用常见的 0.96 英寸 I2C OLED 屏幕(SSD1306 驱动)。

from machine import Pin, I2C import ssd1306 # 需要提前将 ssd1306.py 驱动文件上传到 Pico # 初始化 I2C 和 OLED i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000) oled = ssd1306.SSD1306_I2C(128, 64, i2c) # 在测距循环中更新显示 sensor = HCSR04(14, 15) while True: dist = sensor.distance_cm() if dist: oled.fill(0) # 清屏 oled.text("Distance:", 0, 0) oled.text(f"{dist:.1f} cm", 0, 20) # 可以简单画一个条形图 bar_length = int(dist) if dist < 128 else 128 oled.fill_rect(0, 40, bar_length, 10, 1) # 画实心矩形 oled.show() utime.sleep(0.2)

7.2 构建简单报警器或安全距离检测

结合一个蜂鸣器或 LED,当距离小于某个阈值时触发报警。

buzzer = Pin(13, Pin.OUT) # 无源蜂鸣器接 GP13 warning_distance = 20.0 # 厘米 while True: dist = sensor.distance_cm() if dist and dist < warning_distance: buzzer.value(1) # 蜂鸣器响 print(f"警告!物体过近: {dist} cm") else: buzzer.value(0) # 蜂鸣器关闭 utime.sleep(0.1)

7.3 多传感器与角度扫描

在机器人项目中,通常需要多个传感器覆盖不同方向,或者用一个传感器配合舵机进行扫描。

多传感器分时复用:为了避免多个超声波传感器同时发声波互相干扰,必须让它们轮流工作。可以为每个传感器创建一个独立的HCSR04对象,在主循环中依次测量,并在每次测量间加入足够的延迟(如 50ms)。

舵机扫描:将传感器安装在一个舵机上,通过 PWM 控制舵机转动到不同角度,在每个角度进行一次测距,从而绘制出前方环境的简单轮廓。这涉及到舵机控制(另一个 PWM 输出)和角度-距离数据的记录与处理,是迈向自主导航机器人的重要一步。

从点亮一个 LED 到让机器人感知世界,硬件项目的乐趣就在于这种层层递进的构建感。这个基于 Raspberry Pi Pico 和 HC-SR04 的超声波测距项目,提供了一个坚实的起点。它涉及的硬件接口、电平转换、时序控制、数据滤波和调试方法,是嵌入式开发中最核心、最通用的技能。希望你在动手实现的过程中,不仅得到了一个能用的测距仪,更收获了解决实际硬件问题的信心和能力。

http://www.jsqmd.com/news/929303/

相关文章:

  • 初创公司如何与微软生态共舞:从赋能到竞争的生存指南
  • 征集暑期亲子研学北京的靠谱机构,要求经验多,专业程度高 - 品牌2026
  • ImageGlass终极指南:90+格式支持的高效开源图片浏览器深度解析
  • 南昌黄金回收为什么很多人越卖越亏?铭汇黄金回收教你正确变现方式 - 书记啊客户
  • Sunshine自托管游戏串流架构解析与部署实践
  • fdfdf
  • 用Windows批处理脚本5分钟打造《黑客帝国》数字雨屏保
  • 安心联车载油量监控方案:油杆与超声波两种采集方式对比及落地应用
  • 基于Arduino与PIR传感器的智能互动魔镜制作全解析
  • AReaL-SEA未来展望:多模态扩展与商业应用路线图分析
  • Docker--初识Dockerfile
  • 别再只显示字符了!用0.96寸OLED(IIC)玩点花的:动态图标、进度条和简易动画实战
  • 2026 温州脱单认准壹嘉壹!8 年本土老牌婚恋,专业靠谱助你遇见良缘 - 星际AI
  • 2026年柳州螺蛳粉培训口碑排名|走访20家机构+500条真实评价,螺当家凭零捆绑独占鳌头? - GrowthUME
  • 北欧路线老年旅行团排行:游玩体验感好的北欧路线旅行社推荐 - 品牌2026
  • AMD Ryzen处理器深度调试终极指南:三步掌握SMUDebugTool免费开源工具
  • 北京游学机构哪家好?北京游学机构推荐 - 品牌2026
  • 2026盐城奢侈品回收TOP5靠谱商家(实测推荐)遇见奢侈品实报实收! - GrowthUME
  • 鸣潮自动化工具终极指南:5分钟实现后台自动战斗与智能资源收集
  • UABEA终极指南:高效解析和编辑Unity资源的跨平台完整解决方案
  • 保姆级教程:用Operator方式在K8s集群里装Calico网络插件(附VXLAN配置)
  • 国内做北欧线路口碑靠谱、体验好的旅行社有哪些? - 品牌2026
  • 抖音内容管理革命:如何用开源工具批量保存你喜欢的短视频?[特殊字符]
  • Tinkercad与3D打印实战:从电路仿真到无限手套创客项目
  • 基于Arduino Uno的逆向Pong游戏机:从电路设计到3D打印的完整制作指南
  • 3分钟快速恢复Windows 11任务栏拖放功能的终极指南
  • 倾企电子名片介绍-让每一次交换都有价值 - GrowthUME
  • 杭州幼儿园萌宝大赛活动评选,微信投票制作教程 - 投票评选活动
  • 二手摩托车上门验车服务怎么预约? - GrowthUME
  • 京东抢购终极指南:3步实现90%成功率的智能抢购方案