[IoT] PlatformIO を使って ESP8266 を OTA できるまでの手順おさらい

PlatformIO を使って ESP8266 を OTA できるようにするまでの手順をおさらいします

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Big Sur 11.1
  • Visual Stduio Code 1.52.1
  • PlatformIO Core:5.0.3 Home:3.3.1
  • NodeMCU 1.0

OTA で ESP8266 のアップデート

Web 検索で うまく見つからなかったので改めて書いてみました。

環境セットアップ

Visual Studio Code 上に PlatformIO を セットアップしていることを想定してます。

ESP32 向けですが、以下の記事にまとめてます。
[IoT] VisualStudio + PlatformIO + ESP32 での環境構築

PlatformIO で プロジェクト作成

PlatformIO の Home から、"+ New Project" を押下し、Name に適当な名前を設定後、Board で "NodeMCU 1.0(ESP-12E Module)" を選択します。

Framework は Arduino が自動で選択されるのでそのままにして、"Finish" を押下します。

環境の動作確認:L チカ動作

まずは、環境がセットアップできていることを確認します。

以下のコードを書き込めることを確認してみます。main.cpp にまるっとコピーして、書き込んでみます。

コード
#include 

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  // but actually the LED is on; this is because
  // it is active low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(1000);                      // Wait for two seconds (to demonstrate the active low LED)

}

いわゆる Lチカ です。

このコードが書き込めて、ボード上の青い LED が1秒ごとに点滅すれば、環境セットアップができていることがわかります。

OTA コードの書き込み

Arduino 環境では、[ファイル]-[スケッチ例]-[ArduinoOTA]-[BasicOTA] とすることで、サンプルを参照することができます。

まるっと PlatformIO の main.c にコピーしてきます。 自分のネットワークに接続できるように STASSID と STAPSK を適宜変更してください。

コード
#include 
#include 
#include 
#include 
 
#ifndef STASSID
#define STASSID "自分の環境のSSID"
#define STAPSK  "WIFIパスワード"
#endif
 
const char* ssid = STASSID;
const char* password = STAPSK;
 
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 8266
  // ArduinoOTA.setPort(8266);
 
  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");
 
  // 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);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.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());
 
  // setup ping in/out
  pinMode(LED_BUILTIN, OUTPUT);
 
}
 
void loop() {
  ArduinoOTA.handle();
 
  // LED On/Off
  digitalWrite(LED_BUILTIN, HIGH)  ;
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
 
}

モニタースピード設定

そのままでは、PlatformIO 上で モニターできません。

ログにも表示されてますが、PlatformIO では、デフォルト 9600 らしいので、これをコード上に指定している 115200 にする必要があります。

プロジェクトに含まれる platform.ini ファイルで設定を追加・変更します。

以下のように行を追加します。

コード
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200    ; 追加した行

この状態でも、OTA による更新ができるのですが、ESP8266 の起動時に設定された IP を記録しておかないといけません。

少し不便なので、IP 固定で起動するように変更します。

IP アドレス指定

Main.cpp のコードを 以下のように修正することで、IP アドレス指定で起動することができます。

指定したい IP アドレスや、Gateway の IP アドレス等 は、環境に合わせて設定してください。

コード
// .. snip ..
const char* password = STAPSK;

IPAddress ip(192,168,1,100);        // 設定したい IP アドレス
IPAddress gw(192,168,1,1);          // gateway IP アドレス
IPAddress subnet(255,255,255,0);    // subnet
IPAddress DNS(192,168,1,1);         // DNS IP アドレス

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gw, subnet);      // IPアドレス等の設定
  WiFi.begin(ssid, password);
// .. snip ..

上記のコードをコンパイルし、upload して以下のような表示が出れば成功です。

コード
Ready
IP address: 192.168.1.100    // 設定した IP アドレス

この IP は固定のため、これ以降は この IP アドレスの機器をアップデートするように 設定していきます。

OTA upload 設定

Platform.ini のファイルに以下を追加することで、シリアルポート経由のアップロードではなく、IP 指定の OTA アップデートとなります。

コード
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
upload_protocol = espota        ; OTA 指定
upload_port = 192.168.1.100     ; OTA 対象とする IP 指定

OTA のために、残しておかなければいけないコード

現時点でのほとんどのコードは、WIFI 設定や OTA 設定のためのコードなので 自分のプログラムを追加していく際に消してはいけません。

言い換えると、消してしまっても構わないのは、Lチカのためのコードだけです。

まとめ:ESP8266 を PlatformIO 環境で OTA するまでの手順

ESP8266 を PlatformIO 環境で OTA するまでの手順
  • ESP8266 向けの環境を PlatformIO 上で構築する
  • Arduino 環境から、OTA コードを持ってくる
  • シリアルモニタのスピードを設定する
  • (必要であれば)IP指定する
  • PlatformIO 上で OTA を使った upload を設定する

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

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