前回の記事では、ESP32-C3-WROOM-02-N4にSSD1306 OLEDディスプレイを接続して表示を行い、その後、次回のプログラム書き込みにOTA(Over The Air)を利用できるように準備しました。
ESP32-C3-WROOM-02-N4(他のESP32あるいはpico-wでも)では、Wi-Fiに接続した状態でOTA機能を利用することで、USBケーブルを使わずに無線でプログラムを書き込むことができます。
今回は、前回作成したOTA対応プログラムを利用して、実際にOTAで新しいプログラムを書き込んでみます。
まずは動作確認を分かりやすくするため、今回は**Lチカ(LEDを点滅させるプログラム)**を使います。
USBケーブルから最初のプログラムを書き込み、その後はWi-Fi経由でLチカプログラムを書き換えてみたいと思います。
「本当に無線でプログラムを書き込めるのか?」
というところを、実際に試して確認してみます。
今回行うこと
今回の実験では、次のような流れでOTA書き込みを行います。
- ESP32-C3-WROOM-02-N4にOTA対応プログラムを書き込む
- ESP32-C3をWi-Fiに接続する
- Arduino IDEからOTA書き込み先を確認する
- LチカプログラムをOTAで書き込む
- LEDが点滅することを確認する
- USBケーブルを使わずにプログラムを書き換えられることを確認する
前回の記事ですでにOTA対応プログラムを書き込んでいる場合は、今回はその続きから始めることができます。
使用するもの
今回使用するものは、それほど多くありません。
- ESP32-C3-WROOM-02-N4
- LED
- 抵抗
- USBケーブル
- Arduino IDE
- Wi-Fi環境
ESP32-C3-WROOM-02-N4に搭載されているLEDを利用できる場合は、外付けLEDを用意しなくても構いません。
ただし、使用している基板によって内蔵LEDのGPIO番号が異なる場合があります。
そのため、今回は分かりやすくするために、使用する基板に合わせてLEDのGPIO番号を設定します。
前回の記事でOTAの準備
前回の記事では、ESP32-C3-WROOM-02-N4をWi-Fiに接続し、ArduinoOTAを利用してOTA書き込みを受け付けるプログラムを作成しました。
基本的な部分は次のようになっています。
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* ssid = "YOUR_WIFI_SSID"; // Wi-FiのSSID
const char* password = "YOUR_WIFI_PASSWORD"; // Wi-Fiのパスワード
void setup() {
Serial.begin(115200);
// 1. Wi-Fiへの接続
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// 2. OTAの設定と開始
ArduinoOTA.setHostname("esp32c3-device"); // ネットワーク上の識別名(任意)
// ArduinoOTA.setPassword("admin"); // 必要に応じて書き込みパスワードを設定可能
ArduinoOTA.onStart([]() {
Serial.println("OTA Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nOTA End");
});
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);
});
ArduinoOTA.begin();
}
void loop() {
// 3. 常にOTAの要求を監視する(必須)
ArduinoOTA.handle();
// ここに通常の処理(センサ読み取りやLチカなど)を書く
// ※ delay() で長時間処理を止めないよう注意
}このプログラムを最初にUSB経由でESP32-C3へ書き込んでおきます。
ここがOTAを利用するうえで重要なポイントです。
最初の1回はUSBなどを使って、OTAに対応したプログラムを書き込む必要があります。
一度OTA対応プログラムが動き始めれば、その後はWi-Fi経由でプログラムを書き換えられるようになります。
OTA書き込みで重要なArduinoOTA.handle()
今回のプログラムで特に重要なのが、
ArduinoOTA.handle();です。
これはloop()の中で繰り返し実行します。
void loop() {
ArduinoOTA.handle();
}ESP32-C3は、この処理を繰り返し実行することでOTAからの書き込み要求を確認します。
そのため、通常のプログラムを追加するときも、
void loop() {
ArduinoOTA.handle(); // センサーなどの通常処理
}というように、OTAの処理を残しておく必要があります。
長時間処理を止めてしまうようなプログラムでは、OTA書き込みを受け付けにくくなることがあります。
まずはWi-Fiに接続できているか確認
OTA対応プログラムを書き込んだら、シリアルモニターを開いて確認します。
Wi-Fiに接続すると、次のようにIPアドレスが表示されます。
Wi-Fi Connected!<br>
IP Address: 192.168.1.XXこのIPアドレスが表示されていれば、ESP32-C3がWi-Fiに接続できています。
今回のOTA書き込みでは、このWi-Fi接続が非常に重要です。
パソコンとESP32-C3が同じネットワークに接続されていることも確認しておきます。
Arduino IDEからOTA書き込み先を確認する
ESP32-C3がWi-Fiに接続され、ArduinoOTAが動作すると、Arduino IDEからOTAの書き込み先を選択できるようになります。
Arduino IDEの
ツール → ポート
を確認します。
USB接続時とは別に、
esp32c3-deviceのようなネットワーク上の書き込み先が表示されます。
これは、プログラムの中で設定した、
ArduinoOTA.setHostname("esp32c3-device");によるものです。
この名前を設定しておくことで、IPアドレスを直接入力しなくても、Arduino IDEからESP32-C3を見つけやすくなります。

