{ Mario Zechner } developer • coach • speaker

Boxie - 为3岁孩子打造的永远离线的音频播放器

2025-04-26 致敬 Gameboy 的精神 目录

在 2024 年 7 月底,我开始学习电子技术,以便为我的儿子制作一些小玩意。在我的介绍性文章中,我描述了他经常使用的一些电子玩具,包括 Tonie Box,这是一款播放有声读物的设备,并且拥有一个巨大的内容库。Tonie Box 很棒,但也有不足之处。正如我在之前的文章中提到的,它存在一些缺陷。当时,我并不认为我能够自己制作一个替代品。 几个月过去了,我已经学到了足够的电子技术来为我的儿子制作自己的音频播放器。以下是初步结果: 自 2025 年 1 月以来,它一直处于“生产”状态。无论是早餐桌上还是在婴儿车中散步时,它都是他的日常用品。是的,音量控制是反向的。这在软件中很容易修复。

过去几个月的学习心得

事实证明这比我想象的要容易。我不得不掌握以下技能:

我还不得不为自己购买一些工具。这是我的战斗站。 Battle Station 我所有工具的清单(附带购买链接):

现在,我最近的博客条目可能让你认为我会教你达到这个阶段所需的一切。恐怕事实并非如此。这将需要相当多的资源,我宁愿花在我的家人和个人项目上。 但是,一旦你完成了“用 Arduino 让 LED 闪烁”的阶段,上面的工具和技能列表就是一个很好的起点。许多才华横溢的人已经在书籍或视频中深入描述了 (SMD) 焊接、PCB 设计和 3D 建模,这比我能做到的要好得多。有关建议,请参阅我之前的文章。 与软件一样,研究现有设计也是一种极好的学习方式。例如,所有 [Adafruit 产品]都是开源的,让你研究它们的原理图和 PCB 设计。想要设计一个电源管理电路?查看他们的 PowerBoost 1000 原理图和 PCB 布局文件。同样,在创建基于 ESP32 的开发板时,我从 Unexpected MakerWaveshare 的设计中汲取了灵感。例如,查看 [Waveshare ESP32-S3 Mini 原理图] (https://www.waveshare.com/wiki/ESP32-S3-Tiny)。 我最后的建议是尽快远离 Arduino。它是学习的好方法,但最终你需要更深入一层。这将开启一个全新的可能性世界。比如将 DOOM 移植到 ESP32-S3 并以 44FPS 的速度运行它。 最终,你将编写自己的类似 Arduino 的框架来处理所有底层内容,例如与 SPI 显示器通信、驱动音频或 neopixels 等。我进入此领域的入口是 mcugdx,这是一个基于 ESP-IDF 的简单 C-API,它已经可以做很多事情(至少在 ESP32-S3 上)。你也可以在 mcugdx 示例中找到上述 DOOM 移植。我目前不提供支持或文档。如果你熟悉 ESP-IDF,你应该能够根据示例和存储库中的 sdkconfig 文件来弄清楚。 在本帖的剩余部分中,我将介绍 Boxie 的设计过程,带你了解原理图和 PCB 布局,向你展示我如何提出 3D 打印外壳设计,并概述我编写的使所有这些工作的软件。

像 Game Boy,但用于播放有声读物

我首先考虑的是我希望我的孩子如何与该设备互动。我喜欢 Game Boy 的外形,所以我想要一些尺寸和形状相似的东西。它需要用电池供电以便于携带。 我想要一个简单的旋钮,而不是 Tonie Box 用于控制音量的耳朵。Tonie Box 需要用力敲击才能更改章节或歌曲,这很少有效,并且经常会把 Tonie 人偶从上面敲下来。我选择了简单的导航按钮。 至于内容存储,Tonie Box 将音频保存在 SD 卡上,Tonie 人偶充当 RFID 标签,触发特定的音频文件。这需要互联网连接才能下载文件,并且可能会让该公司获取使用数据。 我不想要这些。该设备应完全离线,内容以“物理”方式提供,就像我年轻时的盒式磁带一样。Game Boy 卡带外形非常完美,但带有一些曲折。与 Game Boy 不同,Game Boy 卡带的标签会部分消失在卡槽中,我希望卡带标签始终完全可见。 这个决定来自我在车里观察我的孩子。当我们通过 Android Auto 和 Spotify 听有声读物时,他会全神贯注地观看仪表板上显示的封面图。这些封面显示了故事中的角色,每本书都不同。让卡带可见让他可以在听的时候看到艺术作品。 是的,突出的卡带有潜在的断裂点,但我会使设计足够坚固以应对它。 为了可靠性,我希望该设备尽可能地安全可靠。无需电源按钮,插入卡带即可打开,取出卡带即可关闭。它应该能够承受不可避免的跌落,这意味着使用耐用的 NiMH 电池而不是 LiPo 电池。 总而言之,该设备需要:

卡带

由于我使用 ESP32-S3 作为大脑,因此我选择了 micro SD 卡作为存储音频文件的介质。通过 ESP-IDF 访问 SD 卡上的 FAT 文件系统非常容易。只需将 SD 卡的引脚连接到 ESP32-S3 的 GPIO,然后使用 SD 卡 API 即可。 为了引发 Game Boy 卡带的感觉,并使插入和取出卡带变得容易和坚固,我设计了一个自定义 PCB,该 PCB 可以固定并暴露 micro SD 卡的引脚,以及一个 3D 打印的盖子,我可以将标签贴在上面。你可以在这个给 SO 的教学视频中查看最终结果,以便她也可以组装卡带: PCB 是一个简单的 2 层板。micro SD 卡插座可以固定卡。每个引脚都暴露于 PCB 底部相应的较大焊盘上。四个 M2 螺丝孔允许我拧上 3D 打印的盖子。 为了确定尺寸,我在毫米网格纸上绘制了一堆矩形,然后选择了看起来合适的矩形。在了解尺寸时,网格纸是你最好的朋友! 我在 Fusion 360 中设计了盖子。我将 PCB 设计从 EasyEDA 导出为 STEP 文件并导入它。我在 PCB 顶部创建了一个草图,将 PCB 轮廓投影到它上面,然后将其拉伸到看起来不错的深度。最后,我添加了 SD 卡插座的切口、螺丝孔以及标签的缩进区域。这花了 5 分钟。 我将 PCB 设计发送给 JLCPCB 并订购了 100 个 PCB,以及来自 LCSC 的 100 个 SD 卡插座。我还在我的 3D 打印机上打印了 30 个盖子。 然后我开始手工将 100 个 SD 卡插座焊接到 100 个 PCB 上,诅咒自己没有订购模板,也没有使用 JLCPCB 的组装服务。这花了 2 个晚上。我用牙签将焊锡膏涂到焊盘上。 是的,我真蠢。你可能已经注意到上面 PCB 布局上的 2 个电容器焊盘。我最终没有填充这些,这节省了一些时间。

卡带槽连接器

如何将卡带焊盘连接到 ESP32-S3?Game Boy 使用传统的边缘连接器,卡带上带有镀金触点,插槽中带有相应的连接器。 由于我不知道如何在 EasyEDA 中创建“倒角的金手指”或让 JLCPCB 制造此类 PCB,因此我尝试了不同的方法。但在此之前先失败了。 卡带设计灵感来自 Abe 的项目,该项目在卡带阅读器上使用 pogo 引脚来接触卡带焊盘: 这根本不起作用。正确设置垂直间距非常困难,即使有合适的间距,插入卡带对于 3 岁儿童来说也太难了。焊接的 pogo 引脚也很容易弯曲。 在思考了“3 岁儿童友好型”的要求后,我想出了这个: 我使用了电池弹簧,它足够坚固以应对 3 岁儿童的热情。我没有焊接,而是使用压接到电线上的环形端子,并用螺丝固定在 3D 外壳中的电池弹簧上。 结果易于组装、易于维修,并且(到目前为止)坚不可摧。这是第一次插入卡带的测试: 此时,该设备的内部仍然在面包板上,因为我还没有弄清楚外壳的设计。

选择 DAC、功放和扬声器

对于来自 SD 卡的单声道音乐播放,我需要一个数模转换器 (DAC) 来转换和放大来自 ESP32-S3 的数字音频以驱动扬声器。 我选择了流行的 MAX98357A。Adafruit 出售 分线板,并且有许多克隆版本可用。 MAX98357A 是一种单声道放大器,可在 5V 电压下向 4 欧姆扬声器提供高达 3W 的功率。非常适合本项目。它使用 I2S 协议,我的 mcugdx 框架已经支持该协议。 鉴于放大器的规格,我开始寻找一个好的扬声器。我从亚马逊订购了一些符合规格的扬声器,并发现了扬声器外壳设计的艺术。 我选择了 Visaton FR 7/4,它提供良好的带宽,并且音质比 Tonie Box 扬声器更好。

带有电源管理和电池充电的 ESP32-S3 开发板

在开始本项目之前,我实际上涉足了设计自己的 ESP32-S3 开发板。市场上有许多很棒的开发板,其中 WaveshareUnexpected Maker 的开发板是我最喜欢的。但我想学习如何设计这样的开发板,以防我需要市场上没有的东西。 事实证明,我需要的就是这个。现有的开发板都不支持 NiMH 电池充电。它们通常没有内置的欠压保护,而是依赖于通过 GPIO 测量电压,然后将 ESP32-S3 切换到深度睡眠。我想避免这种情况。有些也不能很好地同时连接 USB-C 和电池。这是我的设备的要求,因为我不想仅仅为了连接 USB-C 电缆来刷新新软件或调试而拔掉电池。 我经历了几次迭代,最终得到了这个: 该开发板是我所有项目设计的基础。它的功能并非特定于本项目,而是包括我在所有项目中发现有用的功能:

这是完整的原理图: 让我快速带你了解原理图。

USB-C

![](https://mariozechner.