This website requires JavaScript.
優惠券
寄往
部落格

ESP32 S3 無損音樂播放器製作記錄

最初發布於 Sep 14, 2026, 更新於 Sep 14, 2026

2 分鐘

目錄
  • ESP32 S3 無損音樂播放器製作記錄

作者:輕鬆易學嵌入式
YouTube 影片連結:https://www.youtube.com/watch?v=axT8qfYF0Kk
專案原始碼與 PCB 設計檔案:GitHub 專案倉庫


ESP32 S3 無損音樂播放器製作記錄

從洞洞板到四層 PCB 的設計 焊接與音訊測試

手機已經可以完成絕大多數聽音樂的需求,為什麼還要自己做一臺播放器?

對我來說,吸引人的地方是能夠親手掌握整個過程:音樂檔案怎麼從 SD 卡讀出來,解碼後的資料怎麼送到 DAC,螢幕重新整理會不會影響播放,換一種輸出方式又會發生什麼。遇到問題,可以改硬體、查日誌,也可以透過錄音和盲聽來驗證自己的判斷。

於是,我用 ESP32-S3 搭配 SD 卡、顯示螢幕和外接 DAC,做了這臺音樂播放器。它最早只是洞洞板上的一堆模組和飛線,後來逐步變成自己設計、自己焊接的四層 PCB。

這篇文章就把這次升級的過程整理出來:從確定硬體架構、使用 EasyEDA 設計 PCB,到打樣、手工焊接、韌體除錯,最後再用幾種不同的音訊輸出方案做一次盲聽對比。

player_final_product_and_mobile_web_control
圖 1 播放器成品與手機網頁控制 來源 影片 6:52

一 先在洞洞板上 把音樂播放出來

這個專案並沒有一開始就畫 PCB。我先在洞洞板上把各個模組連線起來,驗證儲存、解碼、顯示和 USB 音訊輸出能不能一起工作。

最早的原型使用鋰電池供電:一路經過 5V 升壓給控制板,另一路經過濾波後給 USB DAC。ESP32-S3 負責讀取 SD 卡、解碼 FLAC、驅動螢幕,同時作為 USB Host 連線外部音效卡。

當時使用的是 Sound Blaster PLAY! 3,原型已經實現了 24-bit、96 kHz 播放。旁邊還預留過一塊 RP2040,原本計劃用來讀取 CD 資料,不過那屬於預留方向,並不是這次播放器已經完成的功能。

第一次成功出聲,證明這條方案能夠走通。繼續除錯時,洞洞板的侷限也逐漸顯現出來:模組分散、飛線密集,檢查一條連線往往需要沿著線找很久,移動和修改也不方便。

因此,升級 PCB 時,我重新整理了介面位置、供電和訊號路徑,希望把已經驗證過的原型變成一個便於繼續開發的硬體平臺。

perfboard_prototype_both_sides_and_module_connections
圖 2 洞洞板原型的兩面及模組連線 來源 影片 1:21

二 新版播放器的硬體架構

新版繼續採用 ESP32-S3-WROOM-1-N16R8,配置為 16 MB Flash 和 8 MB PSRAM。播放器從 FAT32 格式的 SD 卡中讀取音樂,支援遞迴掃描 MP3、PCM WAV 和 FLAC 檔案,生成歌單並迴圈播放。

這裡的“無損播放器”指它支援 PCM WAV、FLAC 等音樂檔案的播放,並不意味著任意輸出鏈路、任意音量設定都可以直接稱為 bit-perfect。檔案格式、軟體處理和最終類比輸出,需要分別來看。

播放器硬體模組與功能
模組 本專案採用的方案 主要作用
主控 ESP32-S3-WROOM-1-N16R8 檔案讀取、音訊解碼、顯示和裝置管理
儲存 FAT32 SD 卡 儲存音樂檔案
顯示 ST7789,原生 240×320,橫向使用 顯示曲目、播放狀態和即時頻譜
I2S 音訊輸出 PCM5100A 提供一種獨立於 USB DAC 的播放路徑
USB 音訊輸出 CX31993、Sound Blaster PLAY! 3 分別驗證 UAC2 和 UAC1 播放
操作與維護 串列埠控制、網頁控制、區域網路 TCP OTA 控制播放和更新韌體

