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機能を利用するには、初回のブートローダーとパーティションテーブルを一度有線で書き込む必要があります。

  1. AndroidスマートフォンとESP32をUSB OTGケーブルで接続します。
  2. ESPFlash を起動し、ビルド済みの .bin ファイルを選択します。
  3. 書き込みを実行し、完了後に再起動させます。
  4. SerialFlow Terminal でシリアルログを開き、ESP32がWi-Fiに接続してIPアドレスを取得したことを確認します。

手順4:スマートフォンからのワイヤレス更新(近日提供予定のOTA機能)

基板を現場に設置した後のファームウェア更新は、ESPFlashに近日追加されるOTA機能 を使用してワイヤレスで行えます。

  1. バイナリの準備: スマートフォンのローカルストレージやクラウドストレージ(Google Drive等)に新バージョンの .bin ファイルを保存します。
  2. 対象デバイスの探索: スマートフォンを同じWi-Fiに接続し、ESPFlashのOTA画面で自動検出(mDNS)されたESP32を選択するか、IPアドレスを直接指定します。
  3. ワイヤレス転送: パスワードを入力して更新を開始します。転送の進捗バーが表示され、データの整合性検証が行われます。
  4. 自動切り替え: 新ファームウェアが正常に書き込まれると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を持たずにスマートフォンだけでプロ仕様の組み込み開発・運用が実現します。