ArduinoOTAでプログラムの無線書き込み(ESP8266)

No Image

ESP8266はプログラムの無線書き込みができる機能(OTA:On The Air)があるらしいというのを最近知ったので実際にやってみました。
一度書き込み用のプログラムを入れると次からは端子の接続不要で書き込めるのが魅力的です。
「ArduinoOTA」は標準で入っているライブラリで、サンプルプログラムを真似すれば簡単に導入できます。

スポンサーリンク

準備

最低限必要なものは以下のものです。

  • ESP8266(ESP-WROOM-02)
  • Arduino IDE(1.8.5で動作確認済)
  • Python 2.7

ここからは「ESP8266」は持ってて「Arduino IDE」はインストール済みという前提で話を進めます。
「Python 2.7」のインストーラは下記URLでダウンロードできます。

無線で書き込むためのプログラム

先程言ったように標準でサンプルプログラムがありますので、ありがたく使わせてもらいます。
上部メニューの[ファイル]→[スケッチ例]→[ArduinoOTA]→[BasicOTA]を使います。
BasicOTAのプログラム

このプログラムのsetup関数とloop関数をそのまま使いたいプログラムに結合するだけでOKです。
そして、このプログラムを「ESP8266」に書き込むと無線で書き込むことができるようになります。(この時点では有線です)

WiFiManagerと一緒に使う

個人的にですがWiFiManagerと一緒に使いたいので先のプログラムを少し変更してこうなります。

#include 
#include 
#include 
#include 
#include 
#include 

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  
  WiFiManager wifiManager;
  wifiManager.autoConnect("LCD_Clock_Server");
  
  Serial.println("connected...yeey :)");

  // 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());
}

void loop() {
  ArduinoOTA.handle();
}

無線でプログラムを書き込む

OTAのプログラムを書き込めたら、シリアルポートの欄に[ネットワークポート]というのが出現しているはずです。

Pythonが入っていないと出現しません。

複数あれば書き込む対称のIPアドレスを確認しておく必要があります。
出現すれば、このネットワークポートを選択し、プログラムを書き込みます。
今までUSB-シリアル変換器を接続したり面倒だったのが嘘のように遠隔でプログラムの書き込みができました。
これ以降はOTAのプログラムがある限り無線で書き込むことができるようになっています。


今までケースをあけて、USBシリアル変換器を挿して、書き込んでいたのが面倒になりませんか。
といってもネットワーク環境がある場所に限りますけどね。

ArduinoOTAでプログラムの無線書き込み(ESP8266)

スポンサーリンク

Leave a Comment

  • 2020/01/06

    こんにちは、ページ拝見しています。

    手元のボードでは
    どこに問題が有るのか、OTAネットワークポートが
    出ません。

    ボードは、UNO+WiFi R3 と言う
    UNO、esp8266ハイブリット型のボードです
    たぶん FakesBoardです。
    販売元(Banggood)ではテクニカルの問い合わせは不可。
    (販売のみです)
    スケッチ例の、
    [ESP8266WiFi]-[WiFiClient]や[ESP8266WiFi]-[WiFiAccessPoint]
    [Blink]は、いずれも動作確認出来ています。
    ArduinoOTAのスケッチを書き込み、
    実行で
    「シリアルモニタにボードのIPアドレスは出ます。
    しかし、ここまでで・・・
    IDEを再起動しても電源のオンオフしても「シリアルポート」に
    【ネットワークポート】の表示が追加されません。
    スケッチ書込前に、IDE-[ツール]でWebの記事を参考に
    設定項目の内容を変えて観たりしましたがダメです。
    なお、
    Pythonは、2.7.16版をインストールし
    Pathは通っていると思います。

    この、【ネットワークポート】が出ない件は、
    レアケースなのか?ネットに情報は見つけられません。
    このボード自体、レアものです:)
    原因は、手元のボードに原因があるのかも知れません。
    UNO、ESP8266とも、Lチカを試すと単独は機能していると
    思われます。それぞれは、ボード上にある7chのDipSWの組合わせに
    依り、切り替えて使います。
    アドバイス、ございましたら宜しくお願い致します。

    Reply
    • 2020/01/07

      とんかつ様

      [ネットワークポート]が出ないとなるとやはりPythonのPATHが通ってないというのが一番に考えられます。
      コマンドプロンプトで"python"と入力することで確認できますので再度お願いします。

      ボード自体はESP8266単体でもArduinioOTAができることを確認していますので、問題ないと思います。

      あと考えられるのは、PCとESP8266が同じネットワーク内にあるかどうかです。
      PCからESP8266のIPアドレスに対してpingが通るか試してみてください。
      コマンドプロンプトで"ping IP_ADDRESS"と打つことで確認できます。
      IP_ADDRESS の部分はESP8266のIPアドレス(例:192.168.1.1)を入力してください。
      以上、ご確認お願いいたします。

      Reply
  • 2020/01/08

    PythonのPATH について

    コマンドプロンプトに python と入力すると 画面は

    Python 2.7.12 ~~~~.
    >>>

    と変わります。

    PCのシステムのプロパティの[環境変数]の[システム環境変数]の
    「変数」の項「 Path」に
    「値」 C:\Python27~~~~~

    と有ります。

    pingについて

    応答:宛先ホストに到達出来ません。

    で ping は返って来ません。 

    これは、問題です。だから【ネットワークポート】が出ないのでしょう。

    訳が、解らなくなってきましたが・・・

    [スケッチ例]-[ESP8266WiFi]-[WiFiClient]を実行すると

    djxmmx.net:17 に接続しリモートサーバーから
    George Brenard Shawの「言葉」を受信し
    一旦、切断し、五分後に再接続。受信。繰り返す。

    このスケッチを実行すると
    IDEのシリアルモニタに、確かに
    「言葉」が 5分置きに表示されました。
    しかし、
    たった今、実験したところ、相手のdjxmmx.net:17が
    閉じているのか、応答はありませんでした。

    稼働中のIDEが入っているPCとesp8266が
    【同じネットワーク内にある】
    これがそうで無ければ、相手のサーバーが送ってく
    データを受信してシリアルモニタに表示出来ないのでは
    ないでしょうか?

    たまたま、
    【ネットワークポート】が出ないのではなく、何度
    トライしても出ないです。

    なんだか・・・頭が 混線してきました(笑)

    ありがとうございます。

    Reply
  • 2020/01/08

    Windwsセキュリティの
    [ファイアウォールとネットワーク保護]において
    一時的に
    [プライベートネットワーク]で、「保護」
    を切って

    pingを打ってみたが・・

    応答:宛先ホストに到達出来ません。

    と同じ結果でした。

    PCとesp8266のアドレスは、アドレス的には
    同じネットワーク内のアドレスです。
    (両者は「,」で区切るアドレスの頭の3つが同じ数値、並びです。)

    Reply
    • 2020/01/08

      とんかつ様

      pythonのPATHは通っているようです。
      こちらは問題ありません。

      pingが通らないということはPCとESP8266がお互いに通信できない状況にあります。
      ローカルIPアドレスが似通っていても通信できない環境は存在しますので、
      ネットワーク環境の確認を今一度お願いいたします。

      Reply
  • 2020/01/08

    ありがとうございました。

    もう少し、調べて見ます。

    比較対照に、「素」のボードを用意した方が、簡単かもです。w

    おつき合い感謝します。

    Reply