音訊資料的基本路徑是:SD 卡讀取 → 軟體解碼 → PCM 資料 → I2S 或 USB 音訊輸出。螢幕則顯示當前曲目、格式、網路位址、實際使用的 DAC 和即時頻譜。

我保留了兩類輸出方式。沒有可用 USB DAC 時,播放器可以直接使用 I2S;接入支援的 USB DAC 並成功啟動音訊流後,再切換到 USB。拔掉 USB DAC 後,系統自動恢復 I2S 輸出。

這樣既方便日常使用,也讓同一臺播放器能夠測試不同的音訊輸出方案。硬體與功能演示見影片 1:38 起。

system_functions_and_data_path_diagram
圖 3 系統功能與資料路徑示意

三 用 EasyEDA 設計四層 PCB

先確定元件位置與介面方向

這次 PCB 使用 EasyEDA 設計。我先整理洞洞板上已經驗證過的連線,再逐個核對元件封裝和接腳,完成原理圖與 PCB 佈局。因為準備自己焊接,元件是否方便定位、焊墊是否容易操作,也是需要一起考慮的問題。

開始佈局時,我先考慮幾個實際問題:ESP32-S3 放在哪裡,SD 卡是否方便插拔,螢幕排線朝哪個方向,USB 介面與周圍元件會不會互相遮擋。確定這些位置後,再安排各功能模組之間的連線。

音訊相關部分與數位部分按功能分區,USB 資料路徑儘量緊湊,同時為供電和其他訊號留出合適的走線空間。這樣做的目的,是讓板子的連線關係更清楚,也便於後續檢查和修改。

四層板與獨立匯流排

這次採用四層 PCB,其中安排了一整層地平面,希望為訊號提供較完整的迴流路徑,也讓供電和訊號佈線有更充足的空間。

四層板本身不能直接證明音質更好,最終表現仍要靠實際執行和測量驗證。對這次設計而言,它首先解決的是佈局和佈線安排的問題。

介面分配上,USB 使用 ESP32-S3 的原生介面;SD 卡單獨使用 SPI2,ST7789 螢幕單獨使用 SPI3。儲存和顯示各自使用一套 SPI 匯流排,可以減少二者在同一匯流排上的爭用。能否持續穩定播放,還需要結合讀取、解碼和緩衝一起驗證。

用 3D 預覽檢查裝配

佈線完成後,我用 3D 預覽檢查元件方向、介面朝向和機械干涉。二維圖裡不明顯的問題,例如聯結器朝反、插頭空間不足,換一個立體視角往往更容易發現。

對手工組裝的專案來說,檢查“能不能焊、焊好後能不能插上”,與檢查電氣連線同樣重要。PCB 設計過程見影片 2:21 起。

easyeda_pcb_layout_and_interface_distribution
圖 4 EasyEDA 中的 PCB 佈局與介面分佈 來源 影片 2:49
pcb_3d_preview
圖 5 PCB 的 3D 預覽 來源 影片 3:05

四 生產檔案檢查與 PCB 打樣

在匯出生產檔案前,我先執行 DRC,也就是設計規則檢查,處理未連線網路、線寬線距、過孔和板框等問題。

DRC 通過並不等於整套電路一定能正常工作,但它可以提前發現一部分製造和連線問題。我還嘗試用 AI 輔助檢查原理圖連線、元件選型和容易遺漏的細節,把它作為額外的複核手段;最終仍需要結合元件資料和實際電路判斷。

確認設計後,我匯出 Gerber 等生產檔案,上傳後對照生產預覽,再複核一次板框、層數、孔位和正反面。這一步相當於從製造檔案的角度重新看一遍設計,確認提交的內容與預期一致。

這次 PCB 由 JLCPCB 提供裸板打樣支援,焊接和組裝由我自己完成。它也提供 PCBA 組裝服務;有類似製作需求的朋友,可以透過這個連結造訪網站,註冊後按自己的設計提交訂單。

