制作一款功能完整的智能唱机
黑胶唱片的物理仪式感有一种无可替代的魅力——手中唱片的重量,放置时的刻意动作,以及音乐开始前那份期待。数字音乐为我们提供了无限的选择,却也夺走了这种仪式感。
Punarnaada 重新回归。这是一款功能完整的智能唱机,使用定制的 NFC 光盘作为“唱片”。每个光盘都可编程连接至 Spotify 的播放列表、专辑、艺人或歌曲。将光盘放入旋转托盘后,唱机便会与 Spotify 进行身份验证,并开始播放——通过内置真实扬声器,配合托盘那熟悉的怀旧旋转动作,带来沉浸式听觉体验。
但真正的挑战——也是这个项目的核心——在于物理形态。如何手工打造留声机标志性的喇叭形扬声器?
功能
- NFC 记录系统 - 将自定义的 NFC 光盘放置在托盘上,即可立即触发任何 Spotify 内容(播放列表、专辑、艺术家、歌曲或电台)。
- Spotify 流媒体服务 - 通过 ESP32 在 Wi-Fi 上实现完整的 OAuth 2.0 认证及 Spotify Web API 集成
- 裂纹弯曲桦木号角 - 激光切割的桦木胶合板面板,通过裂纹弯曲形成留声机号角的复合曲线
- 旋转托盘 - 带齿轮机构的直流电机在播放时带动托盘旋转,呈现逼真的留声机外观效果
- 内置高保真音频 - PCM5102 I2S DAC → TPA3116D D类放大器 → 5W 8Ω立体声扬声器
- 伴侣安卓应用 - 基于Flutter的应用程序,可将Spotify URI写入NFC光盘,并远程控制播放
- 3D打印黄铜配件 - 装饰性柱脚、角架、颈座 - 涂装以匹配时代风格
记录的URI存储在NFC贴片中,因此可以使用任何材料作为记录。
下图展示了几种不同类型的记录材料:纸板、透明和黑色亚克力。
工作原理 - 用户流程
1. 节目记录
•打开伴侣应用 →
•粘贴 Spotify 播放列表/专辑/歌曲的 URL →
•点击“写入” →
•将空白NFC卡放入托盘中 →
•ESP32 将 URI 写入磁盘 ✓
2. 播放音乐
•将预编程的NFC光盘放入托盘中 →
•RC522 读取光盘 →
•ESP32 重建 Spotify URI →
•Spotify API 开始播放 →
•唱片旋转,扬声器播放,显示屏显示曲目信息 ✓
电子产品
在整洁的木质机身内部,隐藏着一个功能强大的嵌入式系统:两块定制的ESP32板、一个高保真I2S数模转换器、一个类D立体声放大器、位于托盘下方的RC522 RFID读卡器、显示曲目信息的2.8英寸TFT显示屏、用于托盘旋转的直流电机,以及一块定制电源管理板。所有部件通过IDC扁平连接线相互连接,实现了整洁的内部布线。
配套的Flutter应用程序运行在安卓系统上,可让您在几秒钟内“截取”新的NFC记录——将任何Spotify URI写入空白的NFC标签。
为何选择ESP32?共振的核心微控制器
Resonance 基本上是一个 ESP32 项目。选择 MCU 并非偶然——正是 ESP32 独特的功能组合,使得整个概念能够在一款经济实惠的芯片上实现。
Wi-Fi + SPI + PWM + HTTP 服务器——全部功能同时实现。主控制板负责通过 Wi-Fi 进行 Spotify 的 OAuth 和 API 调用,通过精心管理的片选线驱动 SPI 外设,输出 PWM 信号以驱动转盘电机,并同时运行一个 WebServer 实例以接收来自配套应用的指令。在性能较低的微控制器上,这需要依赖外部协处理器,否则就会出现性能瓶颈。ESP32 的双核 Xtensa LX6 架构可同时处理所有这些任务,且无竞争问题。
蓝牙A2DP音频。第二块ESP32利用其集成的蓝牙栈接收A2DP音频——即蓝牙音箱所使用的无线音频协议,并通过硬件I2S外设将音频直接路由至PCM5102 I2S DAC。这一功能并非大多数微控制器(无论价格如何)都具备,而ESP32实现了仅需三条代码即可完成的固件配置。
通过SPI进行NFC标签的读写操作。RC522 RFID模块通过SPI进行通信。
充足的处理余量。Spotify OAuth 需要解析 JSON 响应、管理令牌刷新周期,并通过 HTTPS 构建 REST API 调用,这些任务在计算上并不简单。ESP32 的 240 MHz 双核处理器和 520 KB SRAM 能够高效处理这些任务,同时保持 NFC 报警循环、显示渲染和 HTTP 服务器的响应速度。
在ESP32的价位和外形尺寸下,没有其他微控制器能将Wi-Fi、蓝牙、I2S、SPI、PWM以及TLS/HTTPS处理所需的余量集成到一个单一芯片中。如果没有它,Resonance目前的形态就无法实现。
双ESP32架构:一项有意识的设计选择
Resonance 使用了两个 ESP32 模块——并非因为其中一个不够强大,而是因为将两个独立处理器的职责分开,能带来更清晰、更稳定的系统。
为什么需要两个开发板?
ESP32 的共享 2.4 GHz 无线电支持 Wi-Fi 和蓝牙同时运行,但两者会争夺无线频谱资源。在单个 ESP32 上同时运行主动 Wi-Fi(用于 Spotify API 查询和 HTTP 服务)与蓝牙 A2DP 音频流传输时,会导致音频中断以及两者的吞吐量下降。解决方法是物理分离:一个 ESP32 专用于 Wi-Fi,另一个专用于蓝牙音频。
干扰隔离。基于SPI的外设(如RFID、TFT)会产生开关噪声,可能损坏敏感的音频信号。通过将I2S DAC和音频放大器放置在与SPI总线和Wi-Fi天线物理分离的独立板上,可显著提升音频质量。
故障隔离与开发清晰度。每个板卡都有明确单一的职责,主控板可以独立于音频板进行重新刷写和调试。音频板的固件设计极为精简——只做一件事,并且做到尽善尽美。
该架构展示了两个ESP32如何通过蓝牙A2DP间接通信(一个作为音频源触发器,另一个作为音频接收端),并协同工作形成一个功能完整的系统,各具互补角色——这一模式适用于多种分布式嵌入式物联网产品。
本项目中充分发挥了ESP32的性能
Resonance 不是一个简单的“闪烁LED”的ESP32项目。它同时锻炼了ESP32硬件和软件的广泛功能:
ESP32 的 Wi-Fi 栈负责处理 Spotify OAuth 2.0 令牌刷新以及所有通过 HTTPS 进行的 Web API 调用,包括解析 Spotify 端点返回的曲目元数据(JSON)。此外,在端口 80 上持续运行一个 WebServer 实例,提供 REST 接口,配合 Flutter 应用程序在局域网内发送播放指令。
ESP32并非Punarnaada的辅助组件,而是核心设备。从NFC光盘接触唱盘的那一刻起,到音频通过扬声器传出的那一刻,这款留声机的所有用户交互功能,都经由ESP32的外设、无线电和处理器完成处理。
Punarnaada 采用模块化三板定制PCB架构设计:
主板1:主控板(ESP32-WROOM)
主控板。连接Wi-Fi,处理Spotify OAuth令牌刷新,通过RC522模块(SPI)扫描NFC光盘,使用PWM驱动托盘电机,并运行HTTP服务器,以便Flutter配套应用程序能够发送指令。
功能:
•运行固件,用于与 Spotify Web API 通信,以获取播放列表、曲目详情和播放控制。
•与支持检测NFC标签记录的RFID读取器接口,将这些记录映射到Spotify播放列表。
•驱动直流电机,实现如唱片般流畅的物理运动,强化了唱盘的视觉美感。
RC522 RFID 模块用于读取已编程有 Spotify 播放列表的 NFC 标签。它通过 SPI 与 ESP32 进行通信,使 Punarnaada 能够检测到唱盘上放置的是哪首曲目。RFID 模块通过 IDC 连接器连接,便于线路整齐布线。
板子2:蓝牙音频板(ESP32)
专用音频节点。通过蓝牙A2DP接收音频信号,经PCM5102 I2S DAC转码后驱动TPA3116D类D放大器。与主板隔离,防止音频噪声干扰Wi-Fi/SPI操作。
关键部件与功能:
•ESP32 模块——作为蓝牙接收器,使 Punarnaada 可以作为无线音响系统运行。
•PCM5102 I2S DAC — 一款高保真数字到模拟转换器,可将ESP32的I2S音频输出转换为丰富、无噪的模拟音效。
扬声器连接
扬声器主要由蓝牙板控制,该板搭载了PCM5102 I2S DAC。I2S DAC将ESP32产生的数字信号转换为立体声模拟信号,随后由外部TPA3116D立体声放大器进行放大。该放大器连接至5W 8欧姆的扬声器。
PCM5102 I2S DAC 是 Punarnaada 蓝牙音箱板的一部分,而放大器和扬声器则通过螺丝端子外部连接。TPA3116D 放大器板工作电压为 12-24V,该电源由电源管理板提供。
板3:电源管理板
MP1684降压转换器可提供12V(用于TPA3116D放大器)和5V(用于ESP32模块、RC522和电机)的稳压电源,通过JST端子将电力分配给所有电路板。
•Mini MP1684 降压转换器——提供稳定的12V和5V输出,可同时为放大器(高功率电源)和控制板(逻辑电源)供电。
•电源分配——通过JST端子将电源传输至主板、音频板、直流电机和扬声器
原理图
所有四个PCB均在KiCad中设计。
CAD设计
所有机械和外壳部件均在 Autodesk Fusion 360 中设计完成。
1. 黑檀木胶合板(带裂纹弯曲)
号角是这一结构中最具有挑战性和独特性的部件。留声机号角是一种复合的弧形凸起,无法通过标准的平面弯曲实现。解决方法:开槽弯曲。
什么是开槽弯曲?
开槽弯曲是一种在平板材料上切割一系列紧密排列的切口(称为“切口”)的技术。这些切口会降低材料局部的刚度,使其能够发生弯曲和变形。通过控制切口之间的间距、深度和排列方式,可以精确地控制弯曲的半径和方向。
号角设计流程:
1. 号角轮廓在Fusion 360中被建模为旋转实体——经典的留声机喇叭几何形状。
2. 号角被“展开”成平板状的段落,可从板材材料上切割出来。
3. 每个面板都采用了针对3毫米桦木胶合板优化的开槽图案——槽距经过计算,可使面板在达到所需曲率的同时不出现裂纹。
4. 面板已导出为DXF文件,用于激光切割。
号角制造:
- 材质:3毫米桦木胶合板
- 机器:XTools S1
切口槽的深度约为80%(未穿透整个厚度),在外表面留下一层薄而柔韧的皮肤。
切割后,每块板材略微浸湿以增加柔韧性,然后将其绕成模具形状,并让其自然干燥成型。
多个弯曲的面板通过黄铜绑带连接并加以加固,使号角呈现出分段、带有肋纹的外观,呼应了早期声学号角的结构设计。
2. 八角形底座(CNC铣削胶合板)
留声机主体为八角形箱体,灵感源自古董留声机底座的造型。采用Fusion 360软件设计,并使用12毫米胶合板材质,通过OMAX水刀切割CNC设备加工而成。
多层横截面板材堆叠并粘合,以增加高度,并使底座呈现出坚实、厚重的外观。组装完成后,底座进行了打磨,并使用胡桃木色漆进行表面处理。
3. 3D打印部件(PLA)
所有3D打印部件均在Fusion 360中设计,兼具结构功能和装饰作用。使用BambuLab打印机(A1、A1 Mini、P1S)打印,并以金属黄铜效果漆面完成:
旋转模块
- 旋转托盘模拟黑胶唱片的运动,用于固定NFC记录并提供触觉交互。它包含一个直流电机用于旋转以及轴承以实现平稳运行。内部设有固定核心,内含RFID读取器,外部为齿轮驱动的旋转托盘,与直流电机齿轮啮合。
代码
主板固件
使用Arduino IDE编写,支持ESP32板。
核心职责:
连接 Wi-Fi 并通过 OAuth 2.0(刷新令牌流程)进行 Spotify 认证
在端口 80 上运行一个 HTTP 服务器,以接收来自配套应用程序的命令
持续轮询RC522以获取新的NFC光盘;从两个RFID模块读取Spotify URI
- 当伴侣应用请求时,将Spotify URI写入NFC标签
播放时通过PWM控制盘马达
Spotify API
将ESP32连接到Spotify API
要将ESP32连接到Spotify API,可以使用HTTPClient库进行GET和POST请求。该库允许您向Spotify API端点发送请求,并以JSON格式接收响应。然后,您可以解析JSON数据,提取相关信息,例如曲目名称、艺术家名称和专辑封面URL。这些数据可显示在OLED屏幕上,或发送至已连接的设备进行进一步处理。
为此,我使用了一个名为 Spotify_Esp32 的库。
Spotify_Esp32 文档
要使用该库,您需要在 Arduino 代码中包含它,并使用您的 Spotify 账户凭据进行初始化。该库提供了与 Spotify API 认证、获取曲目信息以及控制已连接设备播放的功能。
这是一个使用该库获取当前播放曲目的简单示例:
在此示例中,ESP32 连接到 Wi-Fi,使用提供的凭据对 Spotify API 进行身份验证,并持续检查当前正在播放的曲目。当检测到新曲目时,它会将艺术家和曲名打印到串口监视器上。
此代码已附在项目中。
蓝牙音频板固件
接收蓝牙A2DP音频,并通过PCM5102 I2S DAC进行传输。结构简单、专用于此功能,且刻意与主板隔离。
伴侣安卓应用(Flutter)
要创建一个与ESP32通信的Flutter应用,你需要在Android Studio中设置一个Flutter项目。创建项目后,可以使用http包访问WebSerial API并连接到ESP32。应用应具备简单的用户界面,允许用户输入曲目、专辑或播放列表链接,并将其发送至ESP32。
在应用程序中,可以使用文本框控件让用户输入URI,并通过按钮将URI发送到ESP32。应用程序还应处理ESP32的响应,并将其显示给用户。
在这个代码中,我们有一个简单的 Flutter 应用程序,它接收一个 Spotify 播放列表链接,提取播放列表 ID,并通过 HTTP 将其发送到一个 ESP32 设备。ESP32 预期运行着一个能够处理传入请求的服务器。
上方图片展示了应用程序的用户界面。下方图片显示了当我在应用程序中向ESP32发送Spotify链接时,Arduino IDE的串行监视器画面。通信方式如前所述,基于POST请求。
你可以看到URI已成功接收,并且可以看到轨道URI。ESP32设备会等待NFC标签,当检测到时,再将URI写入NFC卡中。
上图展示了成功将Spotify ID写入NFC标签的过程
您还可以检测到URI并将其发送至Spotify Web API。下图展示了当检测到带有Spotify URI的NFC标签并将其发送给Spotify时的情况
MVP 应用
该应用可将曲目、专辑或播放列表链接发送至ESP32,而ESP32会向Spotify Web API发送一个PUT请求。
在此应用中,我使用了一个简单的文本框来输入URI,并通过一个按钮将URI发送到ESP32。应用使用http包向ESP32发送POST请求,其中URI作为参数。
该应用程序通过本地Wi-Fi网络连接到ESP32的HTTP服务器,使用户能够:
1. 输入任意 Spotify URI(播放列表、专辑、歌曲、艺术家或电台)
2. Tap Write - ESP32 等待 NFC 光盘被放置后,将其 URI 写入光盘
3. 使用屏幕上的按钮远程控制播放(播放、暂停、下一首、上一首)
在Flutter应用端,使用Dart的http包发送HTTP POST请求。当用户提供Spotify播放列表或曲目URI时,应用会构造一个指向ESP32本地IP地址的HTTP POST请求(例如:http://192.168.xx.xx/uri)。该请求包含Content-Type: application/x-www-form-urlencoded等头部信息,以及包含必要数据(如播放列表URI)的请求体。
ESP32 运行一个本地 Web 服务器,监听预定义路由(如 /uri、/play、/pause)的传入请求。当收到请求时,它会解析数据,执行相应操作,并返回 HTTP 响应——通常包含状态码(200 OK)以及可选的消息,以确认请求已成功接收或处理。
ESP32上的HTTP端点:
| 端点 | 方法 | 操作 |
| `/uri` | POST | 将 Spotify URI 写入 NFC 卡(请求体:`uri=spotify:playlist:xxx`) |
| `/play` | POST | 开始/恢复播放 |
| `/pause` | POST | 暂停播放 |
| `/next` | POST | 跳转到下一首歌曲 |
| `/prev` | POST | 上一首曲目 |
结论
Punarnaada最初源于一个问题:如果黑胶唱片的仪式感延续到流媒体时代,会是什么样子?答案竟然是木工、数字制造、嵌入式系统和固执的结合。
这个构建中的每一个环节都涉及了全新的领域。将弯曲的桦木胶合板加工成复合曲面的留声机喇叭,导致我不得不承认比预期更多的测试板失败。让两个ESP32芯片清晰地分工协作——一个负责Wi-Fi、Spotify、NFC和显示屏;另一个处理蓝牙音频和I2S数模转换器——这需要多次重新设计系统架构。将OAuth令牌刷新、SPI总线共享、HTTP服务、PWM电机控制以及实时显示渲染整合进一个连贯的固件循环中,本身就是一个巨大的挑战。
但当你将手工绘制的NFC圆盘放在旋转托盘上,音乐便从号角中流淌而出——就像你的曾祖父母用黑胶唱片时所做的动作一样——所有这些努力瞬间化为一个令人满足的瞬间。
这正是一个项目值得打造的原因:它不仅能够运行,更在运行时传递出某种意义。Resonance 是一台机器,能让原本无形的音乐播放行为变得有实体感、有意识且充满活力。它证明了,一块 5 美元的微控制器、一张桦木胶合板和几枚 NFC 标签,足以让那些被认为因便利而遗失的东西重新被唤醒。
本文编译自hackster.io





