ESP-WROOM-32 ( ESP32 ) で Wi-Fi スマホ LED スイッチ作り

wroom32_00 ESP32 ( ESP-WROOM-32 )

6.Arduino IDE に ESP32 ボードをインストール

ESP-WROOM-32 ( ESP32 )を Arduino IDE で開発するために、Arduino core for the ESP32 をインストールする必要があります。
Arduino IDE は現在 1.8.1 で動作確認しております。
この方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

7.動作確認

まず、テスターで導通やショートが無いか事前確認してください。
特に、電源ラインがグランドとショートしてないか、また、誤って5Vを3.3V入力に接続してないかなどを入念にチェックしてください。

それが確認できたら、パソコンのUSB 3.0ポートに接続してみてください。
以前、以下の記事で紹介したUSBテスターを使うと、5Vラインのおおよその電流の目安が分かって便利です。

https://www.mgo-tec.com/blog-entry-usb-safety-tester-checker01.html

このテスターを使ってUSBポートに挿した瞬間の電流がいきなり常時1Aを超えていたり、またはゼロ値だったりしたら接続が誤っている可能性があります。

また、Windows10の場合、USBポートに挿すとドライバが自動インストールされますので、しばらく待ちます。
終ったら、Arduino IDE を起動します。

次にArduino IDE のシリアルモニターを115200bps で起動してください。
ENピンと接続したスイッチがリセットスイッチとなりますので、それを押してすぐ離してください。

すると、シリアルモニターには以下のように表示されると思います。

ESP-WROOM-02 のように、最初の文字化けが無いのが良いですね。
そして、このメッセージの最後はこんな感じになります。

ここまで表示されれば起動成功です。
上記にあるように、ここで表示されるMACアドレスは softAPモードのアドレスです。
つまり、ESP-WROOM-32自身をアクセスポイントとして機能させる場合のモードアドレスです。
ということは、初期状態ではsoftAPモードで起動されているということです。
これでは、自分のルーターでMACアドレスフィルタリングをかけている場合は通過しません。
では、Stationモードの場合の MACアドレスはどこで調べれば良いのでしょうか?

私の場合はスマホアプリの以下のような Net Analyzer というもの使って調べています。

Network Analyzer
Network Analyzer
開発者: Jiri Techet
金額: 無料

これの使い方はいつか別記事に上げたいと思っています。

MACアドレスをArduino IDEで調べる方法が分かりました。
以下の記事を参照してください。
ESP-WROOM-32 ( ESP32 ) チップ・メモリ・MACアドレス情報取得方法

では、先に進みまして、この起動モードはフラッシュブートモードです。
つまり、プログラムの書き込みはできません。

書込みする場合は、GPIO #2 と接続したスイッチを押しながらリセットを押します。

【手順】
① GPIO #2 スイッチ 押したままにする
② リセットスイッチ(EN SW)を押す
③ リセットスイッチ(EN SW)を離す
④ GPIO #2 スイッチ を離す

すると、シリアルモニターに下図のように表示されます。

こうなれば、Arduino IDEからコンパイルして流し込める状態になります。
この状態の時には電流はあまり流れていません。
USBからは10A程度でした。

8.Lチカスケッチを書き込む

まずは以下のようなLチカスケッチをArduino IDE に書き込んでください。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println("TEST");
  
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(250);
  digitalWrite(13, LOW);
  delay(250);
}

次に、上記のようにフラッシュダウンロードモードにして、コンパイル書き込みしてください。
以下のように表示されてしまったら、フラッシュブートモードになっていますので、もう一度ダウンロードモードにしてください。

正常にコンパイルされるとこうなります。

そうしたら、リセットボタンを押してください。
すると、LEDが点滅すれば成功です。
この場合、USBには平均50mA程度の電流が流れているようです。

9.スマホ Wi-Fi LED スイッチを作ってみる

では、ご自分のルーター(アクセスポイント)と2.4GHz帯Wi-Fi接続して、スマートフォンからLEDのオンオフをしてみたいと思います。

ESP32のサンプルスケッチ、SimpleWiFiServer を私なりに少し改良してみました。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

#include <WiFi.h>

const char* ssid = "xxxx"; //ご自分のルーターのSSIDに書き換えてください。
const char* password = "xxxx"; //ご自分のルーターのパスワードに書き換えてください。

WiFiServer server(80);

void setup()
{
    delay(1000);
    Serial.begin(115200);
    pinMode(13, OUTPUT);      // set the LED pin mode

    delay(10);

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
    server.begin();

}

void loop(){
 WiFiClient client = server.available();

  if (client) {
    Serial.println("new client");
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            client.println("<!DOCTYPE html>");
            client.println("<html>");
            client.println("<head>");
            client.println("<meta name='viewport' content='initial-scale=1.5'>");
            client.println("</head>");
            client.println("<body>");
            client.println("<form method='get'>");
            client.println("<font size='4'>ESP-WROOM-32<br>");
            client.println("Wi-Fi  LED  Switch</font><br>");
            client.println("<br>");
            client.println("<input type='submit' name=0 value='ON' style='background-color:#88ff88; color:red;'>");
            client.println("<input type='submit' name=1 value='OFF' style='background-color:black; color:white;'>");
            client.println("</form>");
            client.println("</body>");
            client.println("</html>");

            client.println();
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }

        if (currentLine.endsWith("GET /?0=ON")) {
          digitalWrite(13, HIGH);
        }
        if (currentLine.endsWith("GET /?1=OFF")) {
          digitalWrite(13, LOW);
        }
      }
    }
    
    client.stop();
    Serial.println("client disonnected");
  }
}

