所有作品 專題 · 電機與電子群 · 專題組

效率革命軍

從虛擬 App 到實體光引:會自己打開的智慧零件盒

時間
2025.09 – 2026.02
我的角色
App 與 ESP32 韌體
團隊
2 人
技術
SwiftUI · BLE · Gemini
01 — 問題

找一顆電阻,花掉半節課

實習課和專題製作時,大家常常要在元件盒裡翻找零件。零件種類多、格子排列複雜、標示又不清楚,很容易拿錯規格、多拿或少拿。

同學互相幫忙找零件,常常一找就超過半節課。— 實習課觀察

庫存也沒有系統:零件快用完時,要靠學生主動告訴老師才會補,既不即時也不完整。我們想做一套能快速定位、即時辨識、自動管理庫存的系統,把時間還給實作本身。

02 — 解法

一支 App,三個功能

BoxApp 用 SwiftUI 開發,以 TabView 分成「零件盒」「零件辨識」「我的庫存」三頁,相機、庫存和藍牙狀態透過依賴注入在各頁共用。

智慧庫存管理

手動輸入或拍照建立零件資料;同名同規格自動累加數量,資料以 JSON 存在手機裡。

AI 零件辨識

拍下零件,交給 Gemini 判讀名稱、規格、功率與用途;確認後一鍵加入庫存。

藍牙硬體連動

選好零件,App 透過 BLE 通知 ESP32,對應格子的盒蓋自動掀開、燈號亮起。

03 — 系統架構

手機負責操作,雲端負責看,ESP32 負責動

影像辨識交給雲端模型,手機只處理介面與流程;開蓋指令走藍牙直接送到盒子,不需要網路也能用。

系統架構圖 iPhone 上的 BoxApp 以 HTTPS 把照片送到 Gemini 2.5 取得辨識結果,並以藍牙 BLE 寫入特徵值通知 ESP32;ESP32 以 PWM 控制九組伺服馬達掀蓋,以 GPIO 控制 WS2812B 燈號。 HTTPS · 照片 BLE · GATT PWM GPIO iPhone · BoxApp SwiftUI · Combine CoreBluetooth Gemini 2.5 Flash / Pro 影像 → 條列式零件資訊 ESP32-WROOM-32 解析指令 · 回傳狀態 5 V 穩壓供電 伺服馬達 ×9 90° 拉線掀蓋 / 0° 閉合 WS2812B 燈號 單線控制顏色亮度
04 — 硬體機構

試了三種方法,才找到會「動」的那一個

一開始想用燈號指示位置,實測後一路改到伺服馬達拉線。每一次放棄都有明確的理由。

01

LED 指示燈

App 下指令後對應格子亮燈。但實驗桌上光線太亮,燈號根本看不清楚。

✕ 強光下看不到
02

電磁線圈彈開盒蓋

用電磁斥力把蓋子推開。概念可行,但需要大電流和大線圈:耗電、佔空間、散熱差,安全性也不夠。

✕ 耗電又佔空間
03

伺服馬達拉線+磁吸

馬達轉到 90° 拉緊棉線掀開盒蓋,回到 0° 放鬆、蓋子靠重力落下,再由磁鐵吸住,搬運時也不會誤開。馬達端並聯 100 µF 電容、加上續流二極體,避免突波讓板子重開機。

✓ 最終方案
盒蓋掀開的特寫
盒蓋掀開
盒子後方控制區的伺服馬達
後方的伺服馬達
零件盒另一角度
珍珠板盒身
05 — App

BoxApp

從原本的 Swift 架構全面改寫成 SwiftUI+MVVM。相機用 AVCaptureSession 自己封裝,加入手勢縮放與點擊對焦;藍牙模組有模擬模式,沒有硬體也能測完整流程。

零件盒頁:連接藍牙、選擇零件類別並傳送指令
零件盒連線、選零件、開蓋
零件辨識頁:相機預覽與辨識零件按鈕
零件辨識拍照交給 Gemini
我的庫存頁:列出電阻的數量與規格
我的庫存數量與規格一覽
新增或編輯零件的表單
新增零件手動建檔
06 — AI 選型

100% 準確率,反而是警訊

我們先用 Google Cloud Vertex AI 訓練自己的分類模型。驗證結果漂亮得不真實——因為資料只有兩類、量也太少,那個數字只代表資料太單純,不代表真的會認零件。

Vertex AI 自訓模型 放棄

  • 431 張圖(訓練 345/驗證 43/測試 43)
  • 只有 2 個類別,泛化能力無法驗證
  • 訓練 20 多小時就累積大量費用,學生負擔不起

Gemini 2.5 Flash / Pro 採用

  • 不用自己蒐集、標註、訓練
  • 同時判讀外觀、規格與基本用途
  • API 改版快:回頭對照官方文件,重新核對模型 ID、Request Body 與標頭才串通
Vertex AI 訓練報告:精確度與喚回度皆為 100%,圖片總數 431
Vertex AI 訓練報告:數字完美,但資料太單純
07 — 除錯紀錄

卡住的地方,都在「接起來」的縫裡

  • ERRORdoes not conform to ObservableObject → 漏了 import Combine
  • ERRORUndefined symbol: _main → App 進入點檔案被移出 Target,重新加回
  • ERROR'openCompartment' was not declared in this scope → 在使用前補上函式原型
  • ERRORBLE 回傳失敗:setValue() 不收 std::string → 改傳 uint8_t* 與長度
  • FIXEDGemini「模型 ID 無效」「請求格式錯誤」→ 網路範例過時,改照官方最新文件重寫請求
08 — 成果

從選零件到開蓋,只要幾秒

≈90%正常光源下,常見電子零件的辨識準確率
<0.5s手機送出指令到盒蓋打開的延遲
2–3mApp 與 ESP32 藍牙穩定連線範圍
0搬運與震動測試中意外開蓋的次數

外觀相似的零件仍需要人工確認;AI 快速建檔功能還有 JSON 解析與重複寫入的問題待修,會在後續版本改善。未來想加入 Wi‑Fi 雲端同步、開蓋感測回饋,並在經費允許時訓練能在本機執行的小模型。

09 — 心得

要當一個 T 型人

我們熟悉電路和程式,但對機構幾乎陌生。盒蓋開關不順的問題卡了很久,靠著一次次請教老師、修改才解決。這讓我體會到:只會一個領域不夠,要能往旁邊延伸。

軟體上,為了突破 App Inventor 的介面限制,我們選了較少人走的 SwiftUI+ESP32 組合。這次不只學會 App 開發和串接 AI,也在軟硬整合時補上了許多實習課沒教到的實務電路知識。

下一步
回到作品列表