固件概览
设备上实际运行的是什么,以及一个字符是怎么变成光的。
固件是直接运行在设备芯片(一块 Waveshare RP2040-Zero)上的小程序。不是运行在你电脑上的。它用 C++ 写成,基于 Arduino 框架,工作内容很单纯:通过 USB 监听一个字符,然后点亮对应的 LED。
这台设备的早期版本用的是 3 颗独立的彩色 LED,而不是灯带。那版固件还留着做参考,但目前持续开发的是灯带这一版。下面的内容都是围绕当前这版灯带方案来说的。
这篇只讲固件本身(代码、依赖、怎么烧录和测试)。至于物理层面的部分(焊接、接线)请看组装指南,那才是硬件组装方面最权威的说明。
它依赖什么
WS2812 系列的可寻址 LED 需要极其精确的信号时序,精确到普通的"引脚开关"命令根本做不到的程度。Adafruit_NeoPixel 是驱动这类 LED 的标准库,这份固件用的就是它。它对这颗芯片的时序硬件有原生支持,让信号更可靠。
环境搭建
- Arduino IDE 2.x,装好
arduino-pico开发板包。 - 通过 Arduino Library Manager 安装 Adafruit NeoPixel 库。
- 打开
andon_light_firmware.ino:Arduino IDE 会自动把相关的led_controller.h/.cpp和watchdog.h作为额外标签页一起加载进来。
如果还没组装好实体设备,先去完成那一步。参见组装指南的第二部分,弄好之后再回来烧录和测试。
烧录与测试
- 开发板选 "Waveshare RP2040-Zero",然后烧录。
- 打开串口监视器,波特率 115200,换行符选 "Newline"。
- 应该能看到第一颗 LED 亮起微弱的白光,其余全暗。这是刚通电时的正常状态。
- 依次输入
G、Y、R,每次输入后按回车。每输入一次,应该只有对应状态的那 3 颗 LED 亮起,其余保持熄灭。 - 输入
C,确认能看到下面说明的依次点亮模式。 - 如果想不等满 30 分钟就看到"连接中断"的闪烁效果:把代码里的
kWatchdogTimeoutMs临时改成15000,烧录后确认能看到红色缓慢闪烁,然后改回1800000再烧录一次。
再深入一点
关于功率
亮度被特意限制了上限(led_controller.cpp 里的 kBrightness = 130/255),一是为了控制电流消耗,二是避免直视时太刺眼。如果灯光是透过扩散罩之类的东西再看到的,可以适当调高。如果出现闪烁或颜色不对,那是硬件问题(具体是焊接还是接线,取决于你用的哪种组装方式)。参见组装指南里的常见坑,这不是靠改固件设置能解决的。
LED 的排列方式
| LED | 角色 | 颜色 |
|---|---|---|
| 1 | 常亮的"设备正常"指示灯 | 微弱的白光 |
| 2-4 | 工作中 | 绿色(G) |
| 5-7 | 等待你处理 | 黄色(Y) |
| 8-10 | 空闲 | 红色(R);连接中断时会缓慢闪烁 |
几个细节补充:
- LED 1 在所有状态下都保持微弱白光常亮,包括设备刚关闭的那一刻:它只是一个"板子通电、固件在运行"的独立指示灯,和
G/Y/R这些状态颜色没有关系。 - 每种状态只点亮自己对应的那一组 3 颗:除了 LED 1,其他所有组都保持熄灭。
- 连接中断的闪烁效果只作用在 8-10 号这一组上,使用和依次点亮模式一样的渐变曲线。
- 依次点亮模式(整理中)会用到全部 9 颗非状态灯(2-10 号):一颗点亮的 LED 从第 10 颗往第 2 颗方向移动,移到哪里就固定在哪里;下一轮会固定它旁边那一颗,依此类推,直到全部 9 颗都亮起,然后重置重新开始。
如果你想知道具体数值,可以看 led_controller.cpp 里的 kGreenStart/kYellowStart/kRedStart/kStatusPixel。
通信协议参考
| 指令 | 效果 | 含义 |
|---|---|---|
G | LED 2-4 常亮绿色 | Agent 正在工作 |
Y | LED 5-7 常亮黄色 | 等待你输入或授权 |
R | LED 8-10 常亮红色 | 空闲、已停止,或连接已断开 |
C | LED 2-10 依次点亮模式 | 内部整理中("整理中"):Agent 仍然活着,只是在收尾 |
H | 没有视觉变化 | 心跳信号:不改变颜色,只重置看门狗 |
如果设备 30 分钟没收到电脑的任何消息,就会认为连接已经断开,自动切换成缓慢闪烁的红色模式,而不是停在原来的状态上一动不动。