公仔放上去,故事就開始:小依拆解 ESP32 × NFC 開源故事盒 Marelleo
把小狐狸放上盒子,故事便開始播放。換成火箭,聲音也跟著改變。這樣的操作看似簡單,背後卻結合了 NFC 辨識、音訊播放、內容管理與互動設計。這次由小依帶讀開源專案 Marelleo,看看 ESP32 如何把一件摸得到的物品,變成聲音介面。
先看懂 Marelleo:故事放在哪裡?
Arnaud Aubry 公開的 Marelleo,把 NFC 標籤貼在公仔底部,由盒內的讀取器辨識,再播放對應的音檔、播放清單或網路電台。本機故事存在 microSD;家中 Wi-Fi 上的瀏覽器則提供管理介面。拿走公仔後要繼續播放或停止,可以依設定決定。
因此,NFC 標籤在這個設計裡主要扮演「索引」。它讓控制器知道要找哪一份內容,並沒有把整段故事裝進貼紙。要更換故事,核心工作是調整標籤與內容的對應關係;同樣的操作方式,也能延伸成展示物導覽或教學卡片。
小依的觀察:先想清楚「放上去之後應該發生什麼」,再決定盒子需要哪些功能,會比一次加滿功能更容易做出好用的作品。
把系統拆成四段,就知道問題該從哪裡查
理解這類作品,可以沿著「辨識 → 查表 → 取資料 → 發聲」往下追。NFC 讀取成功只完成第一段;有聲音也不代表換卡、暫停和斷線處理都已經穩定。以下是依此架構整理的實作分析與驗證建議,並非宣稱原專案已通過這些測試。

| 階段 | 要確認的事 | 容易誤判的狀況 |
|---|---|---|
| 辨識 | 連續讀取同一標籤時,ID 是否穩定 | 外殼裝上後才讀不到,卻一直修改音訊程式 |
| 查表 | ID 對應的檔案或播放清單是否存在 | 把「未知標籤」當成讀卡器故障 |
| 取資料 | 檔案可讀、格式可解碼;串流有逾時處理 | 網路等待阻塞了按鍵與換卡 |
| 發聲 | I²S 訊號、放大器供電、音量與喇叭匹配 | 讀卡成功卻無聲,就認定整台 ESP32 壞了 |
選 ESP32,不能只看型號前面的名字
原專案的模組版指定 ESP32-S3-DevKitC-1 N16R8。採購時應核對實際模組料號、Flash、PSRAM、可用 GPIO 與板卡版本,而不是看到「ESP32-S3」就視為相同。Espressif 的開發板文件也列出不同記憶體組合,以及部分腳位被內部記憶體占用的情況。
對音訊系統而言,Flash 容量、PSRAM 設定和分割區會影響程式能否啟動、緩衝區能否建立,以及更新空間是否足夠。若改用手邊的板子,第一步應是確認編譯設定與硬體一致,再逐一驗證周邊。帶螢幕、相機或其他功能的板卡,也可能已經占用原程式需要的腳位。
原始碼提供模組版 boite 與整合 PCB 版 carte 兩種建置目標;其腳位與記憶體設定有差異。這一點應以實際建置設定為準。買了不同板子,通常需要移植,不能把成功燒錄當作相容性驗證。

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,有利於減少播放對外部服務的依賴,但仍應實測「網際網路中斷」與「Wi-Fi 路由器關閉」兩種不同情況。開機流程若一直等待連線,即使檔案在本機,也可能影響使用。管理頁面是否仍可進入,則是另一項測試。
如果需要播放網路電台,應另外評估串流格式、服務是否可用、逾時與重試方式。教室或展示場域也要考慮換網路後如何設定、由誰維護音檔,以及管理介面是否可能被同網段其他使用者修改。標籤 ID 適合選內容;需要權限保護的用途,應另做身分驗證設計。
自訂韌體尤其要檢查更新來源。原專案的 version.h設有預設更新服務;若製作自己的分支,應規劃相應更新來源,避免後續更新覆蓋自訂行為。同時保留已知可用的韌體、內容備份與有線復原方式。
從桌上作品走向長期使用,建議分三階段
| 階段 | 先完成的範圍 | 進下一步前的驗收 |
|---|---|---|
| 最小原型 | USB 供電、一張標籤、一個本機音檔 | 可重複觸發;重新開機仍能播放 |
| 互動驗證 | 多張標籤、暫停、換卡、移除與缺檔處理 | 快速換卡不反覆重播;錯誤後仍能接受操作 |
| 使用環境驗證 | 裝殼、預定音量、斷網、內容更新與復原 | 在實際擺放位置穩定運作;設定與內容可還原 |
這是建議的開發順序,並非原作者提供的產品驗收標準。若要採用整合 PCB,先讀設計說明與已知偏差,確認原理圖、BOM 和組裝方向,再評估下單。開源製造檔案仍需要工程審查。
供電方面,初期可先採 USB,縮小問題範圍。若後續加入鋰電池,要依實際負載選擇充電、保護與電源路徑設計,並確認外殼、線材固定和維修方式;不能只因某塊板子標示「可充電」,就認定適合邊充邊用或交付兒童使用。

想動手,零件可以怎麼選?
若先做 NFC 互動實驗,可比較 PN532 NFC RFID V3 模組與 Gravity PN532 UART/I²C 模組;音訊部分則可參考 MAX98357 系列 I²S 放大器模組。這些是功能方向相近的選項,並未宣稱與 Marelleo 原 BOM 完全相同,仍須核對介面、晶片版本、接腳與函式庫。
需要重現專案時,優先依原作者的板卡與建置設定準備;需要改成展示導覽或教學工具時,則先寫出自己的互動需求。內容也應使用自行製作或取得授權的音檔。儲存在本機,不代表音訊自然取得公開播放或散布權利。
小依想留下的一個問題是:如果使用者只需要「拿起一件物品,就聽見對應的內容」,哪些操作真的需要螢幕?Marelleo 提供了一個可研究的起點;從單一標籤與單一故事開始,逐步補上可靠的互動和維護方式,就能把這個想法往自己的應用推進。

發佈留言
很抱歉,必須登入網站才能發佈留言。