入力が済んだらまずコンパイルする前にご自分のルーター(アクセスポイント)を事前に起動して、通信可能な状態にしておいてください。

それから上記で述べたようにダウンロードモードにして、コンパイル書き込みしてください。

書込み完了したら、リセットボタンを押してください。

すると、シリアルモニターにはこう表示されます。

では、スマホとルーターをWi-Fi接続して、シリアルモニターに表示されているIPアドレスをスマホのブラウザのURL入力欄に入力してください。

動作状況は以下の動画のようになります。

00:58 くらいのところのUSBテスターの電流値も注意して見て下さい。

いかがでしょうか。
結構リアルタイムで追従してくれています。

使っているスマホは

SONY Xperia X Performance SO-04H
Android 7.0
Google Chrome

USBテスターの電流値を見ていただけると分かると思うのですが、ダウンロードモード中は20mAほどの電流しかながれていませんが、フラッシュモードにすると常時160mAになります。
Lチカのスケッチでは50mAでしたので、Wi-Fi通信になると途端に多量の電力を消費します。
(これは3.3Vラインではなく、USB電源の電流ですので勘違いしないようにしてください)
00:58 のところでは、USB電流が 480mA 流れたようです。
このUSBテスターは1秒毎しか更新しないので、瞬間電流は分かりません。
瞬間電流はもっと多く流れている可能性があります。

10.電流値について

この記事以降、ESP32 ( ESP-WROOM-32 )の電流値をいろいろと測定してみました。
Arduino IDE で開発して、CPU 240MHz の場合の最大瞬間電流値が大体つかめました。
そして、電源強化対策も私的にほぼ解決しました。
いかの記事を参照してみてください。

ESP-WROOM-32 の電流値を測定してみました。以下の記事をご覧ください
●ESP-WROOM-32 ( ESP32 )の消費電流を電流プローブ無しで測定してみました
●ESP-WROOM-32 (ESP32) の 電流 測定 その2
●ESP-WROOM-32 ( ESP32 ) のUSB電源突入電流(インラッシュカレント)を考える
●ESP-WROOM-32 ( ESP32 ) の保護機能付き電源強化対策の実験

11.まとめ

ESP-WROOM-32はいかがでしたでしょうか。

1.27mm ピッチのハンダ付けはかなり難しいですが、ピンソケットを直付けすることによって、思っていたよりもトラブルが少なく動かすことができました。
しかし、電源のLDOやUSBポート、USBシリアルの定格電流については十分気を付けて回路を組まなければいけないですね。
ここで紹介した ADP3338 はとても素晴らしいデバイスですね。
これも ねむいさんが紹介して下さったおかげです。
ありがとうございました。
m(_ _)m

では、今回はここまでです。
ESP-WROOM-32 というデバイスが発売されてしまったせいで、いろいろな件が後回しになってしまいました。
お待ちの方はスミマセン・・・
m(_ _)m

最新記事では、ESP32-DevKitC ( ESP-WROOM-32 開発ボード )とスマホで Wi-Fi リアルタイム双方向通信をやったりしています。
LEDを調光コントロールして、CdS光センサー値をスマホにリアルタイム表示させています。
以下の記事も合わせてご覧ください。


ESP32 -DevKitC ( ESP-WROOM-32 )でスマホとWi-Fi リアルタイム双方向同時通信

 

コメント

  1. 匿名 より:

    ソースファイルを使わせていただきました
    ありがとうございます(゚∀゚)

    https://twitter.com/coppercele/status/842932804115554305

    • mgo-tec mgo-tec より:

      どうぞどうぞ!
      ご自由に使ってくださいませ。

      • 匿名 より:

        お世話になります
        あれから色々魔改造したらこんなふうになりましたw

        HTTPのGETのパラメータで通信するのは効率悪いんでどうにかしたいですね(´・ω・`)

        https://twitter.com/coppercele/status/844599677869682688

        • mgo-tec mgo-tec より:

          スバラシイ!!
          これはUDP通信ですか?
          スライダーの縦表示もできるんですね。

          client.write でjavascript を吐き出していると辛いと思いますので、私の場合はSDカードから吐き出したりしています。
          いずれ、SPIFFSもArduino IDE で出来るようになると思うので、そうするとSDカード要らずになるかも知れません。

  2. 匿名 より:

    大変参考になる記事をありがとうございます。
    初心者なのでなにか勘違いしているかもしれませんが、ESP32のデータシートを見ると、GPIO2はデフォルトで内部的にプルダウンされているようです。(https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdfのp.11)
    そのため、改めてGNDラインに接続しなくてもよいのではないかと思うのですが、いかがでしょうか。

    • mgo-tec mgo-tec より:

      匿名さん

      記事をご覧いただき有難うございます。

      私も基本的に素人です。

      この記事を作った当初はあまりよく分かっておらず、とりあえず作成した記事でした。
      改めて見直すと、確かにプルダウンされていますね。
      抵抗を接続しなくても良いと思われます。

      今、私はこの記事の様な不安定なESP32環境を使っておらず、もっぱら ESPr Developer 32 や ESP32-DevKitC、M5Stack を使用しています。
      電源周りの安定性が難しく、結局のところ開発ボードを使った方が良いという結論に達しています。

      ご指摘ありがとうございました。
      記事にはコメントを追記しておきます。

タイトルとURLをコピーしました