BasicOTA

はじめに

基本的なOTAアップデート(Over The Air: この場合無線でスケッチを書き込むこと)の使い方です。

動作確認は、ESP32 2.0.2のときのものです。

プログラム

定義等

1
2
3
4
5
6
7
8
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "..........";
const char* password = "..........";
 

ssidとpasswordは、WiFiアクセス用のSSID/パスフレーズです。

setup()

 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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();
  }

  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  // ArduinoOTA.setHostname("myesp32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      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());
}
 

12行目から18行目はWiFiアクセスポイントへの接続です。

WiFi.mode()で、WiFiのモードを設定します。WiFi.begin()でアクセスポイントに接続します。WiFi.waitForConnectResult()で、接続を待ちます。接続に失敗したときは、ESP.restart()で、ボードを再起動しています。

20行目から59行目で、OTAアップデートの初期設定を行います。20行目から31行目まではコメントアウトされていますが、あわせて紹介します。

ArduinoOTA.setPort()は、OTAアップデートで利用するポート番号を設定します。設定しない場合は3232が利用されます。

ArduinoOTA.setHostname()は、OTAアップデートで利用するESP32のホスト名を設定します。設定しない場合は、esp32-[MACアドレス]が設定されます。コメントでは、esp3232-[MAC]となっていますが、“esp3232-“ではなく、“esp32-“です。

ArduinoOTA.setPassword()は、OTAアップデートで利用するパスワードを設定します。設定しない場合、パスワードは聞かれません。設定した場合は、以下のように、スケッチを書き込む際にパスワードの入力を求められます。

ArduinoOTA.setPasswordHash()は、OTAアップデートで利用するパスワードをmd5ハッシュ化したものを設定します。

33行目からは、OTAアップデートを行う際の挙動を設定します。OTAアップデートの開始時、終了時、更新中、エラー時に実行する関数を登録することができます。例では、さまざまな情報をシリアルコンソールに表示していますが、現状(Arduino-1.8.13)のArduino IDEのシリアルモニタはOTA利用時は利用できません。ターミナルソフト等で見ることができます(が、シリアルポートへのアクセスが必要なので、どこまで意味があるかはわかりません)。

ArduinoOTA.onStart()は、OTAアップデートの開始時に実行する関数を登録します。ここでは、ArduinoOTA.getCommand()で取得したコマンドのタイプを表示します。

ArduinoOTA.onEnd()は、OTAアップデートの終了時に実行する関数を登録します。

ArduinoOTA.onProgress()は、OTAアップデートでの更新中に実行する関数を登録します。

ArduinoOTA.onError()は、OTAアップデートのエラー発生時に実行する関数を登録します。

onStart()とonEnd()、onProgress()、onError()の呼び出し方は、メソッドチェーンと呼ばれるもので、*thisを返す関数で利用することができます。また、関数をつづけて呼び出すことができるものです。また、これらの関数は引数として関数へのポインタをとりますが、このスケッチ例では、ラムダ式を用いています。

最後に、ArduinoOTA.begin()で、OTAアップデートサービスを開始します。

loop()

66
67
68
void loop() {
  ArduinoOTA.handle();
}

ArduinoOTA.handle()で、OTAアップデートの実行を処理します。この関数はスケッチの実行中に常に呼び出し続ける必要があります。

OTAを利用してスケッチを書き込む際は、このスケッチ例をベースに、新しくスケッチを書くことになります。

OTAアップデート対応のスケッチを実行しているときは、以下のように、シリアルポートを選択するメニューにネットワークポートが表示され、OTAアップデートが利用できるようになります。

バージョン

Hardware:ESP-WROOM-32
Software:Arduino core for the ESP32 2.0.4

最終更新日

September 4, 2022

inserted by FC2 system