我這次需要檢查的重點是裸板生產檔案。如果採用貼片組裝,還需要準備 BOM 物料清單和 CPL 元件座標檔案,逐項核對料號、封裝、方向與貼裝位置。

jlcpcb_production_preview_and_order_options
圖 6 JLCPCB 頁面中的生產預覽與下單選項 來源 影片 4:32
bare_pcb_inspection_and_power_to_ground_measurement_record
圖 7 裸板檢查與電源對地測量記錄 來源 影片 4:58

五 手工焊接 每完成一部分 就檢查一部分

板子到手後,我先檢查板框、孔位、細間距焊墊和阻焊,再用萬用表檢查電源與地之間是否存在明顯短路。確認後才開始裝配。

焊接前,我按功能把元件分組,確認封裝和方向,再從較矮小的元件開始。放置元件時先固定一個接腳,調整位置後再完成其他焊點。每焊完一組,就檢查一次偏位、虛焊和連錫,避免把問題積累到最後。

貼片 IC 的焊接,我使用了焊錫膏和熱風槍。實際操作並不順利:風量偏大時,小元件容易被吹動,為此返工了好幾次。這也讓我體會到,焊接方式要與元件尺寸、工具和操作熟練程度相匹配,不能只看焊錫有沒有熔化。

貼片部分完成後,再焊接插件元件,並從側面觀察焊錫是否真正潤溼焊墊和接腳。表面形成一個錫球,並不代表連線已經可靠。

首次通電時,我沒有把螢幕、SD 卡和 DAC 一次全部接上,而是先複測電源對地阻值,再限流上電。確認電流和關鍵電壓沒有異常後,逐步接入各個模組。

分階段檢查確實會多花一些時間,但如果接入某個模組後出現異常,排查範圍就比較明確。焊接與首次通電記錄見影片 5:06 起。

hot_air_rework_during_hand_soldering
圖 8 手工焊接中的熱風作業 來源 影片 5:15

六 ESP IDF 韌體 把各個模組真正串起來

硬體焊接完成,只是播放器開始工作的前提。韌體還需要把儲存、解碼、輸出、顯示和控制組合起來,並處理實際執行中的各種狀態變化。

我使用 ESP-IDF 開發,按功能拆分儲存、解碼、音訊輸出、顯示、網頁控制和 OTA 模組。啟動後先初始化螢幕,再掛載 SD 卡、掃描音樂並生成歌單;連線區域網路後,可以透過手機網頁選歌、播放、暫停、切歌和調節音量。

開發中比較耗時間的部分,包括 SD 卡相容性、USB DAC 的格式協商、FLAC 播放爆音,以及裝置插拔後的狀態恢復。

例如,USB 裝置成功列舉,只說明播放器已經識別到裝置,並不能證明音訊流已經按正確格式開始傳輸。因此,輸出切換需要以成功啟流為條件,失敗或斷開時再恢復 I2S。

針對 FLAC 播放中的讀取抖動,當前公開韌體採用輸入預讀和 PSRAM 環形緩衝,讓解碼與音訊輸出之間有一定餘量。這個處理方向針對的是資料供給的連續性,並不能把所有爆音都歸結為同一個原因。相關實現和當前配置可以檢視專案倉庫的音訊輸出說明

區域網路 TCP OTA 則方便我在除錯過程中更新韌體,減少反覆連線下載線的操作。當前實現沒有身份認證和 TLS,適合在可信、隔離的區域網路內使用,不應直接開放到網際網路。使用方法與限制見專案說明。

firmware_module_partition_in_video
圖 9 影片中的韌體模組劃分 來源 影片 6:15

七 成品驗證 播放 控制與熱插拔

完成除錯後,我按實際使用流程做了一次完整演示:

1. 上電後初始化顯示螢幕,掛載 SD 卡並掃描音樂。

2. 生成歌單後播放,螢幕顯示曲目、狀態與頻譜。

3. 連線區域網路,透過網頁完成選歌、暫停、切歌和音量調節。

4. 插入 CX31993,列舉並成功啟流後切換到 USB DAC。

