IoTマイコンのESP32にWi-Fi経由でプログラムを書き込む【OTA】

IoTマイコンのESP32にWi-Fi経由でプログラムを書き込む【OTA】

こんにちは。今回もIoTマイコンとして非常に有用なESP32を使っていきます。

使用環境

  • windows10
  • ESP32 dev kit c
  • Arduino 1.8.5

OTAとは

OTAとは無線通信を介してプログラムを送る技術で、英語ではOver The Airと書かれます。この略がOTAですね。

ESP32のArduinoライブラリにはこのOTAのサンプルプログラムが最初から入っています。今回はこれを使って、OTA対応にしていきましょう。
(なぜかOTA後の方がUSBで書き込むより速いので、割とおすすめです)

どんなことができるのかは、下の動画を見てもらうのが早いでしょう。
完全にPCから隔離された状態からプログラムを書き込みます。
ここではモバイルバッテリーから電源をとり、速い点滅をするプログラムから遅い点滅をするプログラムへと書き換えています。

サンプルプログラムを書き込む

  1. ファイル→スケッチ例→ArduinoOTAからBasicOTAを選びます。

  2. ssidとpasswordを繋げたいWi-Fiの情報に書き換えてから、通常通り書き込みましょう。書き込んだ条件はこちら

  3. 書き込みが終わったら、書き込みポートを確認してみてください。ここでネットワークポートとしてESP32が見つかればOK。

OTAでプログラムを更新する

ここからが重要です。OTAでプログラムを書き込む際、サンプルプログラムのBasicOTAにプログラムを追記してください。

というのも、loop()にある

ArduinoOTA.handle()

が動いていないとOTA経由での書き込みが許されなくなります。

試しにGPIOの26に繋がったLEDを0.5秒おきに点滅させるプログラムをOTA経由で書き込んでみます。

プログラム

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

const char* ssid = "**********";    //Wi-Fiのアクセスポイント名に書き換えてください
const char* password = "********"; //Wi-Fiのパスワードに書き換えてください

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());

  pinMode(26,OUTPUT);
}

void loop() {
  ArduinoOTA.handle();
  digitalWrite(26,HIGH);
  delay(500);
  digitalWrite(26,LOW);
  delay(500);
}

  1. 書き込みポートを先程出てきたネットワークポートにする
  2. 通常通り書き込みボタンを押して書き込む
    この時、windowsの場合はネットワークの許可画面が出てきます。正直有志のライブラリであり怖いので、プライベートネットワークのみ許可しましょう。

以上です。これで無事に遠隔でプログラムを書き込めるようになりましたね!
お役に立てば幸いです。

2件のコメント

返信を残す

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