纯软件背景配合 AI 手搓一台全波段收音与双段对讲实验机的两个月记录
目录
声明:本文包含 AI 辅助创作。
TL;DR 这篇博客记录了我从 9 月初到 10 月底,在没有电子电路设计与贴片焊接经验的前提下,配合 Claude Code 与 Codex 从零做完一台全波段广播收音与双段模拟对讲实验机的过程。文章主要分享这台桌面小机器的整体设计,以及这 54 天是怎么一步步推进下来的,包括用脚本驱动嘉立创 EDA 画板,第一版高密度六层板连锡受挫后重画为四块四层大封装板,等板期间的无硬件全栈开发与显微镜手焊,还有整机联调里的几段典型经历。
前言
我平时做的是全栈与客户端软件开发,写惯了 TypeScript、Cloudflare Workers 和 iOS/macOS 原生应用。今年 9 月之前,我还没有画过原理图和 PCB,也没动手做过贴片回流焊,贴片阻容封装规格与钢网开孔规则,还有万用表实操这些硬件常识,基本都是在这次做板子的过程中边查资料边摸索上手的。
起意做这个项目是在 9 月 5 日晚上。当时我给电脑配好了操作嘉立创 EDA 专业版的本地桥接脚本,想试试现在的 AI Coding Agent 能不能跨出纯软件范畴,配合我画原理图和布 PCB。我先拿一块 USB-A 转 Type-C 无源小转接板探了路,确认从原理图绘制到自动布线,再到设计规则检查(DRC)整条链路都能跑通之后,第二天就正式立项了真正想做的桌面设备,一台全波段广播收音与双段模拟对讲实验机。
从功能形态上看,我想把它做成一台摆在书桌上既有实体旋钮手感,又能联网远控的综合无线电实验台。整机围绕 ESP32-S3 主控展开,硬件与软件拼起来一共包含四块核心能力。
- 全波段广播与网络电台。板载
SI4732接收芯片配合拉杆天线与中波磁棒,覆盖调频、中波与短波和长波广播搜台;连上 Wi-Fi 后也可以直接流式解码播放全球在线网络电台。 - UHF/VHF 双段模拟对讲与摩斯码练习。独立射频板上集成了 UHF 与 VHF 两只
SA818S收发模组,配有硬件发射互锁与超时保护,同时内置了摩斯码编解码与收发练习模式。 - 实体面板交互与独立音频链路。正面是一块 3.5 英寸
480×320彩屏,搭配六颗物理按键、侧面模拟音量电位器和带按压的旋转编码器;音频走ES8388独立编解码器,自动切换腔体扬声器与耳机输出。 - 云端后台与原生双端控制软件。除了本机旋钮操作,设备还同时维持蓝牙、局域网与 Cloudflare 云端长连接,可以通过网页控制台或 macOS/iOS 原生 SwiftUI 应用远程调频、管理预设频道并下发双槽无线升级。
这里也要特别说明一下无线电合规要求。普通调频与中短波广播属于纯接收范畴,而涉及无线电对讲与业余频段的信号收发受国家无线电管理法规严格约束,实际开展无线电收发通联前,必须依法考取相应的业余无线电台操作证书并办理无线电台执照,严格在核准频段与功率限额内合规使用,切勿无照发射或占用非核准频点。这台实验机目前在固件层也默认锁定在只收不发保护态。
从 9 月初敲下第一行探路指令到 10 月底合入第 357 笔代码提交,前后历时 54 天,我在 Claude Code 和 Codex 里累计交互了八百多次。目前四块四层 PCB 都已经由我自己刷锡膏上加热台焊接完毕,立在桌面上稳定运行。趁着硬件主体告一段落,我把这段跨界做硬件的大致流程整理出来做个分享。
从两块六层板推翻重画为四块四层板
用脚本驱动嘉立创 EDA 画板
让 AI 画板子的第一步,是打通它和嘉立创 EDA 专业版桌面客户端之间的控制通道。我们在客户端里挂了一个本地扩展插件监听端口,外部由自研的命令行工具 eda-toolkit 发送操作指令。
最初尝试逐条调用官方图元接口画线时,几百个元器件的整板规模很快就触发了进程间通信超时。我们研究了客户端的原生文档格式,改成离线读写整板 JSON 源码的方案。脚本先把整板文档一次性导出到本地,在外部 Node.js 进程里跑完器件摆放、网格自动布线和电源过孔缝合,最后再一次性写回客户端并刷新铺铜和 DRC 状态,五千多段走线写回只需要 1.5 秒。
这一阶段也摸清了两个 AI 工具的分工特点。早期跑整板自动布线时,单个 Agent 很容易在无人值守循环里卡在最后几百根飞线上空转,后来遇到复杂脚本编排我们就让 Claude Code 与 Codex 互相审阅方案,推进顺畅了不少。
不过纯靠脚本算坐标摆器件,很快就出了一次让人哭笑不得的乌龙。有一次 AI 汇报说所有器件坐标无重叠且 DRC 零报错,我导出预览图一看,3.5 毫米耳机插孔和旋钮居然被摆在了电路板正中央,ESP32 板载天线下方也没留净空。装进外壳以后总不能把耳机线插进板子正中间,我截了五张预览图发过去修正布局,也在项目规范里补了一条硬约束,每次改动布局布线后都要导出 2D 与 3D 预览图做目视自检,不能只看坐标数字。
第一版连刷六次锡膏全连锡与推翻重画
第一版(v1)按手持一体机的思路,把近七百个元器件塞进了两块 100×100 mm 六层板里。准备去嘉立创下单时先熟悉了一轮供应链计价规则,因为板载专用芯片大多属于需要逐项收换料费的「扩展库」元件,两片控制板的 SMT 贴片报价高达 1686 元;去立创商城自动配单时,还碰上过海外渠道电容整盘两万只起订,以及带 TP 前缀的测试点被自动匹配成几十块钱带灯按钮开关的情况。逐行核对把整套元器件成本压回七百多元后,我决定省下上千元的贴片费,花 85 元 开一张无框钢网,再买一台百元级桌面恒温加热台回来自己手工贴片回流焊。
真正的转折发生在 9 月 20 日晚上。v1 控制板和钢网到货后,我第一次拿着刮刀往板子上刷锡膏,结果连续刷了 6 次擦掉重来,每一次都在还没放元器件之前就出现了大面积连锡。
明明客户端严格 DRC 是零错误,下单平台的可制造性检查也全部通过,为什么一刷锡膏就全糊在一起?当晚写脚本去扫 Gerber 锡膏层的开孔轮廓才找到原因。无论是客户端 DRC 还是平台检查,都只校验铜皮间距与阻焊桥,完全不检查不同网络的钢网锡膏开孔间距。v1 为了塞进高密度器件,用了大量 0603 小阻容和 0.5 mm 密脚排线座,全板有十几对异网锡膏开孔间距不足 0.20 mm,不少库封装自带的锡膏开孔甚至比底下的铜焊盘还要大一圈,新手手工刷锡膏几乎没有容错空间。
看着擦了六遍的控制板,我当晚决定不再抢救这套高密度六层双板,直接废弃 v1,重画一套专门照顾手工焊接容错率的 v2 架构。
v2 改成了四张 100×100 mm 四层板,同时兼顾了打样成本、手焊良率与射频隔离三个方面。
- 控制打样成本。
100×100 mm四层普通板正好卡在平台的50 元特价打样档位,同时全板规定零盘中孔,所有过孔一律打在焊盘外侧,避免触发高价的树脂塞孔电镀盖帽工艺,四张板的钢网也按 2×2 矩阵合拼进同一张钢片里。 - 放大封装留足容错。板面积翻倍之后,原先两百多颗
0603阻容全部放大成了肉眼好认且镊子好夹的0805封装,密脚模拟开关拆成大间距单路器件,板间连接也从0.5 mm软排线换成了2.54 mm防呆牛角排线和直插排针。 - 隔离电源开关噪声。我们专门把带有
2.4 MHz开关稳压器的电源板与微弱信号中短波接收板物理拆开,防止开关电源谐波直接耦合进广播接收前端。
定型后的四块四层板叠成左右两摞并排立在机身里,四块板的元件面全部朝外方便拆壳检修。其中右摞是负责充电管理与发射互锁的 P1 电源板,以及承载主控与屏幕按键的 P2 面板;左摞是集成音频编解码与全波段广播接收的 P3 收音板,外加安装双段射频模组的 P4 对讲板。
吸取了 v1 的教训,v2 下厂前我们不再靠大模型直接读网表抽检,把检查逻辑全部沉淀成了包含 40 项硬门禁的自动化脚本 check-v2-all.mjs 与离线电路仿真。脚本每次都会自动核对跨网络锡膏开孔间距与原理图引脚一致性,还会检查器件 3D 本体碰撞以及排针相邻连锡风险。后来钢网厂发回工程确认文件时,厂家工程师把我们已经缩过孔的芯片散热焊盘又二次缩孔过多,也是靠对比脚本第一时间发现并改回来的。
等板子期间的软件开发与回板手焊
三层解耦的无硬件全栈开发
四块 PCB 下厂投产到快递寄回有一周多的空窗期。我没有买开发板过渡,趁着等板子的时间先让 Claude Code 与 Codex 交叉评审出开发计划,把固件、云端后台和控制端软件写完测透了。
为了让基于 ESP-IDF 的 C++17 固件在手头一块单片机都没有的情况下也能充分验证,我们把固件拆成了严格解耦的三层架构。
macOS 主机测试与渲染环境 ESP32-S3 真机运行环境
───────────────────────── ─────────────────────
doctest 单元测试 (287 用例) ─┐
macOS 原生守护进程 (ASan) ─┼─▶ app/ 纯逻辑层 (零 IDF 头文件 / 显式注入时钟)
LVGL 离线快照导出 PNG ─┘ ↓
ui/ 480×320 界面层 (独立字库分区 mmap)
↓
hal/ 板级硬件驱动层 (I2C / SPI / I2S / UART / BLE)
最核心的 app/ 纯逻辑层不包含任何硬件或 RTOS 头文件,所有时间戳由参数显式传入,上下电时序与发射互锁,还有收音对讲协议编解码和双槽配置恢复逻辑,全部可以在 macOS 上用 clang 秒级编译跑完两百多项单元测试。界面层 ui/ 则直接在 Mac 上把 43 张 480×320 中文界面渲染成 PNG 图片供我逐页核对排版,同时基于 Cloudflare Workers 的远程管理后台也一并部署就绪。
显微镜下回流焊与切换原生 SwiftUI 控制端
10 月 9 日板子陆续到货。换成 0805 大封装并留足锡膏开孔间距之后,这次四块板刷锡膏和加热台回流焊全部一次成功。
那几天的焊接工作流基本是我坐在加热台和显微镜前动手操作,随时拍微距照片发给 Codex 配合确认。遇到表面只有三个字母丝印的小芯片,或者两根引脚一样长的驻极体麦克风,拍张微距图发过去,Codex 就会翻出原厂封装手册画出极性朝向,再教我用万用表测引脚与金属外壳的阻值做双重确认。每焊完一块板做断电通断检查时,因为万用表表笔很难扎准 QFN 密脚芯片侧翼,我就让它查网表把芯片各引脚映射到外围好下表笔的大焊盘和排针上逐一测量。
10 月 11 日凌晨,P1 电源板与 P2 主控板率先合体点亮屏幕,板载 I2C 芯片组与充电管理,连同蓝牙配网和无线双槽升级一次调通,我在仓库里提交了那句简短的 it works。
同一天早上,我们还把配套客户端从早期探索用的 React Native 切换到了共享代码的原生 SwiftUI,一份代码同时构建 macOS 桌面应用和 iOS 手机应用。原因很实在,桌面硬件联调最舒服的方式就是直接用面前这台 Mac 的系统蓝牙连桌上的电路板边改边测,切到原生 SwiftUI 后彻底摆脱了模拟器不支持硬件蓝牙的限制,配上本地开发证书固定签名后也清掉了每次重编反复弹蓝牙权限框的烦恼。第二天接上 P3 与 P4 并装好拉杆天线和中波磁棒,清晰的 FM 广播第一次从扬声器里响了起来,屏幕 SPI 时钟提到 40 MHz 并加上脏矩形局部刷新后,旋钮调频的读数变化也变得非常跟手。
四板联调里的几段排障经历
四块电路板叠在一起跑起并发业务后,又陆陆续续遇到了几个横跨硬件电路与固件调度的典型问题。
打通免复位 USB 诊断与电池曲线拟合
联调头两天我想检查设备跑了一整天的真实电池放电曲线,当时云端刚好离线,AI 在会话里连着让我去收音机小屏幕上翻诊断菜单,再打开手机 App 手动导出文件发给它。来回传了几次我觉得效率太低,就在会话里商量,既然设备一直插着 USB 线连在电脑上,不如直接把固件接口和电脑端读取脚本做出来,省得每次都要人工翻菜单传数据。
我们很快打通了一条免复位的 @radio USB 串口诊断通道,打开串口时不翻转控制信号,ESP32 不会在连上脚本时被硬件复位,同时还支持一条命令直接拉取设备屏幕帧缓冲生成 PNG 截图。通道建好后,AI 自己拉回了近 14 个小时的连续放电采样,发现旧的静态电压表报 0% 之后机器其实还能继续工作一个多小时,据此重新拟合了五段容量曲线,把电量显示误差压到了 1.6% 以内。
掐秒表抓十秒断音与内外内存分流
刚听上 FM 广播那天深夜,我听出扬声器每隔大约十秒就会短暂中断一下,听感跟无线信号波动完全不同。第二天看双端 App 面板和播放在线电台时又抓到了同类现象,充电图标每隔 10 秒就会闪断一次,而且播放在线电台期间正面六颗物理按键全部失灵,唯独侧面的模拟音量滚轮还能正常调音量。
我盯着电脑时钟记下连续三次断音的秒数发给 Codex,顺着「10 秒整周期」这条线索很快就查到了原因。固件每隔 10 秒向充电芯片重写寄存器喂看门狗时,误把整份电源与扩展引脚快照标成了无效,导致下层耳机检测以为采样异常,瞬间拉低功放静音;而播在线电台时音频搬运拉长了主循环耗时,又让电池采样超时连带清空了按键去抖计数。把按键和耳机状态机从电池采样周期里拆出来独立维护后,周期断音和按键失灵同时解决。
紧接着把蓝牙、云端长连接和网络电台一起跑起来之后,固件又开始报内存分配失败。外部 8 MB PSRAM 明明还空着近 7 MB,片上内部内存的最大连续块却只剩三千多字节。查 ESP-IDF 约束才搞清楚,擦写闪存的任务栈以及屏幕和音频的硬件 DMA 缓冲必须留在片上内部内存,而蓝牙和 Wi-Fi 在开机时早就把内部堆切碎了。我们把普通队列和蓝牙缓冲迁到外部 PSRAM,再调整开机顺序赶在无线协议栈初始化前预留好连续 DMA 空间,内存告警就彻底消掉了。
万用表联合寄存器确诊芯片引脚损坏
10 月底测试往对讲模块写入中继台接收频率与亚音参数时,固件总是返回错误拦截,提示物理 PTT 发射键正处于按下状态,拒绝在发射期间改频。这也让人想起了两周前静置测试无线升级时,偶尔也会报设备忙拒绝安装。
PTT_N 是低电平有效信号,经上拉电阻连到主控模组的第 34 脚(GPIO41)。我起初怀疑是不是板间排线压歪对地短路了,断开电池拿出万用表从排线座一路量到主控模组焊盘边缘,通电闲置态对地电压全都是正常的 3.22 V 高电平,跟相邻引脚也完全开路;可另一边通过 USB 诊断去读芯片内部的输入寄存器,连续采样两千次读出来的全都是 0。
外部焊盘明明量着 3.22 V,内部寄存器为什么一直读出 0?为了在不拆芯片的前提下排除模组底部焊盘虚焊,AI 写了一小段测试逻辑,临时把 GPIO41 配置成输出模式依次驱动低电平和高电平,我拿万用表表笔点在外围排线脚上观察。结果输出低时外围电压立刻降到了 0 V,输出高时又回到了 3.2 V。这就证实焊盘、封装键合线和输出驱动级全部完好,唯独这颗模组第 34 脚内部的输入缓冲器发生了物理损坏,恒定输出逻辑 0。我们在正式固件里先把该引脚屏蔽进只收不发安全态,补齐了频道与亚音开机记忆,留着后续飞一根细线改接到闲置的 GPIO46。
目前的整机状态与待收尾项
由于仓库里还存着不少打样期间的原始工程快照与本地配置,这个项目的代码仓库暂时设为私有,等后续整理脱敏后再考虑公开。截至目前,桌上这台四板实验机的运行状态如下。
已在四板实机上正常工作的部分
- 电源管理与充放电计量。协处理器按键上下电,USB 主机与独立充电头输入限流自动识别,三路电流电压采样以及实测拟合的五段容量曲线。
- 屏幕交互与全波段广播。3.5 英寸彩屏
40 MHz局部刷新界面与多套日夜主题,SI4732调频、中波及短波搜台收听,外加 Wi-Fi 在线网络电台流式播放。 - 双段对讲接收与三通道远控。UHF 与 VHF 双模组串口写频、亚音配置与开机频道记忆;蓝牙、局域网与 Cloudflare 云端三通道同时在线,支持跨网双槽无线升级、免复位 USB 诊断及 macOS/iOS 原生 SwiftUI 双端应用。
还在推进的硬件收尾项
- 对讲物理
PTT飞线与合规测试。目前固件处于只收不发保护态,后续完成GPIO46飞线与更换侧边轻触按键后,将在假负载及持照合规前提下按规范开展射频测试。 - 3D 打印桌面外壳与外设联调。圆角浅色面板的桌面式外壳方案已经选定,后续完成实物测绘后送打装壳,长波磁棒线圈与实体摩斯电键也将陆续接入验收。
目前这四块板子平时就立在我显示器旁边播调频广播和网络电台。等后面抽空把 GPIO46 的飞线焊上,再装进 3D 打印的桌面外壳里,这台小机器就算正式收工了。

