平成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);
//=============================================
}



コメント