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

ESP32 ( ESP-WROOM-32 )

接続する

では、以下の図のように接続してみてください。

最新記事では、micro SDHC カードを使う場合の注意点についてアップしてますので、以下の記事も参照してください。
ESP32 ( ESP-WROOM-32 ) で micro SDHC メモリカードを使う場合の注意点

ここで、重要なのは、micro SD カードホルダの DO端子( miso ) は必ず3.3Vプルアップしておくことです。
これは、最近知ったのですが、このプルアップをやらないと、UHSスピードクラスのmicroSDHCカードを読み込むことができませんでした。
miso ( Master In Slave Out )端子はプルアップしなければならないことは今まで知りませんでした。
気を付けましょう。
この件については、DEKOさんの以下の記事でも書いてありました。

http://ht-deko.com/arduino/esp-wroom-32.html#13

DEKOさんのこのブログは ESP-WROOM-32 ( ESP32 )に関してテンコ盛りでとてもスバラシイです。
是非ご覧になってください。

また、LED は PWM制御で明るさを変えるので、その場合、LED から流れ込む電流によってGND電位が安定しなく、かなり揺れてしまうようです。
よって、micro SDカードスロットのGND とLEDのGND は必ず分けてください
共通にしてしまうと、micro SDカードの読み込み不良になる場合があります。

