公仔放上去,故事就開始:小依拆解 ESP32 × NFC 開源故事盒 Marelleo

小依將小狐狸公仔放在故事盒上,示意 NFC 觸發音訊播放

公仔放上去,故事就開始:小依拆解 ESP32 × NFC 開源故事盒 Marelleo

把小狐狸放上盒子,故事便開始播放。換成火箭,聲音也跟著改變。這樣的操作看似簡單,背後卻結合了 NFC 辨識、音訊播放、內容管理與互動設計。這次由小依帶讀開源專案 Marelleo,看看 ESP32 如何把一件摸得到的物品,變成聲音介面。

先看懂 Marelleo:故事放在哪裡?

Arnaud Aubry 公開的 Marelleo,把 NFC 標籤貼在公仔底部,由盒內的讀取器辨識,再播放對應的音檔、播放清單或網路電台。本機故事存在 microSD;家中 Wi-Fi 上的瀏覽器則提供管理介面。拿走公仔後要繼續播放或停止,可以依設定決定。

因此,NFC 標籤在這個設計裡主要扮演「索引」。它讓控制器知道要找哪一份內容,並沒有把整段故事裝進貼紙。要更換故事,核心工作是調整標籤與內容的對應關係;同樣的操作方式,也能延伸成展示物導覽或教學卡片。

小依的觀察:先想清楚「放上去之後應該發生什麼」,再決定盒子需要哪些功能,會比一次加滿功能更容易做出好用的作品。

把系統拆成四段,就知道問題該從哪裡查

理解這類作品,可以沿著「辨識 → 查表 → 取資料 → 發聲」往下追。NFC 讀取成功只完成第一段;有聲音也不代表換卡、暫停和斷線處理都已經穩定。以下是依此架構整理的實作分析與驗證建議,並非宣稱原專案已通過這些測試。

NFC 標籤經 PN532 送入 ESP32 對應內容,再由本機音檔或選用網路電台取得音訊,經 I2S 放大器輸出
功能分層示意,非接線圖。網路電台與遠端更新需要外部網路;本機檔案播放應另外驗證斷網行為。
階段要確認的事容易誤判的狀況
辨識連續讀取同一標籤時,ID 是否穩定外殼裝上後才讀不到,卻一直修改音訊程式
查表ID 對應的檔案或播放清單是否存在把「未知標籤」當成讀卡器故障
取資料檔案可讀、格式可解碼;串流有逾時處理網路等待阻塞了按鍵與換卡
發聲I²S 訊號、放大器供電、音量與喇叭匹配讀卡成功卻無聲,就認定整台 ESP32 壞了

選 ESP32,不能只看型號前面的名字

原專案的模組版指定 ESP32-S3-DevKitC-1 N16R8。採購時應核對實際模組料號、Flash、PSRAM、可用 GPIO 與板卡版本,而不是看到「ESP32-S3」就視為相同。Espressif 的開發板文件也列出不同記憶體組合,以及部分腳位被內部記憶體占用的情況。

對音訊系統而言,Flash 容量、PSRAM 設定和分割區會影響程式能否啟動、緩衝區能否建立,以及更新空間是否足夠。若改用手邊的板子,第一步應是確認編譯設定與硬體一致,再逐一驗證周邊。帶螢幕、相機或其他功能的板卡,也可能已經占用原程式需要的腳位。

原始碼提供模組版 boite 與整合 PCB 版 carte 兩種建置目標;其腳位與記憶體設定有差異。這一點應以實際建置設定為準。買了不同板子,通常需要移植,不能把成功燒錄當作相容性驗證。

小依介紹開發板、NFC 讀取器、音訊放大器、記憶卡與喇叭的模組分工
先用模組逐段確認功能,再考慮整合 PCB,較容易定位問題。圖中板卡為概念示意。

PN532 的三種介面,接對線還不夠

NXP 的 PN532 文件列出 I²C、SPI 與 HSU(UART)主機介面。Marelleo 模組版採用 HSU;如果手上的模組仍設為 I²C,即使電源正常、線材也接妥,韌體依然可能收不到回應。

實作時,先依模組背面的說明或其原廠手冊設定介面,再檢查 TX、RX 方向與共同接地。不同廠牌的開關位置、穩壓與電位轉換設計可能不同,不能直接照另一塊板子的開關照片操作。模組能由 5V 供電,也不等於所有訊號腳都能直接接受 5V;要分別核對電源輸入與邏輯電位。

接著在真正的外殼裡測試標籤。標籤大小、安裝方向、盒蓋厚度與附近金屬,都值得列入驗證。桌上裸測讀得到,裝進盒子後未必有相同效果。應準備幾個不同放置位置反覆測試,再決定感應區的尺寸與標示。

I²S 處理聲音,別與 I²C 混在一起

讀卡介面與音訊介面是兩件事。MAX98357A 接收 I²S 數位音訊,再驅動喇叭;Analog Devices 的產品資料說明,它使用 BCLK、LRCLK 與音訊資料,不需要額外的 MCLK,也不需要透過 I²C 撰寫設定暫存器。

選放大器模組時,應核對晶片後綴、資料格式、供電與喇叭阻抗。供電不足可能在較大音量時才暴露問題,因此測試不能只播放輕聲提示音。可以先固定一個已知可解碼的檔案,以低音量確認聲音路徑,再逐步提高音量,觀察是否出現失真、重新啟動或讀卡不穩。

