ESP32 Arduino: softAPでOTAプログラム書き込み

Arduino開発

平成30年度公開講座で演習する内容です。

ESP32マイコンにはWiFi機能が内蔵されており,無線LANルーターに接続して使用できます(ESP32マイコンは無線子機として動作)。ESP32へのプログラムの書き込みは,USB以外にも無線経由でのプログラム書き込み(OTA: Over the air)もサポートしています。OTAでプログラムを書き込むためだけに無線LANルーターを準備するのは面倒です。そこで,ESP32をsoftAP(WiFi AP, 固定IP)で起動して,OTAでプログラム書き込みを行うと便利です。特に,IoT機器などケースに組み込んで使う場合に威力を発揮しそうです。セキュリティが気になる場合には,書き込み時のパスワード設定ができ,開放ポートの設定も変更できるようです。

(1) BasicOTA(スケッチ例)を次のコード例のようにSoftAPに対応させた後,プログラムをUSB経由で書き込みます。

(2) WiFi APの一覧から<ssid>に接続します。

(3) Arduinoのツール->ポートに,esp32-<mac address> at 192.168.4.1 が現れるので選択します。

(4) BasicOTAに初期化コード,処理コードを追記します。ここで,OTA関係のコードは削除せずそのままにしておきます。

(5) Arduinoの書き込みボタンを押して,プログラムをOTAで書き込みます。

(初回書き込み時,ポートのアクセス許可が必要です。ポップアップでウィンドウが開きます。)

/*
 * BasicOTA-SoftAP.ino
 * 1. BasicOTAを書き込む(USB)
 * 2. WiFi APに接続 (ssid)
 * 3. BasicOTAにコードを追加(この例ではコメントアウト)
 * 4. ツール->ポート: esp32-<mac address> at 192.168.4.1
 * 5. プログラムをOTAで書き込む
 */
#include <WiFi.h>
#include <ArduinoOTA.h>

// WiFi設定
const char *ssid = "(ssid)"; // 適宜設定
const char *pass = "(password)"; // 適宜設定
const IPAddress ip(192, 168, 4, 1);      // IPアドレス
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

// LED設定
const int LED_PIN = 18;

void setup() {
  Serial.begin(115200);
  delay(100);

  // WiFi AP設定
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAPConfig(ip, ip, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssid, pass);
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP); // IPアドレス確認

  // OTA設定
  // 以下,消さない
  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();

//=============================================
// ここに初期化コードを書く
//  pinMode(LED_PIN, OUTPUT);
//=============================================
}

void loop() {
  ArduinoOTA.handle(); // 消さない

//=============================================
// ここに処理を書く
//  digitalWrite(LED_PIN, HIGH);
//  delay(1000);
//  digitalWrite(LED_PIN, LOW);
//  delay(1000);
//=============================================
}

コメント

タイトルとURLをコピーしました