Lチカプログラムを用意する
OTAで書き込むプログラムは、今回はシンプルなLチカにします。
ノンブロッキング処理です。
例えば、LEDをGPIO4に接続している場合は、次のようにします。
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const int LED_PIN = 4;
unsigned long previousMillis = 0;
const unsigned long interval = 500;
bool ledState = false;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
// Wi-Fi接続
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// OTA設定
ArduinoOTA.setHostname("esp32c3-device");
ArduinoOTA.onStart([]() {
Serial.println("OTA Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nOTA End");
});
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);
});
ArduinoOTA.begin();
Serial.println("OTA Ready");
}
void loop() {
// OTAを常に監視
ArduinoOTA.handle();
// ノンブロッキングでLチカ
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}Arduino IDEからOTAで書き込む
ここからが今回のメインです。
まず、ESP32-C3をWi-Fiに接続した状態にしておきます。
次にArduino IDEで、先ほど作成したLチカプログラムを開きます。
そして、
ツール → ポート
から、ネットワーク経由で表示されているESP32-C3を選択します。
その状態で「書き込み」を実行します。
すると、USBケーブル経由ではなく、Wi-Fiを利用してプログラムの書き込みが始まります。
書き込みが正常に終了すれば、ESP32-C3が自動的に再起動し、新しいLチカプログラムが実行されます。
Lチカが始まればOTA書き込み成功
書き込みが終了してESP32-C3が再起動したら、LEDを確認します。
LEDが、
点灯 ↓ 消灯 ↓ 点灯 ↓ 消灯
と繰り返していれば、Lチカプログラムが正常に書き込まれています。
ここで重要なのは、このプログラムをUSB経由ではなくWi-Fi経由で書き込んだということです。
これでESP32-C3-WROOM-02-N4のOTA書き込みを実際に確認することができました。
USBケーブルを外しても使えるのがOTAの便利なところ
OTA書き込みの便利なところは、ESP32-C3をパソコンの近くに置いておく必要がなくなることです。
通常のUSB書き込みでは、
パソコン │ USBケーブル │ ESP32-C3
という接続が必要です。
一方、OTAでは、
パソコン │ Wi-Fi │ ESP32-C3
という形でプログラムを書き込むことができます。
例えば、ESP32-C3をセンサーなどと一緒にケースへ入れてしまった場合でも、Wi-Fiに接続できる状態なら、USB端子へアクセスしなくてもプログラムを更新できます。
これはESP32をIoT機器として使う場合に、とても便利な機能だと思います。
OTAを利用するときの注意点
便利なOTAですが、いくつか注意する点があります。
ESP32-C3とパソコンを同じネットワークにする
基本的には、パソコンとESP32-C3が同じWi-Fiネットワークから通信できる状態にしておく必要があります。
ArduinoOTA.handle()を残す
OTA対応プログラムでは、
ArduinoOTA.handle();
をloop()内で繰り返し実行する必要があります。
OTA対応部分を削除してしまうと、次回からOTA書き込みができなくなります。
最初の書き込みはUSBが必要
ESP32-C3がまだOTA対応プログラムを実行していない状態では、いきなりOTA書き込みをすることはできません。
最初のプログラムはUSBなどを利用して書き込みます。
その後、OTA対応プログラムが動作することで、Wi-Fi経由の書き込みが可能になります。
Wi-Fiが切れるとOTAできない
当然ですが、ESP32-C3がWi-Fiに接続できていない場合はOTA書き込みを利用できません。
そのため、OTAを利用する機器では、Wi-Fi接続が正常に行われているか確認する処理を入れておくと安心です。
実際に書き込んでみて解った注意点
OTAプログラム単体であれば問題なく書き込めるのですが、loop() 内にLチカなどの処理を含めたプログラムを書き込むと、次回以降の書き換えに非常に時間がかかるようになります。
これは、loop() 内の処理(遅延など)によってOTAの受信処理が阻害・遅延されることが原因だと考えられます。完成版プログラムの書き込みであれば問題ありませんが、頻繁に修正して再書き込みを行う開発段階においては、OTAの待機時間が長く作業効率が落ちてしまいます。
なお、ソースコード上ではパスワード設定を不要(無効)にしていても、実際の書き込み時にIDやパスワードの入力を求められるケースがあるようです。
もしそのような認証画面が表示された場合は、adminと入力してみてください。
今回のまとめ
今回はESP32-C3-WROOM-02-N4を使って、ArduinoOTAによるOTA書き込みを実際に試してみました。
前回の記事ではOTAを利用するための準備を行いましたが、今回はそのOTA機能を使って、Lチカプログラムを無線で書き込みました。
最初のプログラムはUSB経由で書き込む必要がありますが、OTA対応プログラムが一度動作すれば、その後はWi-Fi経由でプログラムを更新できます。
実際にLチカプログラムを書き込んでLEDが点滅したことで、ESP32-C3-WROOM-02-N4のOTA書き込みが正常に動作していることを確認できました。
今回のLチカは非常に簡単なプログラムですが、OTAの仕組みを確認するにはちょうどよい題材だと思います。
今後は、Lチカだけではなく、センサーの値を読み取るプログラムやOLED表示など、実際に使うプログラムをOTAで更新できるようにしていきたいと思います。
ESP32-C3-WROOM-02-N4を使ったIoT機器を作る場合には、OTAはかなり便利な機能になりそうです。ただし OTAプログラム単体であれば問題なく書き込めるのですが、loop() 内にLチカなどの処理を含めたプログラムを書き込むと、次回以降の書き換えに非常に時間がかかるようになります。



