Added blank lines between images and captions to ensure captions appear on a new row below images instead of on the same line. This follows Markdown best practices where a blank line creates a new paragraph for the caption text. Fixed in both STORY.md and STORY.zh-CN.md for all images.
11 KiB
解决 uConsole 4G 模块之谜:Vibe Coding 编程纪事
「工作/生活中的 Vibe Coding」系列文章 —— 真实的故事,讲述如何在任何地方使用便携设备和现代工具构建定制化解决方案,解决日常问题。
当你的电脑成为它自己的调试环境
想象一下,在咖啡馆里悠闲地调试设备的电源管理问题,直接在该设备上构建诊断工具。不需要台式工作站。不需要"等我回家再修"。只有你、一台口袋大小的电脑,以及在灵感迸发时随时随地解决问题的自由。
这就是我在某个周末解决 uConsole CM5 臭名昭著的 4G 模块死机问题的经历——结果发现问题根本不是功率传输,而是电压下降。
问题:当 4G 模块导致系统崩溃
ClockworkPi uConsole 是黑客的梦想:将树莓派 CM5 塞进翻盖式外壳,配备机械键盘和模块化扩展槽。这是那种让你想要折腾、定制和突破边界的设备。
但有一个令人沮丧的问题。在电池供电时启用 4G 扩展模块,系统会随机冻结——完全卡死。唯一的解决办法?物理移除电池并重启。
论坛帖子充满了各种理论:
- "这是软件 bug"
- "你的电池是假货"
- "电源管理芯片功率不够"
- "你需要买更好的电池"
这些解释都不完整。用户被迫在移动性(电池供电)和连接性(4G)之间做出选择,但无法可靠地同时拥有两者。
我决定调查——但有个特别之处:我将在 uConsole 本身上构建所有诊断工具,同时使用电池供电运行。如果我能用正在经历问题的设备来解决问题,那将证明关于现代开发工作流程的一些深刻见解。
在遇到问题的设备上构建解决方案——真正的 vibe coding 实践
调查:追踪电压
坐在咖啡馆里,uConsole 使用电池供电,我开始构建。首先是一个简单的 Web 应用程序来实时监控电池指标。Next.js 热重载意味着我可以立即看到变化。没有编译时间,没有部署步骤——只有纯粹的迭代式问题解决。
监控揭示了一些意想不到的东西。当 4G 模块激活时:
- 功耗看起来正常(约 8-10W)
- 传输期间电流峰值(高达 2A)
- 但电压... 电压下降到危险的低水平
突破:不是瓦特的问题,而是伏特的问题
经过几个小时的数据手册研究,画面变得清晰:
SimTech SIM7600G-H 4G 模块有严格的电压要求:
- 工作范围:3.4V 至 4.2V
- 最低安全电压:约 3.45V
- 电流消耗:传输突发期间高达 2A
当电压降至 3.45V 以下时会发生什么:
- 4G 模块欠压
- USB 总线挂起
- 系统无响应
- 只有移除电池才能重置
真正的问题: 锂离子电池有内阻。当 4G 模块抽取 2A 电流时,电压会瞬间下降。如果电池已经部分放电或内阻较高,电压就会降至 3.45V 以下 → 立即死机。
这解释了一切:
- ✅ 为什么 USB 供电有帮助(减少电池电流消耗)
- ✅ 为什么有些电池效果更好(内阻更低)
- ✅ 为什么会随机发生(取决于电池状态和负载时机)
洞察:并非所有电池容量都可用
突破来自构建一个新的可视化:电池能量输出 vs 电压——一条放电曲线,绘制剩余容量与电压的关系。
我用 FEB-4000 4000mAh 电池进行了完整测试(100% 至约 2%),在 2 小时 48 分钟内捕获了 4,318 个数据点:
红线显示 4G 模块的最低电压。右侧的所有内容都无法用于 4G 连接。
令人震惊的结果:
- 电池总容量:24.79 Wh
- 3.45V 以上可用容量:13.39 Wh (54%)
- 3.45V 以下不可用:11.40 Wh (46%)
这意味着:对于可靠的 4G 操作,你只能使用大约一半的电池容量。 一旦电压降至 3.45V,你仍然有 40-50% 的电量剩余——但它对 4G 来说是无法使用的。
解决方案:电压感知电源管理
确定根本原因后,修复变得显而易见:在 4G 激活时降低电流消耗以防止电压下降。
策略:
- 检测 4G 模块何时激活(调制解调器状态、网络流量)
- 将 CPU 频率从 2.4GHz 降至 1.8GHz
- 更低的电流消耗 = 更少的电压下降
- 保持电压高于 3.45V 阈值
结果: 电池供电下 4G 运行非常稳定。
为什么 Vibe Coding 有效:零上下文切换的魔力
让我震惊的是:整个项目——从"为什么会崩溃"到"带自动电源管理的生产就绪解决方案"——在两天内大约花了 10 小时。
没有台式工作站。没有示波器。没有单独的测试设备。只有:
- uConsole 本身
- 用于研究的 Web 浏览器
- Claude Code 用于 AI 辅助开发
- 咖啡馆 WiFi
秘诀:
- 即时反馈循环:构建图表 → 实时观察 → 发现电压下降 → 修复 → 重复
- 零上下文丢失:调试环境就是目标环境
- 现代工具:Next.js 热重载、TypeScript 安全性、AI 辅助编码
- 专注的心流:没有分心,没有切换,只有纯粹的问题解决
Vibe Coding 不仅仅是氛围——它是一种高效的、现代的开发工作流程,适用于任何有互联网连接的地方。
构建的内容:实时电池监控 + 智能电源管理
第一阶段:诊断工具(Next.js + TypeScript + Recharts)
电池监控 Web 应用:
- 实时指标(电压、电流、功率、百分比)
- 4 个交互式图表,用于趋势分析
- 会话记录到 SQLite 数据库
- CSV 导出用于深入分析
- 新增:电池能量输出 vs 电压图表(带 3.45V 阈值可视化)
关键发现的可视化:
完整的放电曲线从 100% 到约 2%
电压下降和电流峰值模式
关键图表显示 4G 可用容量 vs 不可用容量
每个会话捕获特定时间段内电池行为的完整画面。我用它来记录智能电源调节器的前后行为。
第二阶段:自动电源管理(Bash + udev + systemd)
监控应用确认了电压下降。接下来,我需要自动缓解:
uConsole 智能电源调节器组件:
-
主调节器 (
uconsole-power-regulator.sh):- 基于 AC 和 4G 状态确定电源模式
- 应用适当的 CPU 设置
- 控制电压监控
- 统一日志记录
-
后台守护进程 (
uconsole-power-daemon.sh):- 每 5 秒监控 AC 电源和 4G 调制解调器状态
- 仅在状态变化时触发调节器
- 处理边缘情况(如服务启动时 AC 已连接)
-
电压监控系统:
voltage-monitor.sh- 电池 + 4G 激活时每 5 秒检查电压voltage-alert-notify.sh- 多方式告警(桌面/音频/日志/LED)voltage-monitor-control.sh- 启动/停止控制器- 当电压 < 3.45V 时告警,速率限制为每 30 秒
-
udev 规则 (
99-uconsole-power-regulator.rules):- AC 电源连接/断开时触发(power_supply 子系统)
- 4G 调制解调器 USB 设备变化
- wwan0 接口状态变化
- ttyUSB 和 cdc-wdm 设备事件
-
安装脚本 (
install-uconsole-power-regulator.sh):- 一键设置,带卸载和升级选项
- 创建日志、设置权限、重新加载服务
- 支持从旧版 4G 电源管理器升级
电源模式:
AC 已连接:2.4GHz(完整性能)- 无电压监控
电池 + 4G:1.8GHz(节能模式)- 启用电压监控和告警
仅电池: 2.0GHz(平衡性能)- 无电压监控
测试结果:
之前:CM5 @ 2.4GHz + 4G = 电压降至 3.45V 以下 → 系统死机
之后:CM5 @ 1.8GHz + 4G = 电压保持 > 3.45V → 稳定运行 ✓
试试看
快速开始:
git clone https://hiwifi.denq.us:8418/denq/battery-monitor.git
cd battery-monitor
npm install
npm run dev # 访问 http://localhost:3000
# 安装 uConsole 智能电源调节器(可选)
cd scripts
sudo ./install-uconsole-power-regulator.sh install
你将获得:
- 实时电池电压/电流/功率监控
- 电池能量输出 vs 电压放电曲线
- 4G 兼容性的 3.45V 阈值可视化
- 智能电源调节(AC 检测 + 4G 状态监控)
- 电池 + 4G 激活时自动电压告警
- 会话记录和 CSV 导出
- 完整的电池测试工具包
→ 需要详细使用指南? 参见 TOOL-GUIDE.md
构建的乐趣
在设备上发现问题并在同一设备上构建解决方案,这种感觉非常令人满足。没有"我稍后再修"。没有上下文切换。只有纯粹的、专注的当下问题解决。
uConsole CM5 现在在电池供电下配合 4G 运行稳定。社区对为什么某些电池效果更好有了新的理解。整个解决方案都是在一个专注的周末通过 vibe coding 构建的。
这就是 vibe coding:在灵感迸发的任何地方,带着喜悦构建定制解决方案。不是因为你必须这样做,而是因为你可以这样做。
工具已经存在。硬件价格实惠。唯一的问题是:你将构建什么?
社区影响
自从分享这一发现以来:
- 多位用户确认电压下降是根本原因
- 基于放电测试改进了电池推荐
- 多位用户采用了 uConsole 智能电源调节器
- 为社区提供了新的电池测试方法
- 根据用户反馈添加了事件驱动的 AC 检测
分享你的结果:
- 使用放电曲线工具测试你的电池
- 在 ClockworkPi 论坛分享发现
- 为电池推荐做出贡献
改进和贡献:
- 改进电池推荐列表
- 添加更多图表和可视化
- 增强电源调节器逻辑
- 支持其他 AXP2xx 设备
资源和参考
硬件文档:
社区讨论:
工具和库:
- Next.js 16 - React 框架
- Recharts - React 图表库
- shadcn/ui - UI 组件
- Claude Code - AI 辅助开发



