3人と1匹の日常とモノづくりブログ

興味のあるものをとりあえず動かしてみた、実装してみたシリーズをガンガン上げていきたいと思います。あくまでも自身の備忘録としてですが、誰かの助けになったらうれしいです。

【Wifi, Bluetooth搭載マイコン】EPS32 の Wifi 機能を使って無線書き込み ~ OTA実装 ~

f:id:bamboomush:20210105171734p:plain

 この記事ではWifi, Bluetooth搭載で話題のマイコン、ESP32のWifi機能を用いてプログラムの無線書き込みを実装したので、やり方の説明とサンプルプログラムを紹介します。

この記事を読むことで、サムネイル画像のようにPCとESP32を繋がず、モバイルバッテリー等で電源を給電しつつ、プログラムの書き込みができるようになります。その結果、都度PCと接続する手間が省けるほか、同じネットワーク環境下であれば離れた場所にESP32やESP32を搭載したモジュールを配置したまま、プログラムの書き換えが可能になり、開発の自由度が高くなること間違いなしです。

 

◆ESP32関係の実装記事◆ 
  • DCモータ実装

www.takeshi-1222.com

  • サーボモータ実装

www.takeshi-1222.com

  • Webサーバー実装

www.takeshi-1222.com

  • OLED実装

www.takeshi-1222.com

  • 超音波センサ

www.takeshi-1222.com

  • LCDディスプレイ

www.takeshi-1222.com

  • 温湿度センサ (安価)

www.takeshi-1222.com

  • 温湿度センサ (ハイスペック)

www.takeshi-1222.com

  • 温湿度センサ (複数)

www.takeshi-1222.com

  • CO2センサ

www.takeshi-1222.com

 

ESP32の簡単な説明

 ESP32とはどんなものなのかよくわかっていない方もいらっしゃると思いますので、簡単に説明します。

ESP32の大きな特徴はWifi, Bluetoothを搭載しているところです。そのうえで純正のArduinoよりも安価に購入でき、ArduinoコードやC++などいくつかの言語の互換性があります。そのため、1つのマイコンでいろいろなことを試したい方には大変おすすめなマイコンです。

実験構成

 今回の実験に使用する部品は以下のものです。
  • ESP32
  • モバイルバッテリー
  • マイクロUSBケーブル

ESP32は上記のものを使用します。

モバイルバッテリー、マイクロUSBケーブルに関してはなんでも問題ありませんが、参考に安いものを紹介しておきます。

 

モバイルバッテリー

マイクロUSBケーブル

 

モバイルバッテリーは電池の残量が確認できるものがおすすめです。また、マイクロUSBケーブルはたまに充電はできてもデータ通信ができず、ESP32にプログラムをそもそも書き込めないものが売っていますので、注意してください。

実験

Arduino IDEでESP32を使うためのセットアップ

Arduino IDEでESP32を使用する場合、以下の手順でボードのボードマネージャーにインストールしなければいけません。

  • Arduino IDEを立ち上げて、メニューから「ファイル」→「環境設定」を開き、「追加のボードマネージャのURL」にhttps://dl.espressif.com/dl/package_esp32_index.jsonと入力し「OK」をクリックします。

  • 「ツール」→「ボード」→「ボードマネージャ」を開きます。「esp32」と入力し、「esp32 by Espressif Systems」をインストールします。

  • 「ツール」→「ボード」で、「ESP32 Dev Module」を選択します。

ESP32自動書き込みの準備

私が購入したESP32は、プログラムを書き込む時にENスイッチやbootスイッチを操作しなければ、書き込みができない仕様になっていました。 (ものによっては無痛に書き込めますので要確認)

そのため、自動書き込みをするために、ENとGNDの間に0.22uF~2.2uFのコンデンサを追加する必要がありました。

私の場合、1.0uFの抵抗をはんだ付けしました。 (少々強引ですが無事動作しています。)

f:id:bamboomush:20210103222603j:plain

実行コード

それでは早速、ESP32をPCに接続し、以下のコードを書き込んでください。

この時、"ssid"と"password"の中身を自身が使用するWifiのものに書き換えてください。(自宅のWifiを使用する場合、モデムの裏とかに書いてあると思います。)

 

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

const char* ssid = "ssid";    //Wi-Fiのアクセスポイント名に書き換えてください
const char* password = "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());

}

void loop() {
  ArduinoOTA.handle();
  // Serial.println("Hello");
}

上記の書き込みが正常に完了すると、以下の画像のように「ツール」→「シリアルポート」に「ネットワークポート」→「esp32 ~」というポートができているはずです。

f:id:bamboomush:20210105171852p:plain

これが出ていたら、「esp32 ~」を選択して、再度同様のソースコードを書き込んでみてください。(ネットワークポート選択後は、別のソースコードでも可能ですが、ArduinoOTAを実行するコマンドが含まれているソースコード出ないとポートが外れてしまうので注意してください)

 

 また、「ネットワークポート」が出ていない場合は、「ツール」のウィンドウを一度閉じて再度開くと出ているかと思います。

 

OTA (無線書き込み)ができたら以下のように出力が出てきますので、これができていたら、PCから外し、モバイルバッテリーに繋げてみてください。

f:id:bamboomush:20210105171856p:plain

 少し待つと「ネットワークポート」が出ているはずなので、これでOTAが実装できたことになります。

 

まとめ

今回は、ESP32のWifi機能を使ってOTA (無線プログラム書き込み)を実装しました。またその際のサンプルプログラムを紹介しました。

参考資料

ESP32 Arduino IDEのセットアップからLチカまで - JH7UBCブログ

esp32_tips – スイッチサイエンス

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