PlatformIOでESP32(M5Stick-C)のOTA機能を使う

M5Stick-Cに使用されているマイコンESP32には、Wi-Fi経由でプログラムをアップできるOTA(Over The Air)機能があります。ArduinoIDEでは比較的簡単にできますが、PlatformIOでやる方法があまりまとまっていなかったので、備忘録としてまとめました。

※本記事ではM5Stick-Cを使用していますが、ほぼ同じ方法でESP32の開発ボードにも適用可能です。参考にしてください。

参考サイト

PlatformIOの準備

PlatformIOでM5Stick-Cを使うを参考に、PlatformIOからM5Stick-Cに書き込む準備をします。

適当なプロジェクトを作成しておきます。

プログラム

いたって普通のArduinoOTAのプログラムです。
いつもの通りYOURSSIDとPASSWORDは各自の環境に合わせて変更してください。

ここで、setHostname(“myesp32”)とすることでIPではなくmyesp32という名前で参照できるように変更しています。後ほど使います。

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <M5StickC.h>

const char* ssid = "YOURSSID";
const char* password = "PASSWORD";

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  ArduinoOTA.setHostname("myesp32");
  
  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });

  ArduinoOTA.begin();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

処理は、loop内に追記しましょう。上記のコードはOTAの最小構成なので、書き込むときに必ず残さなければならず、消すとOTAできなくなります。

platformio.ini(重要)

コードはこれで完成ですが、重要なplatformio.iniの設定があります。platformio.iniを開き、下記のコードを貼り付けてください(M5Stick-Cの一例)。

[env:m5stick-c_ota]
platform = espressif32
board = m5stick-c
framework = arduino
lib_deps = 
	m5stack/M5StickC@^0.2.0
monitor_speed = 115200
upload_protocol = espota
upload_port = myesp32

[env:m5stick-c]
platform = espressif32
board = m5stick-c
framework = arduino
lib_deps = 
	m5stack/M5StickC@^0.2.0
monitor_speed = 115200

platformio.iniでは以下の3つがポイントとなります。

・[env:hogehoge]でhogehogeという環境(ビルド・書き込み条件)を追加
・upload_protocol = espota でOTAでの書き込みを明示
・upload_port = hogehoge でhogehogeという名前のESP32に接続

よく見てみると、2つある環境の違いはupload_protocolとupload_portがあるか否かですね。他のESP32ボードでも、このように2つの環境を作り、2行付け足せばOKです。

因みに、upload_port = myesp32 の右辺はプログラム内で明示した名前です。代わりに upload_port = 192.168.1.100のようにIPを指定することもできます。(私は固定IPの設定行を書くのが面倒で、かつ変動するIPを毎回打つのはだるいので名前を付けました…

直接書き込み

これで環境関係の準備は終了。
次に書き込みますが、この時点ではESP32にOTAのプログラムがないので、最初だけ有線で書き込む必要があります。

画面下のenvをOTAなしバージョンに切り替えます。私のplatformio.iniでいうと[env:m5stick-c]ですね。

これで→をクリックし、書き込みます。書き込みが成功すると以下の画面になります。

OTA書き込み

次に、環境を[env:m5stick-c_ota]に切り替えます。この状態で→を押して書き込んでみて下さい。同一ネットワーク内のmyesp32という名前のデバイスを検索し、書き込みが始まります。

書き込みが完了しました。

参考になるサイト

platformio.ini周りの設定はPlatformIOのESP32ページが参考になります。
下図の通りOTAのオプションなども載っているので、眺めてみると面白いです。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です