【ミーア】ESP32のOTAアップデート機能を実装して、遠隔でファームウェアの更新を行えるようにする。デバイス編
はじめに
ESP32のWiFiモジュールを搭載した猫型ロボット「ミーア」の開発を進めているが、今回は製品をユーザーに提供後に新機能をリリースした際に、開発者がリモートでファームウェアの更新を行えるようにするために、OTAアップデート機能を導入する。
ESP32が提供する2つのOTAアップデート機能
OTA(Over The Air)は、データの送受信を無線通信で行うための技術。OTA機能により、ESP32のファームウェアは無線(Wi-Fiなど)を通じてリモートからアップデートが可能になる。
ESP32のOTA Exampleはこちら。
ESP-IDFは、ESP32のOTAアップデートに対応するために2つの異なる方法(app_update, esp_https_otaコンポーネント)を提供している。
app_updateコンポーネント
ESP32の基本的なOTAアップデート機能を提供する。
ファームウェアを遠隔で更新するための低レベルのAPIを提供しており、開発者が細かく制御できる。
低レベルのAPIとは、「より詳細な操作が必要で、開発者がアップデートプロセスの各ステップを自分で管理し、カスタマイズする必要があること」を意味する。
より柔軟なOTAアプリケーションの実装が可能だが、実装が複雑になる可能性がある。
esp_https_otaコンポーネント
HTTPSを通じてOTAアップデートを行うための、高レベルのAPIを提供する。
高レベルのAPIとは、「複雑な処理が多く内部で隠蔽されており、開発者はより簡単な手順でOTAアップデートを実装できること」を意味する。
HTTPS通信を利用しているため、セキュリティが強化されており、インターネット経由で安全にファームウェアを更新できる。
簡単に設定できるため、迅速にOTA機能を実装できるが、カスタマイズの自由度は低くなる。
今回は、AWS S3内にOTAアップデート用のファームウェアをアップロードして、HTTPSエンドポイントとするのでesp_https_otaコンポーネントを使用する。
esp_https_otaに関する説明と実装方法はこちら。
OTAによるFirmware Updateの流れ
HTTPSサーバーの設定とファームウェアのアップロード
開発者が新しいファームウェアバージョン(firmware.binなどのバイナリファイル)を作成する。
この新しいファームウェアファイルをHTTPSサーバーにアップロードする。
ESP32によるファームウェアのダウンロードとアップデート:
ESP32は設定されたタイミング(例えば、デバイスの起動時や定期的なチェック時)にHTTPSサーバーに接続する。
HTTPSサーバーから新しいfirmware.binファイルを検出し、ダウンロードを開始する。
ダウンロードしたファームウェアはESP32のフラッシュメモリ内のota_0またはota_1パーティションに保存される。ESP32は次回の起動時に新しいファームウェアを使用して起動する
まずは、専用のOTAパーティションテーブルの作成から始める。次にESP-IDFのesp_https_ota APIを使用してファームウェアのダウンロードとアップデートを行うコードを記述する。
OTAパーティションテーブルの作成
ESP32でOTAアップデート用には、少なくとも2つのOTA partition(例: ota_0、ota_1)ga必要。
現状のpartition tableがこちら。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x09000, 0x5000,
otadata, data, ota, 0x0e000, 0x2000,
app0, app, ota_0, 0x010000, 0x390000,
spiffs, data, spiffs, 0x400000, 0xC00000
otadata: OTAデータパーティション。OTAアップデートの状態を追跡するのに使用され、どのアプリケーションパーティションがアクティブかを示す。
app0 (ota_0): 最初のアプリケーションパーティション。ここに新しいファームウェアが格納される。
ただし、OTAアップデートをサポートするためには、後述するOTAアップデートのプロセスの観点から、少なくとももう一つのアプリケーションパーティション(ota_1など)が必要。
OTAアップデートのプロセス
交互にアップデート: ESP32はota_0とota_1を使って交互にアップデートする。例えば、現在ota_0を使っているとすると、次のアップデートでは、新しいファームウェアを、、、
続きはこちらで記載しています。