若讀卡穩定卻沒有聲音,可依序確認檔案讀取、解碼狀態、I²S 腳位設定、放大器啟用狀態與喇叭接線。每次只改一項,比同時換程式、換電源與換喇叭更能留下可判讀的結果。

真正決定體驗的,是換卡與錯誤處理

公仔停在感應區時,讀卡器可能連續回報同一個 ID。若每次讀到都重新開始播放,故事就會一直卡在開頭。延伸設計時,可以把「目前讀到的標籤」與「目前播放的內容」分開記錄;只有狀態改變,才決定切歌、續播或停止。

對短暫讀不到標籤的情況,也應有明確規則。例如先確認一段穩定的離開狀態,再觸發移除行為,避免公仔稍微晃動就中斷。具體等待時間要用實際標籤、讀卡頻率和操作測試決定,不宜套用一個看似精確的通用數字。

另外要先定義:換成未知標籤時,是保留原播放、停止,還是播放提示?找不到檔案時,能否繼續接受下一次操作?網路電台連不上時,是否仍能換回本機故事?把這些規則寫成狀態表,往往比增加更多按鈕更能改善體驗。

小依用瀏覽器管理公仔與故事的對應關係,桌上另有 microSD 與故事盒
內容對應關係值得獨立管理;公仔可以沿用,故事內容則能調整。畫面為管理概念示意。

本機播放、網路管理與遠端更新,要分開評估

把音檔放在 microSD,有利於減少播放對外部服務的依賴,但仍應實測「網際網路中斷」與「Wi-Fi 路由器關閉」兩種不同情況。開機流程若一直等待連線,即使檔案在本機,也可能影響使用。管理頁面是否仍可進入,則是另一項測試。

如果需要播放網路電台,應另外評估串流格式、服務是否可用、逾時與重試方式。教室或展示場域也要考慮換網路後如何設定、由誰維護音檔,以及管理介面是否可能被同網段其他使用者修改。標籤 ID 適合選內容;需要權限保護的用途,應另做身分驗證設計。

自訂韌體尤其要檢查更新來源。原專案的 version.h設有預設更新服務;若製作自己的分支,應規劃相應更新來源,避免後續更新覆蓋自訂行為。同時保留已知可用的韌體、內容備份與有線復原方式。

從桌上作品走向長期使用,建議分三階段

階段先完成的範圍進下一步前的驗收
最小原型USB 供電、一張標籤、一個本機音檔可重複觸發;重新開機仍能播放
互動驗證多張標籤、暫停、換卡、移除與缺檔處理快速換卡不反覆重播;錯誤後仍能接受操作
使用環境驗證裝殼、預定音量、斷網、內容更新與復原在實際擺放位置穩定運作;設定與內容可還原

這是建議的開發順序,並非原作者提供的產品驗收標準。若要採用整合 PCB,先讀設計說明與已知偏差,確認原理圖、BOM 和組裝方向,再評估下單。開源製造檔案仍需要工程審查。

供電方面,初期可先採 USB,縮小問題範圍。若後續加入鋰電池,要依實際負載選擇充電、保護與電源路徑設計,並確認外殼、線材固定和維修方式;不能只因某塊板子標示「可充電」,就認定適合邊充邊用或交付兒童使用。

小依比較受保護的 USB 原型與封裝故事盒,逐項檢查感應和操作
在外殼、供電與操作規則固定後,再做重複測試,才能知道作品是否適合預定場景。

想動手,零件可以怎麼選?

若先做 NFC 互動實驗,可比較 PN532 NFC RFID V3 模組與 Gravity PN532 UART/I²C 模組;音訊部分則可參考 MAX98357 系列 I²S 放大器模組。這些是功能方向相近的選項,並未宣稱與 Marelleo 原 BOM 完全相同,仍須核對介面、晶片版本、接腳與函式庫。

需要重現專案時,優先依原作者的板卡與建置設定準備;需要改成展示導覽或教學工具時,則先寫出自己的互動需求。內容也應使用自行製作或取得授權的音檔。儲存在本機,不代表音訊自然取得公開播放或散布權利。

小依想留下的一個問題是:如果使用者只需要「拿起一件物品,就聽見對應的內容」,哪些操作真的需要螢幕?Marelleo 提供了一個可研究的起點;從單一標籤與單一故事開始,逐步補上可靠的互動和維護方式,就能把這個想法往自己的應用推進。

整理:台灣物聯科技 TaiwanSensor|角色導讀:小依|分類:技術導覽與新知
標籤:ESP32-S3、NFC、PN532、I²S、開源硬體、互動教學、音訊播放。專案儲存庫採 MIT 授權;第三方程式庫與音訊內容仍依各自授權處理。本文為文件分析,未宣稱完成實機測試。

原始資料與延伸閱讀

  1. Marelleo 專案與材料清單
  2. 兩種硬體的建置設定
  3. PCB 設計說明與已知偏差
  4. 自訂韌體的更新來源
  5. MIT 授權原文
  6. Espressif ESP32-S3-DevKitC-1 文件
  7. NXP PN532 使用手冊
  8. Analog Devices MAX98357A
  9. PN532 V3 模組參考
  10. Gravity PN532 模組參考
  11. MAX98357 系列放大器模組參考

分享到社群

發佈留言