5. 拔掉 USB DAC,自動恢復 I2S 輸出。

這組演示確認了主要功能能夠串聯執行。對我而言,從原型升級到 PCB 的價值,在這裡變得很直觀:硬體連線固定下來後,可以把更多精力放在軟體行為和實際使用問題上。

這次沒有把續航、輸出功率、訊雜比等指標作為完整測量專案,因此也不為這些專案填寫推測數值。

八 三種 DAC 加一臺手機 做一次盲聽對比

播放器能正常執行之後,我又準備了四條音訊輸出路徑:

四種音訊輸出對比路徑
對比對象 播放路徑
PCM5100A ESP32-S3 經 I2S 輸出
CX31993 ESP32-S3 經 USB UAC2 輸出
Sound Blaster PLAY! 3 ESP32-S3 經 USB UAC1 輸出
Sony Xperia 5 V 手機的 3.5 mm 類比音訊輸出

錄製時,四者播放同一個無損測試檔案,採用相同取樣率,並接入同一臺錄音音效卡的同一輸入通道。這樣可以減少測試路徑變化造成的影響。

盲聽時,我希望大家先聽聲音,再看裝置名稱。影片中安排了試聽片段,但平臺會再次編碼音訊,因此它更適合作為一個體驗環節;認真比較時,應使用未經影片平臺處理的 WAV 檔案。測試介紹見影片 7:02 起。

在後續整理中,我又把四份錄音對齊到同一段音樂,擷取共同音樂開頭的 40 秒,並將整體響度匹配到 −20 LUFS,用於兩兩 ABX 測試。固定響度的目的,是儘量減少音量差對判斷的干擾。

ABX 的操作很直接:A 和 B 來自兩個不同樣本,X 隨機取其中一個。試聽者可以反覆切換,判斷 X 與 A 還是 B 相同,完成預先確定的輪數後再檢視結果。

需要說明的是,整理過程中發現 Sony 這份原始錄音存在觸及滿幅的削波。後期降低音量不能恢復已經丟失的波形,原因還需要結合播放端與錄音端的電平設定排查。因此,現有樣本可以用於體驗盲聽流程,但若要據此討論裝置本身的失真表現,應先排查並重新錄製這一路,再重新匹配樣本。

目前還沒有完成正式聽者測試的成績,所以這裡不寫“某款更好”或者“完全聽不出區別”的結論。ABX 能回答的是,在指定樣本和條件下能否分辨;喜歡哪種聲音,以及裝置整體表現如何,是另外的問題。

four_audio_outputs_and_recording_test_paths
圖 10 四種音訊輸出與錄音測試路徑 來源 影片 7:11
pairwise_abx_test_method_diagram
圖 11 後續兩兩 ABX 測試的方法示意

九 做完這臺播放器 我學到了什麼

從洞洞板到四層 PCB,這次最明顯的體會是:讓一個模組工作,與讓整臺裝置在不同狀態下持續工作,是兩件難度不同的事情。

線路連線、元件焊接只是開始。SD 卡能否正確讀取,解碼過程能否連續供數,USB DAC 是否接受當前格式,拔插之後狀態能否恢復,每一個環節都需要單獨觀察,再放回整機中驗證。

自己完成焊接和除錯後,我對設計檢查有了更直接的認識:螢幕上看起來很小的封裝、方向或介面位置問題,到了裝配時就可能變成一次返工。這些細節應該在送板前儘量確認。

播放器目前已經具備音樂播放、狀態顯示、多種輸出、網頁控制和 OTA 等功能。接下來,我希望繼續完善相容性和異常恢復,並把音訊對比的錄製條件與測試記錄整理得更完整。

自己做播放器的樂趣,就在於可以沿著一條真實的資料路徑,從檔案、軟體一直追到最終聽到的聲音,再用自己的修改和測試去理解它。

專案原始碼與 PCB 設計檔案已經放在 GitHub 專案倉庫。感興趣的朋友可以結合程式碼和圖紙繼續研究,也歡迎交流你在播放器設計、焊接和除錯過程中遇到的問題。

持續學習