GUIDE / ESPFLASH
ESP32でOTA(Over-The-Air)ファームウェア更新を有効にし、AndroidスマートフォンのESPFlashから新しいビルドをプッシュする実践ガイド。
ESPFlashでESP32のOTAアップデートを設定する方法
IoT機器やセンサー端末を実際の環境(天井裏、防水ケース、屋外ポールなど)に恒久設置した後は、ファームウェアの修正や機能追加のたびにUSBケーブルを接続するのは現実的ではありません。そこで重要になるのが、Wi-Fiネットワーク経由でファームウェアを書き換える「OTA(Over-The-Air)アップデート」の仕組みです。
従来、現場でのOTA書き込みにはノートPCの持参や複雑なサーバー環境が必要でした。Android対応のフラッシュツール ESPFlash を活用すれば、手元のスマートフォン1台で組み込み開発を完結できます。ESPFlashでは現在USB OTG経由の高速書き込みに対応しているほか、近日公開予定の新機能として「ワイヤレスOTAアップデート機能」 の実装が進められています。
本ガイドでは、ESP32で安全にOTAを運用するためのパーティション設定、ファームウェアコードの実装手順、そしてESPFlashを使ったモバイル運用フローを詳しく解説します。
ESP32のOTAアーキテクチャとロールバック機構
OTAアップデートを正しく実行するには、ESP32のフラッシュメモリ内に最低2つの独立したアプリケーション領域が必要です。
otadataパーティション: 次回起動時にどの領域(ota_0またはota_1)からファームウェアをロードするかを記憶する小さな管理領域です。ota_0(スロットA)とota_1(スロットB): 交互にファームウェアを書き込むための領域です。- ロールバック機構: 例えば
ota_0で動作中に新しいファームウェアを受信すると、データはota_1へ書き込まれます。転送完了後に再起動し、新ファームウェアが正常起動しない(またはクラッシュする)場合は、自動的に元の安全なパーティションへフォールバックします。この仕組みにより、文鎮化(Bricking)を防ぐことができます。
手順1:OTA対応のパーティションテーブルを設定する
標準設定のESP32ではOTA領域が確保されていない場合があります。4MB以上のフラッシュメモリを搭載したモジュールを用意し、パーティション構成を変更します。
Arduino IDEの場合
メニューの ツール > Partition Scheme から 「Minimal SPIFFS (1.9MB OTA with spiffs)」 または 「Default 4MB with ffat/ota」 を選択します。
ESP-IDF / PlatformIOの場合
プロジェクト直下の partitions.csv に以下を定義します。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 0x100000,
ota_0, app, ota_0, 0x110000,0x170000,
ota_1, app, ota_1, 0x280000,0x170000,
これにより、約1.4MBずつのファームウェアスロットが2面確保されます。
手順2:ファームウェアにOTA受信コードを組み込む
Arduino環境での最も標準的な実装例です。ArduinoOTA ライブラリを使用してOTAサーバーリスナーを立ち上げます。
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi接続完了: ");
Serial.println(WiFi.localIP());
ArduinoOTA.setHostname("esp32-node");
ArduinoOTA.setPassword("adminpass"); // セキュリティパスワード
ArduinoOTA.onStart([]() {
Serial.println("OTAアップデート開始");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nOTA完了、再起動します");
});
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle(); // メインループで定期的に呼び出す
}
手順3:初回書き込みと初期設定(ESPFlash USB OTG)
OTA機能を利用するには、初回のブートローダーとパーティションテーブルを一度有線で書き込む必要があります。
- AndroidスマートフォンとESP32をUSB OTGケーブルで接続します。
- ESPFlash を起動し、ビルド済みの
.binファイルを選択します。 - 書き込みを実行し、完了後に再起動させます。
- SerialFlow Terminal でシリアルログを開き、ESP32がWi-Fiに接続してIPアドレスを取得したことを確認します。
手順4:スマートフォンからのワイヤレス更新(近日提供予定のOTA機能)
基板を現場に設置した後のファームウェア更新は、ESPFlashに近日追加されるOTA機能 を使用してワイヤレスで行えます。
- バイナリの準備: スマートフォンのローカルストレージやクラウドストレージ(Google Drive等)に新バージョンの
.binファイルを保存します。 - 対象デバイスの探索: スマートフォンを同じWi-Fiに接続し、ESPFlashのOTA画面で自動検出(mDNS)されたESP32を選択するか、IPアドレスを直接指定します。
- ワイヤレス転送: パスワードを入力して更新を開始します。転送の進捗バーが表示され、データの整合性検証が行われます。
- 自動切り替え: 新ファームウェアが正常に書き込まれるとESP32が自動再起動し、新しいバージョンでの稼働が始まります。
OTAアップデートのトラブルシューティング
- 「Not Enough Space」エラー: バイナリサイズがOTAパーティションの容量(例: 1.4MB)を超えている場合に発生します。不要なライブラリやデバッグ文字列を削減するか、パーティションサイズを拡大してください。
- 書き込み中のWi-Fi切断: ESP32はフラッシュ書き込みと無線通信を同時に行う際、瞬時的に大きな電流(400〜500mA以上)を消費します。電源容量が不足していると電圧降下でリセットがかかるため、十分な電源を供給してください。
- 起動失敗時の復旧: 万が一新ファームウェアが破損して起動しなくなった場合でも、ESPFlash とUSB OTGケーブルを接続すれば、いつでも直接ファームウェアを上書きして修復できます。
まとめ
ESP32のOTA機能を有効化することで、設置済みデバイスのメンテナンス性は飛躍的に向上します。初回のUSB OTG有線フラッシュから将来のワイヤレスOTA更新までを担う ESPFlash と、シリアルログ監視・デバッグを行う SerialFlow Terminal を組み合わせれば、PCを持たずにスマートフォンだけでプロ仕様の組み込み開発・運用が実現します。