RGB LED 支线任务 💡
Source: Dev.to
欢迎回到我的旅程 从尘埃到机器人梦想
虽然构建机器人的主线是一个长期任务,但有时你需要进行支线任务,以掌握“神经系统”的基础原理。
今天的任务: 多LED颜色混合与串口调试的隐藏陷阱。
我发现自己手头有一个RGB LED,于是决定在保持黄灯原样的前提下,重新接线现有的红、蓝、绿LED。目标是使用脉宽调制(PWM)实现红、绿、蓝之间的平滑过渡,并让黄灯根据红色和绿色通道的重叠程度来发光。
“繁琐”硬件
第一课副本任务:物理世界很混乱。
RGB LED 的搭建非常繁琐——线很容易交叉,而且必须非常仔细地使用电阻,以保持信号清晰并保护元件安全。
遇到 “Lag” 怪物
一旦我让 LED 同步,我就想实时监控数值的变化。但这 并没有 按我预期的方式工作。突然,同步消失了——黄色 LED 开始卡顿,且无法在正确的时机点亮。
有问题的代码
void updateLEDs() {
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
// Serial output inside the main update loop
Serial.print("R: "); Serial.print(redValue);
Serial.print(" | G: "); Serial.print(greenValue);
Serial.print(" | B: "); Serial.print(blueValue);
Serial.print(" | Y-LED: "); Serial.print(yellowBright);
// ... this was slowing everything down!
}
在默认的 9600 波特 下,串口通信相对较慢。每当代码执行到这些 print 语句时,循环会暂停以发送数据。这会在 PWM 信号中产生一次 “卡顿”,导致 LED 闪烁,时序感觉 “不对”。
优化修复
为了解决卡顿并恢复平滑的淡入效果,我采用了两项关键修复:
- 波特率提升 – 将速度从 9600 提升至 115200(在代码和 IDE 配置中均已更新)。
- 定时打印(非阻塞) – 不再每个循环都打印,而是使用计时器(
millis())每 100 ms 更新一次串口输出。这样可以让处理器专注于 LED 脉冲。
void updateLEDs() {
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
int yellowBright = (redValue 100) {
Serial.print("R:"); Serial.print(redValue);
Serial.print(" G:"); Serial.print(greenValue);
Serial.print(" B:"); Serial.print(blueValue);
// Added a small offset (+5) so the yellow line is visible on the plotter
Serial.print(" Y-LED:"); Serial.println(yellowBright + 5);
lastPrintTime = millis();
}
}
新工具使用解锁:串行绘图仪
我还花了一些时间使用 Arduino IDE 的 Serial Plotter(Tools > Serial Plotter)。这是一款用于可视化颜色变量如何以波形振荡的绝佳工具。
我必须多次迭代才能让黄色线正确显示。因为它的数值与红色或绿色线相同,导致被它们遮挡。给打印语句加上一个小偏移量(+5)后,黄色线终于显现出来!
一个小谜团:我还没弄清楚如何让绘图仪中的线条颜色实际匹配我输出的 RGB 颜色。IDE 似乎会根据变量的顺序自动分配颜色。如果有人有这方面的技巧,请在评论中告诉我!即使颜色不匹配,实时看到波形重叠也对调试逻辑有很大帮助。
关键要点(针对 Droid 构建)
- 通信开销: 考虑一下你的微控制器在“说话”多少——这可能会减慢它的“思考”。
- 可视化胜于文字: 数据以波形呈现要比一长串滚动数字更容易消化。
- 时序: (在此继续你的笔记……)
全部
不要仅仅默认使用 delay()。millis() 允许多任务处理,而 delay() 实际上会让 Arduino Uno 进入休眠状态。
祝构建愉快,愿你的 LED 总是平滑混合!


