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 <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <ArduinoOTA.h>

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
  • 2020/06/06

    たまさ様

    お世話になります。(本スレッドに再投稿します。)

    最近Arduinoの電子工作を始めた"超"初心者です。
    Arduino、UNO、NANOをPCに””USB接続”して書き込みしていますが、これをESP8266で行いたいと思い、ESP8266はすでに購入済みです。
    そしてインストール方法を調べているのですが、えらく難しく英語サイトでは全くわからなかったので、日本語サイトを探したところ御HPにたどり着いた次第です。

    さて、この記事を読ませていただいて不明な点がありましたので、ご教示いただければ幸いです。

    1.本記事で”ここからは「ESP8266」は持ってて「Arduino IDE」はインストール済みという前提で話を進めます。”とありますが、”持っているだけで無く”前記事の"ESP8266モジュールでArduinoからWi-Fiを使う"でのセットアップは必要ですよね?

    2.1はもちろん必要かと思いますが、本記事で”[ArduinoOTA]→[BasicOTA]”をESP8266に書き込む際1でアップロードしたプログラムは消えないのでしょうか?

    3.1の質問で事前セットアップが不要な場合、ESP8266に書き込んだ[ArduinoOTA]→[BasicOTA]内にはWIFIネットワーク名とパスワードを記入する箇所が無いのですが、どうなっているのでしょうか?

    4.ARDUINOとESP8266を接続する方法を調べていると各種の方法があり、抵抗を使ったりする場合もある様ですが、前記事の"ESP8266モジュールでArduinoからWi-Fiを使う"での方法がベストでしょうか?

    5.ESP8266を単体で使用する場合ですが、実際の使用方法のイメージがつかめません。WIFIシールド以外の具体的な使用方法があればお教えいただければ幸いです。

    不明な点をクリアにしてからセットアップを開始したいと思いますので、よろしお願いいたします。

    Reply
    • 2020/06/08

      RYU様

      コメント頂きありがとうございます。
      不明な点に可能な限りお答えいたします。

      1.別記事のセットアップは不要です。
      別記事はATコマンドよりWi-Fi接続する方法ですので、別物とお考えください。
      ただし、ESP8266にプログラムを書き込めるような環境を構築する必要があります。
      モジュールだと問題ありませんが、単体利用では別途USBシリアル変換ICなどが必要です。

      2. , 3. BasicOTAのプログラムは完全にそれ専用のプログラムです。
      書き込むとそれ以前に書き込んだプログラムは消えてしまいます。
      Wi-Fiや他の処理プログラムは含まれていませんので、いろんな処理をしたい場合はこれをベースにでもいいので追記していく必要があります。

      4. ArduinoボードとESP8266を接続するには、その記事で問題ありません。
      ただし、ATコマンドで運用しますのでESP8266側では複雑な処理はできなくなります。
      ArduinoボードとはUARTで接続することになります。

      5. ESP8266にArduinoのプログラムを書き込むことができます。
      つまりESP8266をArduinoとして運用できます。
      別途 Arduino Uno などのボードは不要でArduinoを構築できます。
      スイッチサイエンスの ESPr Developer などが、ESP8266をArduinoそのものとして使えるようになっています。
      https://www.switch-science.com/catalog/2500/

      以上、参考になりましたら幸いです。

      Reply
  • 2020/06/09

    たまさ様

    ご回答ありがとうございます。

    やはり”ESP8266モジュールでArduinoからWi-Fiを使う”関連かと思いましたので、そちらに再度質問させていただきましたので、またよろしくお願いします。

    Reply