改造廉价的自行车灯
扫描二维码
随时随地手机看文章
最近我搬到了一个新的城市,这里有了一个更加完善的公共交通系统,且对汽车的依赖程度降低了。因此,我开始将骑自行车作为日常通勤的一部分,有时在某些天晚上也会骑车出行,这取决于我的日程安排。为了在这种情况下让自己更显眼,我决定在亚马逊上购买一套价格低廉且可充电的自行车灯。
从贴合度和做工质量来看,它们显然并非最佳选择,但截至目前,它们已经满足了我最核心的需求,即降低我被 Waymo 车辆撞到的可能性。
然而,尾灯的设计中有一个细节让我极为不满:那就是其照明模式。
我不知道为什么这被视为一项必要的功能,但这些灯有 4 种不同的照明“模式”,你可以依次切换这些模式,其中包括高亮度、低亮度、缓慢闪烁和快速闪烁。虽然这看起来可能只是一个微不足道的小问题,但在过去的几周里,每次要按 4 次按钮来打开灯光已经变得相当麻烦了。
计划
你可能会想,那为什么不找一款开关设计更简单的灯呢?或者自己设计一款灯?或者制定一个策略计划,通过各种日常的自我肯定来改善工作与生活的平衡,并了解其对整体身心健康的影响呢?
嗯……那些选择都太简单了……我知道自己该怎么做……
我花了大量业余时间对一款产品进行逆向工程,而该产品的设计成本甚至还不如一块士力架那么高,但为了解决一个对我来说都近乎苛刻的问题,我却要费这么大劲……这已经算是相当费劲了。
我对于这个项目的目标非常明确:
将光线调整为仅一种模式,比如我一直以来主要使用的那种闪烁模式。
尽可能多地重复利用原有的灯具,包括原有的外壳、电池和印刷电路板。
起初,我对第二项内容有所担忧。主要是因为我认为这个灯可能采用了一种极其廉价、无品牌标识的微控制器或专用集成电路(ASIC)来制造,而要获取其数据手册或者将其与工具链配合使用以重新编程(如果它具备这种功能的话)将会非常困难(很可能是一次性可编程的,甚至是掩模只读存储器)。
为了避免这种额外的时间浪费,从一开始我就决定要围绕着用我熟悉的器件(比如 ATtiny 或 PIC)来替换微控制单元这一思路来进行规划。
打开这个东西
由于这些产品在任何天气条件下都需具备“无惧风雨”的特性,因此我们采取了多种措施来确保其外壳的防风防雨性能。具体来说,我们不仅将透明的光线边框与黑色后壳密封在一起,还为微型 USB 充电口添加了一个橡胶塞。
是的,很遗憾的是,到 2026 年这款产品还是会配备 microUSB 接口……考虑到这种设计可能早在 USB-C 或者像我这样对“无插针”接口嗤之以鼻的人还在婴儿车里蹒跚学步之前就已经开始流行了,我就不必太苛责他们了。
要将边框从后壳上分离下来,我只需用一字螺丝刀在灯的边缘施加轻微的力即可。在这里我非常小心,因为在我完成“设计修改”后,我打算将这些部件重新粘回去。
借助一点力度和技巧,这个双层壳体便缓缓打开,露出了一个晶莹洁白的印刷电路板组件,其中包含了所有的内部电子元件。
逆向工程
为了弄清楚我所处理的是什么情况,我决定先对电路图进行逆向工程。幸运的是,由于该设备成本低廉且技术上较为简单,所以这是一个相对容易完成的任务,只需要一台数字万用表和良好的视力即可。
首先,该设备的主要电源是一个 330 毫安的锂聚合物(LiPo)电池,它直接焊接到我所认为的底部的印刷电路板上。在底部还有通过微型 USB 连接器提供的充电输入接口。仔细观察就会发现,该连接器中只有引脚 1 和 5 被使用,因为这个连接器仅用于供电,D+/D- 线路是未使用的。
+5V VBUS 电源连接到一个 SOT23-6 封装上,该封装是一个线性、单单元的锂离子/锂聚合物充电控制器(FM 9017R)。一个 2.8k 的下拉电阻连接到它的 PROG 引脚,用于将其配置为 392 毫安的充电模式。9017R 有两个开集输出,用于根据电池充电状态控制指示灯。
这款灯的主要控制芯片是一个常见的未知型号,很可能是 8 位微控制器,其信息已被激光/砂磨掉,从 SOIC-8 封装中剥离出来;如果它原本就存在的话。信不信由你,当我透过玫瑰色的灯罩看到这个设备时,竟然出乎意料地令我感到惊喜,因为我原本预期的是“球顶式”封装,即芯片直接与电路板连接,顶部覆盖一层丙烯酸以作保护。而该电路板上采用的是 SOIC-8 封装形式,所以我满怀希望能找到一个具有类似引脚布局的替代微控制器来进行移植。
最后,我发现这块电路板有一种有趣的功能特性,您可能在上面的原理图中已经注意到了:每个 LED 都与一个专用的 GPIO 引脚相连接……
这让我感到很惊讶,因为所有的(4 种)照明模式都没有利用这一功能来通过某种动画方式单独照亮每个 LED。我猜测这是为了避免超过每个单独 GPIO 输出的电流额定值,或者是为了避免在单个引脚上驱动所有 LED 时超出电流限制,或者是为了避免增加额外的 BOM 成本(即添加一个单独的晶体管作为缓冲器)。
仍然很好奇他们为什么没有至少添加一种连续模式来利用这一功能……我知道我必须在我的更新设计中利用这个“隐藏机制”!
选择一款新的微控制器
既然我已经有了该印刷电路板的逆向工程原理图以及原微控制器的引脚图,那么我就准备为这个东西设计一个新的“大脑”了。
查看原始的 MCU 接口图,我们需要找到一个符合以下条件的设备:
•SOIC-8 封装
•电压范围应在我们锂聚合物电池的电压波动范围内。
•VCC 位于第 1 号引脚上
•GND(接地)连接在第 2 号引脚上
•在第 4 号引脚上设置具有中断功能的输入端口
•低电平输出位于引脚 #2、#3、#5、#6、#7 处。
•之所以选择使用现有的 Arduino 核心,是因为我比较懒。
我首先整理了几个我知道的、封装为 SOIC-8 的产品,并且这些产品可能符合上述要求,然后制作了一个表格,列出了它们的引脚配置。
在对所有选项进行了评估,并对诸如工作电压范围和功耗等其他指标进行了比较之后,我决定选用 ATtiny202 系列,因为它的引脚布局与原设备非常匹配,支持通过(1 个)引脚进行 UPDI 编程,该引脚还能兼作我们的开关输入,并且通过 megaTinyCore 具备与 Arduino 兼容的内核。
更换微控制单元并修改印刷电路板
在从迪吉尼特公司收到新的微控制器后,就该进行移植操作了。我用自己那小巧便捷的热风焊接机拆除了“无名氏”模块,然后安装了我们新购置的 ATtiny 芯片。
HV UPDI 产品与印刷电路板维修服务
您可能在引脚表中注意到的一点是,我需要使用第 6 号引脚(PA0)通过 UPDI 接口来对 ATtiny202 进行编程。此外,我计划在系统启动后将此引脚重新配置为 GPIO,用作我们的模式切换输入端口。
由于在重新配置引脚之前,我们没有专门的复位引脚来锁定 ATtiny 微控制器,因此我们需要利用较新 ATtiny 微控制器的高电压 UPDI 编程功能。这将使我们能够通过我们的编程工具(Adafruit 高电压 UPDI 伴侣)施加 12 伏脉冲来进行重新编程,同时不会丢失任何 GPIO 引脚!
然而,在使用 HV UPDI 引脚作为 GPIO 时,有几件重要的事项需要考虑:
与 UPDI 引脚相连的电路需要能够承受 0.1 至 1 毫秒、12 伏的脉冲信号。
在将引脚配置为输出模式时,编程操作必须在电源切换之后进行,并且要在为 UPDI 引脚设置的 10 毫秒延迟时间内完成。
由于这是我首次使用 HV UPDI 进行的项目,而且我希望它能非常可靠,并且还能在电池焊接好后进行重新编程,所以我决定对印刷电路板进行一些修改,将开关输入改为使用第 6 号引脚,并将第 4 号引脚重新连接到 LED #4 上。
Arduino 脚本和新的 LED 动画
在完成所有元件的焊接后,我连接上了编程器,给所有部件接通电源,然后尝试上传“闪烁”程序,以确保没有在某个环节出错。幸运的是,我的测试成功了,电路板也成功地亮起了闪烁的光!
如前所述,我原本希望利用每个 LED 都与独立的 GPIO 引脚相连这一特点,添加某种顺序输出功能。最终我决定采用逐级向内的渐暗效果,每阶段之间设置 250 毫秒的延迟。
由于我想要尽可能降低睡眠时的电流消耗,所以在输出关闭时,我会让微控制器进入休眠模式。这样能显著降低静态电流消耗,这一点我们稍后会进行测量。
最后,由于机载触觉开关存在轻微的触点反弹现象,所以我添加了一些计时逻辑,以避免在激活后的 50 毫秒内再次触发中断。
附加分数:电力消耗测量
还有一个我认为在升级前后进行对比可能会很有意思的因素,那就是设备在睡眠状态以及每种照明模式下的能耗情况。
为了实现这一目标,我使用了我常用的诺帝克半导体 PPK2 来替换原有的 LiPO 设备,并测量了在替换原装微控制器之前以及完成“升级”至 ATtiny 后的设备电流。
根据我的测量结果,我成功将设备的休眠/静止电流降低了 85.7%!这实际上是一个相当不错的“锦上添花”的效果,因为这个灯泡在大部分时间里都会处于休眠状态(想必是很棒的吧......)
我新采用的顺序模式的平均电流比之前使用的 200 毫秒闪烁模式略高一些,但我愿意牺牲一些额外的电池电量,以换取这种酷炫的效果。
结论
这个项目既有趣又简单,让我重新找回了拆解和逆向工程/升级消费电子产品的感觉。
本文编译自hackster.io





