平成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); //============================================= }
コメント