CdSセルは光の強さによって抵抗値が変わるので、100kΩの抵抗で3.3Vを分圧して、その電圧値を ESP32 のADコンバーター端子で読み取ります。
SVP端子(GPIO #36)がADC端子なので、それを使います。GPIO #36 です。

写真ではこんな感じになります。

CdSセルとLEDをズームした写真はこんな感じです。

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

Arduino IDE でESP32 を開発するために、Arduino core for the ESP32 をインストールします。
この方法は以下のページを参照してください。

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

自作ライブラリのインストール

では、私が自作した ESP32 用 Arduino IDE ライブラリをインストールします。
これは、ESP8266用に作ったSD_EasyWebSocketライブラリbeta ver 1.47 をESP32用に移植したものです。
ブラウザと ESP32 ( ESP-WROOM-32 )を WebSocket でリアルタイム双方向通信するものです。
micro SDHC カードからブラウザへHTMLファイルを出力します。
GitHubの以下のページにアップしています。

https://github.com/mgo-tec/ESP32_SD_EasyWebSocket

Arduino IDE へのライブラリインストール方法は以下の記事を参照してください。
ただ、ESP32 の場合、Arduino15フォルダは使わないので、その中のライブラリは削除しなくて結構です。

GitHubにある ZIP形式ライブラリ のインストール方法

ESP8266用ライブラリではArduino core for ESP8266標準のHash.hライブラリをインクルードしていましたが、ESP32 には存在していないので、先に述べたように Steve Reid さん作の sha1.h ライブラリを使用させていただきました。
これがあれば、ブラウザとWebSocket通信のハンドシェイクができます。
改めて、Steve Reid さん、ありがとうございました。

ESP32_SD_EasyWebSocket のライセンスは、Arduino core for ESP8266 内の一部のコードを改変したりしているので、LGPL 2.1 を引き継ぐ形になります。

あと、新しい関数を追加したり、不要な関数を削除したりしています。
移植しているときに感じたのは、マクロを使うと移植が難しいということを改めて感じました。
今後の為にもできるだけそういうものは使わないようにすべきと学習した次第です。

micro SDHCカードにデータファイルをコピーする

大手メーカー製のmicro SDHC カードならば、大体はFAT32でフォーマットされていると思います。
もし、されていなければ、下の記事を参照してください。

micro SD 、micro SDHC カードの初期化(フォーマット)方法

では、次に、データファイルをSDカード内にコピーしていきます。
Windows10 の場合、以下のパスにdataフォルダがあります。

C:\Users\ユーザー名\Documents\Arduino\libraries\ESP32_SD_EasyWebSocket\examples\Auto_Local_IP_sample\data

そこにある以下の3つのテキストファイルをコピーします。

dummy.txt
LIPhead1.txt
LIPhead2.txt

dummyファイルは空のファイルです。
LIPheadファイルはブラウザに送信するHTMLやJavaScript を分割したファイルです。
ESP32 側でテキストとマージ(合体)させて送信するものです。

次に、micro SDHC カードにはルートにEWSフォルダを作成しておきます。

そのフォルダの中に上記の3つのファイルをペーストします。

これでmicro SDHCカードの準備は完了です。
そうしたら、micro SDHCカードを安全に取り出し、SparkFunのカードスロットに挿入します。

コメント

  1. 太田 耕正 より:

    ブログ ソースコード 160行 graph_str += “■”; をコピーペーストして実行すると
    10011101
    Invalid UTF-8 in text frame—-Closing Message
    ——————Close Command Send

    ——————Client.STOP
    _close
    となります。
    ブログの実行画面では”*******”が表示されてますね。
    graph_str += “*”;で正常に動作出来ました。

    • mgo-tec mgo-tec より:

      太田さん

      ご指摘ありがとうございます。
      ■の方が見た目が良いかなと思って “*” から “■” に変えていました。
      やっぱりこういう全角記号は正常に動作しない端末があることをあまり考えてませんでした。
      早速修正させていただきました。
      ご報告、たいへん感謝感謝です。
      m(_ _)m

  2. puru より:

    お疲れ様です。
    先日はお問い合わせのメールを送ってしまい失礼いたしました。改めて質問させていただきます。
    この記事では光センサーで値の追従を行っていますが、ESP32内蔵もしくは外付けで取ったADCの値をSSE通信で受信端末側に表示させることは可能でしょうか?
    #includeを使用した場合にanalogRead()の命令が使えなくなるようなことを海外のQ&Aで見かけましたがmgo-tec様の意見をお聞きしたいです。

    • mgo-tec mgo-tec より:

      puruさん

      コメント欄にお越しいただき、ありがとうございます。
      ESP32を使ったServer-Sent Eventsサンプルスケッチは、ESP8266用の以下の記事の一番最後の方に追記しておきました。

      WROOM 単体に Arduino スケッチで Wi-Fi ストリーミング

      これは、ESP32のNTP時計値をスマホにリアルタイムで送り続けるものですが、時間の値をanalogRead値に替えれば行けると思います。
      そのページのコメント投稿欄も参照してみてください。
      他の方が既に試されていました。

      因みに、ESP32のADCは、0V~1Vだったと思いますので、それ以上の電圧は減圧しなければなりません。
      また、ADC入力専用GPIOピンを使う事です。
      includeしたら使えなくなるというのは、何をincludeしたらでしょうか?
      私には意味が良く分かりませんでした。

      以上、これで試してみて下さい。

  3. Michael Yanagiba より:

    ESP32の通信の記事を探していてたどり着きました。私は回路屋(だった)ので、LEDを全点灯しないというところが気になり回路図を拝見しました。試してはいないのですが、おそらくRTNラインの100kΩが原因です。抵抗値が大きすぎて、かつ、CRDで電圧制限がかかって、店頭に必要な最小電流が流せないと思われます。もし、一灯づつで光るなら、ダイオードK端ですべてをつなげてから抵抗一つにするのではなく、三つのダイオードK端から抵抗100kΩ(を三つにして)それぞれに接続し、抵抗のRTN側をGNDで一つにすれば光るはずです。実際のところ、100kΩで制限していますので、CRDは不要のはずです(LEDの電圧が0Vだったとしても、3.3/100kなのでuAオーダーです)。 CRDは定電流を作るために高い電圧をかけなければならず、電圧制限に使うにしても、LEDとCRDで分圧してしまうので、LEDの点灯条件の足かせになります。

    • mgo-tec mgo-tec より:

      Michael Yanagibaさん

      記事をご覧いただき、ありがとうございます。
      この記事を書いた当初はとりあえず光ればいいや的に作ったので、あまり深く考えていませんでした。
      というか、私はアマチュア素人なので、その勘所がパッと頭に浮かびませんでした。
      全点灯しないのを追求せずに次の工作へ進んでしまいました。

      この記事も随分前に書いていて、すっかり忘れていました。
      CdSセルが手元に1MΩしかなかったので、その分圧で100kΩにした記憶があります。

      私が書いた絵回路図も、今見ると混乱しますね。
      ちょっと疑問なのですが、LEDには
      GPIO(HIGH3.3V) → CRD → LED → GND
      という電流の流れなので、

      >ダイオードK端ですべてをつなげてから抵抗一つにするのではなく

      というところが良く解りません。
      抵抗1つにしてはおらず、そのままGNDにつながっていると思うのですが。。。
      100kΩで分圧しているのは、CdSセルだけだと思うのですが、私が何か勘違いしていますか???

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