Raspberry Pi Pico 2 W: 使用 Rust 构建 Matter Wi-Fi 灯泡
现在可以使用 Raspberry Pi Pico 2 W (RP2350) 并利用 Rust 来创建完全符合 Matter 标准的智能家居设备。通过使用 rs-matter 技术栈和 Embassy async 框架,开发者可以构建仅限本地运行的智能家居硬件,直接与 Apple Home、Google Home 和 Home Assistant 集成,而无需云端账户。
在 RP2350 上实现 Matter
该实现的核心是一个兼容 Matter 的 Wi-Fi 灯泡,它使用蓝牙低功耗 (BLE) 进行初始配网阶段,并使用 Wi-Fi 进行网络连接。该设备通过暴露一个标准的 Matter On/Off cluster 来切换连接到 GPIO 引脚上的物理 LED。
技术架构
- 裸机执行 (Bare Metal Execution): 该项目完全在裸机上使用
embassy-rp以no_std模式运行。 - Async 框架: 使用 Embassy async 框架来管理状态机逻辑,与传统的基于 C 的嵌入式开发相比,这简化了实现过程。
- 无线电共存 (CoEx): 一个关键的技术挑战涉及管理 CYW43439 无线芯片。为了防止在无线电饱和时发生总线损坏,必须调整 PIO SPI 时钟分频器,以适应 RP2350 更快的 150MHz 核心时钟。
- 多路复用 (Multiplexing): 该项目包含一个 async CoEx runner 设置,以便在蓝牙和 Wi-Fi 技术栈之间安全地并发进行无线电多路复用。
Matter 灯泡的硬件与接线
为了复现 Matter 灯泡示例,Raspberry Pi Pico 2 W 通过一个限流电阻连接到外部 LED。
接线图:
- GP15 (Pin 20) $\rightarrow$ 220-330 Ohm Resistor $\rightarrow$ LED Anode (+)
- GND (Pin 18) $\rightarrow$ LED Cathode (-)
使用 Home Assistant 进行配置
该设备旨在无缝集成到智能家居生态系统中。配置过程遵循以下步骤:
- 广播 (Advertising): Pico 2 W 在启动时开始通过 BLE 进行广播。
- 集成 (Integration): 在 Home Assistant 伴侣应用中,用户导航至 Settings $\rightarrow$ Devices & Services $\rightarrow$ Add Integration $\rightarrow$ Add Matter device。
- 身份验证 (Authentication): 用户输入默认设置代码
3497-0112-332或扫描提供的 QR code。 - 连接 (Connectivity): Home Assistant 通过 BLE 传输 Wi-Fi 凭据,随后设备连接到网络,并作为一个标准的灯泡显示出来。
其他 RP2350 Rust 示例
除了 Matter 实现之外,rust-rpico2-embassy-examples 仓库还为 Raspberry Pi Pico n 上的各种外设和传感器提供了系列示例:
I2C 传感器集成
- HS3003: 一款具有 14-bit 分辨率的高性能温湿度传感器。
- ADXL345: 一款具有 13-bit 分辨率的三轴加速度计,支持高达 $\pm 16$ g 的测量。
SPI 显示器与图形
- Zermatt Example: 在 Adafruit 2.2" TFT LCD 上渲染 320x240 图像。
- Zermatt Snow: 一个高级示例,利用了物理引擎和离屏
lcd-asyncframebuffer。它通过 DMA 发送数据以避免阻塞 CPU。
1-Wire 协议实现
- DS18B20: 一款防水温度探头。该实现使用自定义的、周期精确的
PreciseDelay来在 Cortex-M33 核心上实现 1-Wire 协议所需的亚微秒级定时。 - DHT11: 一款低成本温湿度传感器。由于位读取阶段对时序敏感,该示例必须在 release 模式下运行以确保准确性。
社区见解与观点
围绕该项目的技术讨论突显了向更易于使用的嵌入式 Rust 的转变:
"Rust 在嵌入式领域的应用随着 Embassy 和 Pico SDK 的普及变得越来越容易上手... async runtime 使状态机逻辑比 C 语言版本更加简洁。"
然而,一些开发者指出,虽然项目展示了“极低”功耗,但关于特定电池供电运行以及硬币电池是否适用于 Wi-Fi 模块,仍需进一步的文档说明。
其他贡献者强调了 Matter 的基于 IP 的特性,这使得 DIY 爱好者可以“在没有官方 C++ Matter SDK 复杂性的情况下,动手搭建出这样的东西”。