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

ESP32 ( ESP-WROOM-32 )
コメント欄でご指摘いただき、サンプルスケッチの 160行目の "■" を "*" へ変更しました。
"■" が表示されない環境があるようなので、修正しました。
(2017/6/19)

こんばんは。

ESP-WROOM-32 電子工作は今まで単体でLDOモジュールを作って動作させていましたが、ESP32 -DevKitC ( ESP-WROOM-32 開発ボード )が秋月電子通商さんで発売されたので、私も早速試してみました。

私の場合は以前、WebSocket を使って、ESP-WROOM-02 ( ESP8266 ) とスマホでWi-Fi リアルタイム双方向通信をしていましたが、多量の文字列を扱うために SRAM の少なさがネックになっていて、フリーズ等に悩まされていました。
ESP32 を使うにあたって、ESP8266 よりも性能がどれくらい優っていて、エラーがどれだけ解消されるかが私にとって重要でした。

そこで、今回は ESP8266 用の自作ライブラリを ESP32 用に移植して、WebSocket 通信を試してみました。
移植するにあたって、Hashライブラリが ESP32 には無かったので、ライセンスが100% Public Domain の sha1.c ソースを使わせていただきました。
Steve Reid さん作です。
Steve Reidさん、ありがとうございます。
m(_ _)m

動作状況は、結論からいうと、Arduino IDE 開発の場合、CPU が80MHz までのため、処理が速くなったという印象はありません。
ただ、ユーザーSRAM領域が5倍大きくなったおかげで、WebSocket 通信がフリーズしても裏でプログラムが動作していて、ESP32 自力でタイムアウトしてWebSocket切断してくれます。
これはESP8266 ではできなかったので、自作ライブラリがSRAMメモリをメチャクチャ食っていたようですね。

そして、ESP-WROOM-32 ( ESP32 ) の ESP8266 より優れている点は、12bit ADコンバーターが3.3V対応になったことで、外付けADコンバーターを使わなくても、CdS ( 硫化カドミウム )セルを使った光センサー値を取得できるようになりました。
今回はそれを使って、スマホからWi-FiでLEDを調光コントロールして、光センサーの値をリアルタイムでスマホに表示させることに挑戦してみました。

リアルタイム双方向通信を売りにしている WebSocket でも、ゲームコントローラーのように怒涛のデータ送受信するとフリーズしますので、データ送信時間間隔をスマホ側で調整できるようにしました。

まずは以下の動画をご覧ください。

いかがでしょうか。

データ転送レートが低いと通信トラフィックが一杯になって、フリーズしていますね。
ブラウザ側と ESP32 側両方の転送レートを変えることによって、フリーズが殆ど無くなりました。
ただ、光センサーの追従は若干遅くなります。
でも、ここまで追従してくれれば十分ですよね。
これを使えば、遠くの場所でコントロールしていても、LEDが点灯したかどうかをスマホ側で確認できます。

ただ、sigmaDelta関数を使っているせいか、全点灯ボタンを押したときに一つだけ点灯しないということがありました。
これの原因は今は全く分かりません。
それ以外は特に問題無く動作してくれるのではないかなと思っています。

因みに、これはWi-Fi のローカルエリアネットワーク内でしか動作確認していません。
WAN を通して、全く別の場所で動作させることはいつか試してみたいと思います。

では、この使い方を説明しようと思いますが、独学の自作ライブラリですので、動作保証は一切しません。
これを使った、いかなるトラブルも当方では責任を負いませんので、予めご了承ください。

ただ、何かありましたらコメント欄等でご連絡いただけると、出来る限りお答えしたいと思っております。

スポンサーリンク

準備するもの

ESP32-DevKitC ( ESP-WROOM-32 開発ボード )
ESPRESSIF社製

これは秋月電子通商さんで販売しております。
ESP32 チップ をモジュール化して、日本で安心して使えるように技適認証取得した ESP-WROOM-32 を使った開発ボードです。

これは LDO ( 低ドロップアウトレギュレーター )が弱いところがありますが、通常使用では今のところ特に問題無く使えています。
また、USBシリアルでスケッチアップロードする場合、スイッチサイエンスさんの ESPr Developer のように自動リセット遷移せず、書き込み失敗することがよくあります。
その辺の回路がまだ甘いように思われます。

SparkFun マイクロSDカードスロット・ピッチ変換基板

SparkFun マイクロSDカードスロット・ピッチ変換基板

とても単純な micro SD カードスロット基板です。

micro SDHC カード

後で述べますが、miso端子にプルアップ抵抗を入れれば、UHSスピードクラス対応のmicro SDHCカードでも読み込み可能でした。
以下の3種類は動作確認済みです。


Transcend microSDHCカード 8GB Class10 UHS-I対応 Nintendo Switch 動作確認済 TS8GUSDU1
トランセンドジャパン
¥1,080(2024/03/28 11:30時点)


CdSセル 1MΩ GL5528

とりあえず、手元にあった1MΩのものを使いました。

固定抵抗100kΩ 1/2W  1個

1MΩのCdSセルとの分圧抵抗用です。

固定抵抗10kΩ 1/4W 1個

micro SDカード miso端子のプルアップ用です。
これ、重要です。

砲弾型LED 青、赤、緑

5V用くらいのごく普通のLEDで良いです。
ただ、高輝度のものは、電流量が多いので要注意です。
ESP32 のGPIO の最大電流は12mA なので、それ以下で光るものです。

定電流ダイオード E-103 3個

LEDの電流制限用です。
一般にLEDは固定抵抗を使う方が多いのですが、私の場合はちょっと高価でもCRD(定電流ダイオード)をよく使います。
電流が10mA以上流れないので、抵抗値を選ぶ手間が省けて、安全にLEDを点灯できて便利です。

ブレッドボード SAD-101 (サンハヤト) 2個

このブレッドボードは ESP32-DevKitC を載せても、片側1列、もう片側2列空くのでとても重宝しています。
しかも、2つのブレッドボードを連結できるので、お勧めです。

今回は余裕を持たせて、2つ連結します。

サンハヤト SAD-101 ニューブレッドボード
サンハヤト
¥529(2024/03/28 14:27時点)

日東 自己融着粘着テープ

電気工事でよく使うブチルゴムテープです。
LEDとCdSセルをくっつける時に使います。
ビニールテープみたいに粘着剤でくっつけるのではなく、粘土みたいに融着できるので便利です。

日東 自己融着粘着テープ セパなし NO.15 19mmX10m 1519
ニトムズ(Nitoms)
¥462(2024/03/28 12:03時点)

ジャンパーワイヤー

φ0.65mm の単線ワイヤーならば、ブレッドボードに直挿しできて便利です。

その他、USBケーブル、パソコン等

 

LEDとCdSセルをくっつける

LEDが光ったかどうかを読み取るために、CdS ( 硫化カドミウム )セルという光センサーをLEDにくっつけます。

まず、下図の様に自己融着テープ ( ブチルゴムテープ )をハサミでカットします。
CdSセルの大きさに合わせて、これくらいのものを2つカットします。

1枚を下図の様にリード線の片側にくっつけて、指で押しつぶします。
粘土みたいに潰せばくっつけられます。

そして、下図の様にLEDを巻き込んでくっつけます。
今回は同じ10mAの電流でも一番明るい青色LEDにくっつけました。

もう一枚の自己融着テープを下図の様に巻いていきます。

そして、こんな風に粘土のように潰してくっつけます。

コメント

  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をコピーしました