固件概览

设备上实际运行的是什么,以及一个字符是怎么变成光的。

固件是直接运行在设备芯片(一块 Waveshare RP2040-Zero)上的小程序。不是运行在你电脑上的。它用 C++ 写成,基于 Arduino 框架,工作内容很单纯:通过 USB 监听一个字符,然后点亮对应的 LED。

这台设备的早期版本用的是 3 颗独立的彩色 LED,而不是灯带。那版固件还留着做参考,但目前持续开发的是灯带这一版。下面的内容都是围绕当前这版灯带方案来说的。

这篇只讲固件本身(代码、依赖、怎么烧录和测试)。至于物理层面的部分(焊接、接线)请看组装指南,那才是硬件组装方面最权威的说明。

它依赖什么

WS2812 系列的可寻址 LED 需要极其精确的信号时序,精确到普通的"引脚开关"命令根本做不到的程度。Adafruit_NeoPixel 是驱动这类 LED 的标准库,这份固件用的就是它。它对这颗芯片的时序硬件有原生支持,让信号更可靠。

环境搭建

  1. Arduino IDE 2.x,装好 arduino-pico 开发板包。
  2. 通过 Arduino Library Manager 安装 Adafruit NeoPixel 库。
  3. 打开 andon_light_firmware.ino:Arduino IDE 会自动把相关的 led_controller.h/.cpp 和 watchdog.h 作为额外标签页一起加载进来。

如果还没组装好实体设备,先去完成那一步。参见组装指南的第二部分,弄好之后再回来烧录和测试。

烧录与测试

  1. 开发板选 "Waveshare RP2040-Zero",然后烧录。
  2. 打开串口监视器,波特率 115200,换行符选 "Newline"。
  3. 应该能看到第一颗 LED 亮起微弱的白光,其余全暗。这是刚通电时的正常状态。
  4. 依次输入 G、Y、R,每次输入后按回车。每输入一次,应该只有对应状态的那 3 颗 LED 亮起,其余保持熄灭。
  5. 输入 C,确认能看到下面说明的依次点亮模式。
  6. 如果想不等满 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。

通信协议参考

指令效果含义
GLED 2-4 常亮绿色Agent 正在工作
YLED 5-7 常亮黄色等待你输入或授权
RLED 8-10 常亮红色空闲、已停止,或连接已断开
CLED 2-10 依次点亮模式内部整理中("整理中"):Agent 仍然活着,只是在收尾
H没有视觉变化心跳信号:不改变颜色,只重置看门狗

如果设备 30 分钟没收到电脑的任何消息,就会认为连接已经断开,自动切换成缓慢闪烁的红色模式,而不是停在原来的状态上一动不动。