BLE Wi-Fi プロビジョニング + BLE OTA + BLE デバッグモニタ機能を備えた統合システムです。 iPad上の Bluefy ブラウザから ESP32-S3 Super Mini をリモートで制御・ファームウェア更新できます。
注意: ファームウェア更新(OTA)は完全にBLE経由で実行されます。Wi-FiはHTTP OTAには使用しません。
最終ドキュメント対応: CreatePlan.md v0.1 / SpecifcationDoc.md v0.2(実装版)
- プロジェクト構成
- システムアーキテクチャ
- BLE通信仕様
- WiFi・OTA通信仕様
- BLE OTAの仕組み(初心者向け解説)
- マイコン側(ESP32)の使い方
- WebApp側(iPad/Bluefy)の使い方
- 動作フロー
- トラブルシューティング
RemoteCompilerToMicon/
├── README.md # このファイル
├── CreatePlan.md # 実装詳細設計書 (v0.1)
├── SpecifcationDoc.md # システム仕様書 (v0.2)
│
├── MiconSide/ # マイコン側ファームウェア (PlatformIO)
│ ├── platformio.ini # PlatformIO 設定
│ ├── partitions.csv # 標準パーティションテーブル
│ ├── partitions_ota_2m.csv # OTA対応パーティションテーブル
│ ├── src/
│ │ └── main.cpp # ESP32 メインプログラム
│ ├── logs/ # ビルドログ出力ディレクトリ
│ └── README.md # マイコン側詳細手順書
│
└── WebAppSide/ # WebApp (HTML/CSS/JavaScript)
├── index.html # メイン HTML
├── styles.css # スタイルシート
├── app.js # メインアプリロジック
├── ble-client.js # BLE 通信ロジック
├── ota-client.js # BLE OTA クライアント(HTTP OTAは未実装)
├── ui.js # UI 更新管理
├── firmware-client.js # BLE経由ファームウェアクライアント
├── constants.js # BLE UUIDs・定数
├── package.json # npm パッケージ設定
├── netlify.toml # Netlify デプロイ設定
└── README.md # WebApp 詳細手順書
┌─────────────────────────────────┐
│ iPad + Bluefy ブラウザ │
│ │
│ ┌────────────────────────────┐ │
│ │ WebApp (HTML/CSS/JS) │ │
│ │ - BLE 接続管理 │ │
│ │ - Wi-Fi プロビジョニング │ │
│ │ - BLE OTA更新 │ │
│ │ - BLE ログモニタ │ │
│ └────────────────────────────┘ │
└──────────┬───────────────────────┘
│
│ BLE (All Communication)
│ (Provisioning, OTA, Debug Monitor)
│
┌─────────────────────────────────────────────────┐
│ ESP32-S3 Super Mini ファームウェア │
│ │
│ ┌────────────────────────────────────────┐ │
│ │ BLE GATT Services │ │
│ │ - Provisioning Service │ │
│ │ (Wi-Fi 設定送受信) │ │
│ │ - Debug Service │ │
│ │ (ログ配信・コマンド受信) │ │
│ │ - OTA Service │ │
│ │ (ファームウェア更新 - BLE経由) │ │
│ └────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────┐ │
│ │ WiFi Manager │ │
│ │ (プロビジョニング時のみ接続) │ │
│ │ ※OTAには使用しない │ │
│ └─────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────┐ │
│ │ Normal App (User Application) │ │
│ │ (起動時に即座に実行) │ │
│ │ - 30秒ごとにシリアルでHello World出力 │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────┘
│
Router/WiFi
│
(プロビジョニング時に接続のみ)
(OTA通信はBLE経由で実施)
| 項目 | 説明 |
|---|---|
| BLE通信 | プロビジョニング、OTA、ログ配信、デバッグコマンド送受信 - すべてBLE経由 |
| Wi-Fi | プロビジョニング時に接続を確認するのみ(OTAには使用しない) |
| OTA方式 | 完全にBLE経由でファームウェアを転送(HTTP OTAは実装されていない) |
| ログ管理 | リングバッファ方式で古いログから自動削除 |
ESP32 側で 3 つの独立した BLE GATT Service を提供します。
| 項目 | 値 |
|---|---|
| Service UUID | 8f4f0001-7c8d-5f3e-ac9b-2b3c4d5e6f70 |
| Characteristic UUID | 8f4f0002-7c8d-5f3e-ac9b-2b3c4d5e6f70 |
| 型 | Write (クライアント → デバイス) |
| 説明 | Wi-Fi 設定 (SSID/パスワード) を送信 |
プロトコル形式:
[SSID_LEN(1byte)] [SSID(N bytes)] [PASS_LEN(1byte)] [PASS(M bytes)]
例:
03 "ESP" 05 "12345" → SSID: "ESP", Password: "12345"
| Service UUID | 7f3f0001-6b7c-4f2e-9b8a-1a2b3c4d5e6f |
|---|---|
| DebugLogTx | |
| UUID | 7f3f0002-6b7c-4f2e-9b8a-1a2b3c4d5e6f |
| 型 | Notify (デバイス → クライアント) |
| 説明 | シリアルログを行単位で配信 |
| DebugCmdRx | |
| UUID | 7f3f0003-6b7c-4f2e-9b8a-1a2b3c4d5e6f |
| 型 | Write (クライアント → デバイス) |
| 説明 | デバッグコマンド送信 |
| DebugStat | |
| UUID | 7f3f0005-6b7c-4f2e-9b8a-1a2b3c4d5e6f |
| 型 | Read/Notify (デバイス → クライアント) |
| 説明 | ステータス情報取得 |
DebugLogTx のプロトコル:
[STRING] = null-terminated or newline-terminated log line
DebugCmdRx コマンド例:
"LVL:0" → ログレベルを ERROR に変更
"LVL:1" → ログレベルを WARN に変更
"LVL:2" → ログレベルを INFO に変更
"LVL:3" → ログレベルを DEBUG に変更
"CLR" → ログバッファをクリア
"PING" → ハートビート確認
| 項目 | UUID |
|---|---|
| Service UUID | 9f5f0001-8d9e-6f4e-bd0c-3c4d5e6f7180 |
| OtaControl | 9f5f0002-8d9e-6f4e-bd0c-3c4d5e6f7180 |
| 型 | Write/Read |
| 説明 | OTA制御コマンド(START/END/ABORT) |
| OtaData | 9f5f0003-8d9e-6f4e-bd0c-3c4d5e6f7180 |
| 型 | Write |
| 説明 | ファームウェアバイナリデータ送信 |
| OtaStatus | 9f5f0004-8d9e-6f4e-bd0c-3c4d5e6f7180 |
| 型 | Read/Notify |
| 説明 | OTA 進捗状態通知 |
OtaControl コマンド形式:
START:<size> → OTA開始(例: START:524288 = 512KB)
END → OTA完了・検証・再起動
ABORT → OTA中止
OtaData プロトコル:
- バイナリデータをチャンク単位で送信(BLEの最大MTUに応じて自動分割)
- 通常は180バイト以下のチャンクで送信(iOS/Bluefy向けに最適化)
- 順次書き込み(シーケンス番号なし)
OtaStatus 応答例:
IDLE → 待機中
READY → OTA開始準備完了
PROGRESS:102400/524288 → 進捗通知(100KB/512KB)
SUCCESS → OTA成功(再起動中)
ERROR:WRITE_FAILED → エラー発生
ABORTED → ユーザーによる中止
ESP32へのファームウェア更新は完全にBLE経由で実行されます。Wi-Fiは使用しません。
WebAppからBLE経由で OTA_MODE コマンドを送信します(DebugCmdRx Characteristicを使用)。
BLE Write (DebugCmdRx): "OTA_MODE"
デバイスは通常アプリの実行を一時停止し、OTAモードに入ります。
WebAppは OtaControl Characteristicに START:<size> を送信します。
BLE Write (OtaControl): "START:524288"
デバイス側では Update.begin(size) が呼ばれ、フラッシュのOTAパーティションが準備されます。
WebAppは .bin ファイルを読み込み、180バイト以下のチャンクに分割して OtaData Characteristicに順次送信します。
BLE Write (OtaData): [binary chunk 1]
BLE Write (OtaData): [binary chunk 2]
...
BLE Write (OtaData): [binary chunk N]
デバイス側では各チャンクを Update.write() でフラッシュに書き込みます。
デバイスは100KBごと、または完了時に OtaStatus をNotifyします。
BLE Notify (OtaStatus): "PROGRESS:102400/524288"
BLE Notify (OtaStatus): "PROGRESS:204800/524288"
...
全データ送信後、WebAppは OtaControl に END を送信します。
BLE Write (OtaControl): "END"
デバイス側では Update.end(true) が呼ばれ、ファームウェアが検証されます。成功すると自動的に再起動します。
BLE Notify (OtaStatus): "SUCCESS"
[デバイス再起動]
エラーが発生した場合、OtaStatusでエラーコードが通知されます。
ERROR:INVALID_SIZE → サイズが不正(0または2MB超過)
ERROR:BEGIN_FAILED → Update.begin() 失敗
ERROR:WRITE_FAILED → フラッシュ書き込み失敗
ERROR:END_FAILED → Update.end() 失敗(検証失敗)
ERROR:NOT_STARTED → OTA未開始状態でENDが呼ばれた
| 項目 | 値 |
|---|---|
| 最大ファームウェアサイズ | 2MB |
| 最小チャンクサイズ | 1バイト |
| 推奨チャンクサイズ | 180バイト(iOS/Bluefy向けに最適化) |
| 同時OTA | 不可(1デバイスずつ) |
| 途中再開 | 不可(中断したら最初からやり直し) |
ESP32のプログラムは、PCみたいにHDDに置くのではなく、**Flash(不揮発メモリ)**に書かれています。
OTAは「USBケーブルで書き込む代わりに、通信で書き込む」方法です。
- USB書き込み:
PC → USB/UART → Flashへ書き込み - OTA書き込み:
スマホ/PC →(Wi-Fi or BLEなど)→ Flashへ書き込み
BLE OTAでは、次の2者がやり取りします。
- 送る側(クライアント): iPad/スマホ/PCのアプリ(このプロジェクトではBluefyのWebアプリ)
- 受け取る側(デバイス): ESP32(BLEを受け、Flashへ書く)
重要なポイントとして、ESP32側には最初から**「受け取り&Flash書き込み」機能(OTAロジック)**が入っている必要があります。 (入っていないと、受け取って書き込めません)
[iPad/Webアプリ]
① ファーム(.bin)を選ぶ
② BLEでESP32へ小分け送信
↓
[ESP32]
③ 受け取った順にFlash(OTA領域)へ書く
④ 受信完了したら整合性チェック
⑤ 次回起動先を新ファームに切替
⑥ 再起動 → 新ファームで起動
BLEはWi-Fiよりデータ帯域が小さく、さらに1回に送れるデータ(パケットサイズ)も小さいため、 ファームウェア(数百KB〜数MB)を次のように送ります。
- 何千〜何万個の小さいチャンク(断片)に分割
- 順番に送信
- ESP32側で順番を管理してFlashへ追記
BLEでは「サービス」と「キャラクタリスティック」という入れ物を使います。
よくある構成(典型)は以下です。
- OTA Service - Control Characteristic(書き込み開始/終了/再起動などの命令)- Data Characteristic(ファーム本体データを流す)- Status Characteristic(進捗やエラーを通知)
イメージ:
- Control:
START,END,ABORT - Data: バイナリ断片をひたすら送る
- Status: 受信OK、CRC一致、書き込み失敗 など
ESP32のFlashは「パーティション」に分かれています。OTA対応ではよく次のような構成です。
factory(初期ファーム)ota_0(更新先1)ota_1(更新先2)nvs(設定保存)
更新は**今動いている領域とは別の領域(ota_0/ota_1)**に書きます。 これがOTAが安全な理由で、今動いているプログラムを直接書き潰しません。
OTA開始時にESP32は「次に書くべき空きスロット(ota_0 または ota_1)」を決めます。
BLEで届いた小片データを順にFlashへ書きます。実装上はだいたい次の流れです。
- 受信バッファへ取り込む
- Flashへ書く(一定サイズごと)
- オフセット(どこまで書いたか)を更新
ここで重要なのは、
- 途中で切断しても復帰できる設計にするか
- できないなら最初からやり直すか
を仕様として決めることです。
最後まで受け取ったら、ESP32は次をチェックします。
- 受信サイズが一致しているか
- ハッシュ/CRCが一致するか
- 署名(将来拡張)が正しいか
一致しない場合は失敗として破棄し、旧ファームのまま動作します。
チェックがOKなら、Flash上の管理情報に
「次の起動は ota_1(または ota_0)から起動する」
というフラグを書き込みます。
再起動するとブートローダがそのフラグを見て、新しい領域から起動します。
このシステムでは、Wi-Fiはプロビジョニング時の接続確認のみに使用されます。
| 用途 | 説明 |
|---|---|
| プロビジョニング確認 | BLE経由で受信したSSID/パスワードが正しいか確認 |
| IPアドレス取得 | 接続成功時のIPアドレスをBLE経由でWebAppに通知(参考情報) |
| 通常アプリでの使用 | ユーザーアプリ内でWi-Fi通信が必要な場合のみ使用 |
| 用途 | 理由 |
|---|---|
| OTA通信 | OTAは完全にBLE経由で実施(HTTP OTAなし) |
| 起動時接続 | 起動時は自動でWi-Fiに接続しない(遅延起動) |
[起動]
↓
[WIFI_IDLE] (待機中 - 未接続)
↓
[BLEプロビジョニング受信]
↓
[WIFI_CONNECTING] (接続試行中)
├→ [WIFI_CONNECTED] (成功 - IPアドレス取得)
└→ [WIFI_FAILED] (失敗 - 再試行待機)
| 項目 | 詳細 |
|---|---|
| ハードウェア | ESP32-S3 Super Mini + USB ケーブル |
| ソフトウェア | Python 3.x, PlatformIO CLI or VSCode |
| 開発環境 | Windows/Mac/Linux |
VSCode 拡張を使う場合(推奨):
- VSCode をインストール
- Extension マーケットプレイスで
platformioを検索 - "PlatformIO IDE" をインストール
CLI を使う場合:
pip install platformiocd MiconSide
platformio project init --board lolin_s3_mini --framework arduinoplatformio.ini にて以下が設定済みであることを確認:
[env:esp32-s3-devkitc-1]
platform = espressif32
board = lolin_s3_mini
framework = arduino
board_build.partitions = partitions_ota_2m.csv
monitor_speed = 115200- VSCode で
MiconSideフォルダを開く - PlatformIO ツールバー → Build をクリック
- Upload ボタンをクリック(ESP32を USB 接続)
- ビルド完了後、自動的に書き込みが開始
cd MiconSide
# ビルド
platformio run
# ボード接続後、アップロード
platformio run --target upload
# シリアルモニタ表示
platformio device monitor --speed 115200- Arduino IDE で
main.cppを開く - Tools → Board → "ESP32-S3 Super Mini" 選択
- Tools → Port → COM ポート選択
- Sketch → Upload
[起動]
↓
[工場出荷リセットトリガ判定]
├→ トリガあり → NVS 消去 → 再起動
└→ トリガなし ↓
[NVS 内の Wi-Fi 設定確認]
├→ 設定あり → 通常アプリ起動
│ (Wi-Fi は未接続)
│
└→ 設定なし → BLE プロビジョニングモード
(待機中)
起動時にシリアルモニタで以下が表示されます:
[2024-02-28 12:34:56] ESP32-S3 Super Mini Firmware v1.0.0 Started
[2024-02-28 12:34:57] BLE Advertising: "ESP32-XXXX"
[2024-02-28 12:34:58] Waiting for BLE connection...
[2024-02-28 12:35:00] [Hello] System initialized
BOOTボタンを3〜5秒長押し:
- NVS 内の Wi-Fi 設定を消去
- 再起動後、BLEプロビジョニングモードに遷移
| 項目 | 詳細 |
|---|---|
| デバイス | iPad(または Web Bluetooth 対応ブラウザ搭載機) |
| ブラウザ | Bluefy (iOS/iPad) または Chrome (Android/PC) |
| ネットワーク | Wi-Fi 環境(プロビジョニング後) |
Python HTTP サーバ:
cd WebAppSide
python -m http.server 8000その後、ブラウザで:
http://localhost:8000
- VSCode で
WebAppSide/index.htmlを右クリック - "Open with Live Server" をクリック
- ブラウザが自動で開く
cd WebAppSide
npm install -g netlify-cli
netlify deployWebApp は以下の 4 つのパネルから構成されます:
┌──────────────────────────────┐
│ BLE デバイス接続 │
├──────────────────────────────┤
│ [接続] ボタン │
│ ステータス: "未接続" │
│ デバイス名: - │
└──────────────────────────────┘
操作:
- [接続] ボタン → デバイス選択ダイアログ
- 接続完了後、[切断] ボタンに切り替わる
┌──────────────────────────────┐
│ Wi-Fi プロビジョニング │
├──────────────────────────────┤
│ SSID: [入力欄] │
│ パスワード: [入力欄] │
│ [送信] ボタン │
│ 結果表示: "接続中..." │
└──────────────────────────────┘
操作:
- SSID を入力(例:
MyWiFi) - パスワードを入力
- [送信] をクリック
- デバイスが Wi-Fi に接続されると、IPアドレスが表示される
┌──────────────────────────────┐
│ ファームウェア更新 (OTA) │
├──────────────────────────────┤
│ [ファイル選択] (.bin ファイル) │
│ [アップロード] ボタン │
│ 進捗: [===========] 100% │
│ 状態: "更新完了" │
└──────────────────────────────┘
操作:
- パソコンから
.binファイルを選択(最大2MB) - [アップロード] ボタンをクリック
- BLE経由でOTA_MODEコマンド送信
- ファームウェアデータをBLE経由で送信(180バイトチャンク)
- 進捗バーの表示を確認
- "更新完了" メッセージで完了 → デバイス自動再起動
- BLE接続が確立していることを確認してください
- アップロード中はデバイスとiPadを近い距離に保ってください(BLE範囲内)
- ファイルサイズが2MB以下であることを確認してください
┌──────────────────────────────┐
│ デバッグモニタ │
├──────────────────────────────┤
│ [購読開始] ボタン │
│ │
│ -------- ログ出力 -------- │
│ [12:34:56] [INFO] Hello │
│ [12:34:57] [ERROR] Fail │
│ [12:35:00] [DEBUG] State OK │
│ │
│ [クリア] ボタン │
│ コマンド: [LVL:3] [送信] │
└──────────────────────────────┘
操作:
- [購読開始] → ログ受信開始
- [クリア] → ログバッファをクリア
- コマンド欄に
LVL:3などを入力して [送信]
利用可能なコマンド:
| コマンド | 説明 |
|---|---|
LVL:0 |
ログレベルを ERROR に設定 |
LVL:1 |
ログレベルを WARN に設定 |
LVL:2 |
ログレベルを INFO に設定 |
LVL:3 |
ログレベルを DEBUG に設定 |
CLR |
ログバッファをクリア |
PING |
デバイスの応答確認 |
┌─────────────────────────────────────────────────────┐
│ 1. デバイスの起動 │
│ - ESP32をUSBで電源接続 │
│ - 起動完了: BLE広告開始 │
│ - iPad で BLE デバイスが見える │
└─————────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 2. iPad で WebApp を開く │
│ - Bluefy ブラウザで WebApp URL を開く │
│ - "BLE デバイス接続" パネル表示 │
└─────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 3. BLE 接続 │
│ - [接続] ボタンをクリック │
│ - デバイスリストから "ESP32-XXXX" 選択 │
│ - 接続完了: パネルが青く点灯 │
└─────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 4. Wi-Fi プロビジョニング(オプション) │
│ - SSID: "MyWiFi" を入力 │
│ - パスワード: "MyPassword" を入力 │
│ - [送信] をクリック │
│ → ESP32 が Wi-Fi に接続 │
│ → IP アドレス表示「192.168.1.100」 │
│ ✅ Wi-Fi接続確認完了(参考情報として表示) │
└─────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 5. デバッグログ確認(オプション) │
│ - デバッグモニタパネル → [購読開始] │
│ - ESP32 のログがリアルタイム配信 │
└─────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 6. ファームウェア更新 (OTA) - BLE経由 │
│ - 新しい .bin ファイルを選択 │
│ - [アップロード] をクリック │
│ → OTA_MODEコマンド送信(BLE経由) │
│ → ファームウェアデータ送信(BLE経由・180バイトチャンク) │
│ → 進捗表示(BLE Notifyで受信) │
│ → 更新完了: ESP32 が自動で再起動 │
│ → 再起動後、新しいファームウェア起動 │
└─────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 7. 完了 │
│ - 再起動後は通常アプリが起動 │
│ - Wi-Fi は接続しない(次回プロビジョニングまで) │
│ - 通常アプリがWi-Fi通信が必要な場合のみ使用 │
└─────────────────────────────────────────────────────┘
[BLE プロビジョニング開始]
↓
[Wi-Fi 設定受信 (BLE)]
↓
[NVS に保存]
↓
[Wi-Fi 接続試行]
├→ [成功]
│ ↓
│ [IP アドレス取得]
│ ↓
│ [BLE で IPアドレス通知]
│ ↓
│ [プロビジョニング完了]
│ └→ 通常アプリ起動
│
└→ [失敗]
↓
[BLE でエラー通知]
↓
[再試行待機]
[BLE接続済み]
↓
[.bin ファイル選択]
↓
[WebApp が BLE経由で OTA_MODE コマンド送信]
↓
[ESP32がOTAモードに入る - 通常アプリ停止]
↓
[WebApp が OtaControl に START:<size> を送信 (BLE Write)]
↓
[ESP32 が Update.begin(size) を実行]
↓
[WebApp がファームウェアを180バイトチャンクに分割]
↓
[各チャンクを OtaData に送信 (BLE Write)]
├→ Chunk 1: Write → Update.write()
├→ Chunk 2: Write → Update.write()
└→ Chunk N: Write → Update.write()
↓
[100KBごとに進捗を OtaStatus で通知 (BLE Notify)]
├→ PROGRESS:102400/524288
├→ PROGRESS:204800/524288
└→ ...
↓
[全チャンク送信完了]
↓
[WebApp が OtaControl に END を送信 (BLE Write)]
↓
[ESP32 が Update.end(true) を実行 - ファームウェア検証]
↓
[検証成功 → OtaStatus で SUCCESS を通知]
↓
[デバイス自動再起動]
↓
[新しいファームウェア起動]
↓
[通常アプリ実行]
| 症状 | 原因 | 解決方法 |
|---|---|---|
| 接続ボタンをクリックしてもデバイスが出現しない | ESP32 起動失敗 / BLE 広告していない | 1. ESP32 を再起動 2. シリアルモニタで "BLE Advertising" が表示されることを確認 3. Bluefy のバージョンを最新にアップデート |
| デバイスが表示されるが接続失敗 | BLE ペアリング要求 / 範囲外 | 1. ESP32 と iPad を近い距離に配置 2. ペアリングが要求された場合、承認 3. WebApp をリロード後、再試行 |
| 接続後、すぐに切断される | BLE リソース不足 / メモリ不足 | 1. iPad の Bluetooth 設定をリセット 2. iPad を再起動 3. ESP32 を再起動 |
| 症状 | 原因 | 解決方法 |
|---|---|---|
| SSID や Password が受を受け付けない | BLE 接続が確立していない | 1. BLE 接続を確認 (パネルが青く点灯) 2. デバッグモニタで "PROVISIONING" ログを確認 |
| Wi-Fi 接続に失敗する | SSID/Password が間違っていない ルータ接続不可 |
1. SSID と Password を確認 2. ルータが 2.4GHz を対応しているか確認 3. ルータ側で ESP32 の接続を許可 |
| IP アドレスが表示されない | Wi-Fi の DHCP がタイムアウト | 1. ルータの DHCP 機能を有効化 2. ESP32 を再起動して再プロビジョニング 3. ルータとの距離を縮める |
| 症状 | 原因 | 解決方法 |
|---|
| 症状 | 原因 | 解決方法 |
|---|---|---|
| OTA_MODEコマンドが送信できない | BLE接続が切断された | 1. BLE接続を再確立 2. デバイスを再起動 3. WebAppをリロード |
| .bin ファイル選択ボタンが反応しない | ファイル形式が間違っている WebApp の読み込み失敗 |
1. ファイル拡張子が .bin か確認2. WebApp をリロード 3. 別のファイル選択ツールを使用 |
| アップロード中に進捗が止まる | BLE接続の問題 デバイス側のメモリ不足 |
1. ESP32 と iPad を近い距離に配置 2. 他のBLE機器を切断 3. ファイルサイズを確認(2MB以下か) |
| ERROR:WRITE_FAILEDエラーが出る | フラッシュ書き込み失敗 | 1. デバイスを再起動 2. パーティションテーブル(partitions_ota_2m.csv)を確認 3. ファームウェアサイズを確認 |
| アップロード完了後、デバイスが再起動しない | Update.end()失敗(検証エラー) | 1. シリアルモニタでエラーメッセージを確認 2. ESP32 を手動でリセット 3. ファームウェアイメージを再ビルド |
| BLEのMTUサイズエラー | チャンクサイズがMTUを超過 | 1. WebApp側のチャンクサイズを180バイト以下に設定 2. デバイス再接続 |
| 症状 | 原因 | 解決方法 |
|---|---|---|
| [購読開始] をクリックしても何も表示されない | BLE Subscribe が失敗 | 1. BLE 接続を再確立 2. WebApp をリロード 3. iPad を再起動 |
| 最初だけログが表示され、その後途切れる | ログバッファがオーバーフロー | 1. [クリア] ボタンでバッファをクリア 2. ログレベルを下げる ( LVL:1)3. ESP32 側でログ出力を削減 |
| 症状 | 原因 | 解決方法 |
|---|---|---|
| デバイス名が "ESP32" より詳細でない | メモリ不足 / 名前設定が未実装 | 1. ESP32 を再起動 2. main.cpp の device_name を確認 |
| WebApp が応答しない | ブラウザキャッシュ問題 メモリ不足 |
1. Bluefy キャッシュをクリア 2. iPad を再起動 3. WebApp URL をリロード (Ctrl+R or Cmd+R) |
より詳細な情報は以下をご参照ください:
| 文書 | 内容 |
|---|---|
| CreatePlan.md | 実装詳細設計書(ESP32 側の実装方針) |
| SpecifcationDoc.md | システム仕様書(全体仕様) |
| MiconSide/README.md | マイコン側ビルド・アップロード詳細手順 |
| WebAppSide/README.md | WebApp デプロイ・カスタマイズ手順 |
このプロジェクトはオープンソースです。自由に利用・改変・配布できます。
問題が発生した場合:
- シリアルモニタ(マイコン側)のログを確認
- ブラウザの開発者ツール(WebApp 側)でエラーを確認
- 本 README の トラブルシューティング セクションを参照
- ドキュメント内の詳細仕様を確認してから、デバイスやアプリを再起動
最終更新: 2026-02-28
実装対応版: CreatePlan.md v0.1 / SpecifcationDoc.md v0.2 (BLE OTA実装版)
重要: HTTP OTAは実装されていません。すべてのOTA通信はBLE経由で実施されます。