基于ESP32-S3开发一个适用于乐高双子星火车的手持控制器
我的孙辈们非常喜欢玩乐高双子星火车。这列火车配有声音输出、RGB前部LED灯以及光学传感器,可对放置在轨道之间的彩色板做出反应。但最棒的是,这款乐高火车可以通过BLE指令进行完全控制,而且更进一步,该协议已由乐高官方文档化。因此,我打算利用这一文档化的BLE协议,为这款乐高火车开发一个简单的手持遥控器。得益于Cornelius Munz开发的Legion库,它支持Arduino工具环境,这对我非常有帮助。
于是,我基于ESP32-S3开发了一个适用于乐高双子星火车的手持控制器,实现了BLE通信、确定性命令处理、重放/录制功能、传感器路由以及低功耗的睡眠与唤醒行为。
概述
本仓库包含控制器的完整实现包:
- 应用逻辑和BLE运行时的固件源码
- 模拟电路/PCB设计文件及制造输出
- OpenSCAD封装源码及3D打印资源
目标硬件为ESP32-S3开发板,配备一个RGB状态指示灯、六个通过ADC电阻阶梯连接的前面板按钮,以及一个带按钮的旋转编码器。
在运行时,固件将BLE处理与UI/控制逻辑分离,并采用基于队列的跨任务通信。其带来的特性包括:
- 连接/重新连接阶段的非阻塞命令流
- 明确区分BLE链路建立状态与应用就绪状态
- 电源循环后稳定的重新连接行为
- 使用固定大小命令缓冲区实现确定性的重放/录制功能
- 支持可控的睡眠进入和定义好的唤醒路径,实现功耗管理
以下是该控制器的一些图片:
控制器主板上仅包含ESP32-S3超级迷你芯片、6个按钮、带按钮的旋转编码器、一些SMD电阻和电容,以及一块小型锂电池。电池可通过连接到USB端口时由ESP32进行充电。ESP32上的RGB LED用于向用户提供反馈信息。
硬件要求
- ESP32-S3 板,带 RGB LED 和 USB-C 充电接口
- ADC 电阻阶梯上带有 6 个按钮
- 带按钮的旋转编码器
- LEGO DUPLO 拼装火车轮毂
硬件图库
控制器与PCB 3D视图
原理图
制造
我多年来一直使用PCBWay进行PCB制造,始终在生产质量、交货周期、发货可靠性以及整体价格方面获得了极佳的体验。
对于本次控制器版本的开发,我也使用了PCB组装服务。结果尤其令人满意:当我于BOM中做出一些轻微的元器件选择错误时,PCBWay工程师主动联系我,及时澄清问题,并在生产前迅速协助解决了所有问题。对于未来更复杂的设计,尤其是SMD元件密度更高的电路板,我现在已将这种组装流程作为首选方式。
当前功能状态
已实现的功能(高层):
- 自动连接DUPLO列车的BLE
- 实际应用中,列车断电后约2至3秒内可重新连接
- 到达就绪状态后立即接受指令
- UI逻辑与BLE通信分离,支持线程安全
- 记录并回放用户交互操作,并附带时间戳
- 处理颜色、速度和电压传感器数据
- 通过稳定性定时器对颜色传感器进行去抖处理
- 无活动5分钟后进入休眠状态
- 可通过编码器按钮唤醒,包括RTC和GPIO的备用方式
- 启动时仅在有意保持编码器锁定的情况下上传窗口
状态指示灯
控制器LED指示当前状态如下:
•黄色闪烁:控制器正在启动
•蓝色闪烁:BLE连接已建立,但集线器初始化仍在进行
•绿色闪烁:集线器正常运行,可执行命令
•绿色偶尔短脉冲:处于运行或空闲状态
•紫色闪烁:正在记录中
•黄色闪烁:正在回放中
•红色常亮:紧急停止已激活
•红色短闪序列:列车低电压警告
•白色闪烁:集线器已断开连接
•5次绿色:唤醒睡眠状态确认
•2次红色:进入睡眠状态提示
重要提示:现在绿色不仅表示“已连接”,更表示“已准备好接收指令”。
控制
•旋转编码器:设置速度(反向、停止、正向)
•短按编码器:从睡眠状态唤醒
•启动时长按住编码器 ≥2 秒:打开10秒上传窗口
•REC:开始/停止录制
•PLAY:播放最新一次录制
•STOP:停止回放/录制,并切换紧急停止
•LIGHT:循环列车灯光颜色
•SOUND:循环声音
•WATER:触发水动作
本文编译自hackster.io





