Skip to content

ファームウェア拡張

対応 Issue: #2 工場ファーム拡張基盤

方針: 公式 OSS ファームをフォーク拡張

m5stack/UnitCamS3-UserDemo unitcams3-5mp を起点にフォークし、必要な API・BLE・安定化を追加する。ゼロから書かない。

  • 技術スタック: ESP-IDF v5.1.4 / ESPAsyncWebServer / esp32-camera コンポーネント
  • API 実装は main/hal_unitcam_s3_5mp/servers/apis/ に分離(api_camera / api_system / api_poster / api_mic

既存 REST API(流用対象)

工場ファームが既に公開している API。PWA からそのまま利用できる。

カメラ

メソッドエンドポイント機能
GET/api/v1/streamMJPEG ライブ配信(multipart/x-mixed-replace
GET/api/v1/captureJPEG 静止画
GET/api/v1/bmpBMP 静止画
GET/api/v1/control?var={名}&val={値}センサー制御(下記)

control で設定可能な主な項目: framesize, quality, brightness, contrast, saturation, sharpness, hmirror, vflip, whitebal, awb_gain, gain_ctrl, exposure_ctrl, aec_value, special_effect, wb_mode, ae_level, denoise, lenc ほか。

システム

メソッドエンドポイント機能
GET/api/v1/get_macMAC アドレス
GET/api/v1/check_sdcardmicroSD 情報
GET/api/v1/led_on / led_offLED 制御
GET/api/v1/get_config設定取得(LittleFS の config.json
POST/api/v1/set_config設定保存(JSON)
GET/api/v1/reset_config設定リセット
GET/api/v1/get_wifi_listWiFi スキャン(STA 設定用)

ポスター(EzData) / マイク

メソッドエンドポイント機能
GET/api/v1/start_posterEzData クラウドへインターバルアップロード開始
GET/api/v1/mic_start / mic_is_recordingマイク録音
GET/wav/rec.wav直近の録音取得

追加実装(独自)

API / 機能用途フェーズ
/api/v1/interval/start|stop|status独自インターバラ(保存先・上限を指定)独自
/api/v1/filesmicroSD /captured/ のファイル列挙独自
WiFi 再接続ウォッチドッグ切断検知 → 再接続(既知の復帰不能対策)Phase 1
BLE GATT 制御サービスモード / 開始停止 / ステータス Notify(NimBLE)Phase 2
WiFi AP オンデマンド起動/停止転送時のみ AP を上げる省電力動作Phase 2
電源管理(light-sleep)バッテリー運用Phase 2

ビルド・フラッシュ

bash
# 依存取得
python ./fetch_repos.py
# IDF ビルド
cd platforms/unitcam_s3_5mp
idf.py build
# フラッシュ
idf.py -p <YourPort> flash -b 1500000
# AssetPool(Web UI アセット)書き込み
parttool.py --port <YourPort> write_partition \
  --partition-name=assetpool --input "path/to/AssetPool.bin"

既知のハマりどころ

症状原因対応
SD 初期化エラーImage Poster と microSD 保存の同時実行排他制御 / api_poster.cpp 該当処理を調整
WiFi 切断後に復帰しない長期運用・ローミング起因再接続ウォッチドッグ
microSD が見えない物理スロットの有無実機で check_sdcard を確認

ライセンス: 公式リポジトリのライセンスを確認のうえフォークし、由来を明記する。