趣味のマイコンいじり

安価なマイコンを利用して作成したアプリの紹介です。

ESP-01にWebSocketのサーバーを実装して見ました

先に、ESP-01にWiFiBridgeを実装してホストPCを通して、Node.js+Johnny-five
スマホから対象物を制御する方法を検討しましたが、今回はホストPC無しで、
ESP-01とスマホをダイレクトに繋いで同じ動作をさせる方法を検討しました。
利用可能な材料は既にWeb上に公開されていて、比較的容易にWiFiBridgeの時と
同じ内容をホストPC無しで実現する事が出来ました。目的に応じてホストPCを
利用したり、あるいは単独動作にしたりする選択ができるのかと思います。
マニアには良い時代になったと思いました。 以下がその時の状況となります。

<ESP-01のWiFi WebSocket serverでの利用>
   ESP-01にWebSocketのサーバを実装し、WiFiBridgeの時にPC経由で
   行っていた内容を、ESP-01から直接行う方法を検討しました。なお、ハードと
   制御対象は過去の次の2つの記事のものと同じで、ESP-01に実装したソフト
   のみの変更でスマホとの通信を直接行う様にしたものです。
        ESP-01 WiFiBridgeの記事TAMIYA Tracked Vehicle の記事

 [全体の構成]
    イメージ 1

  1.UNOには「StandardFirmata」に超音波センサー駆動用のPing Readの
          機能を付加したものを実装
  2.ESP-01にはWebSocketとFirmata駆動用の機能を実装
         (今回開発したもの)
  3.制御用の対象物は、WiFiBridge の時に検討したもの(テスト用I/Oと
          TAMIYA Tracked Vehicle)
  4.ハード構成に関しては、WiFiBridgeのものと同じ
         (TAMIYA Tracked Vehicle用のピン割り付けは変更)

 [使用した主要部品]

    イメージ 2

   WiFiBridgeとそれを応用したTAMIYA Tracked Vehicle の時のものと同じ

  1.ESP-01 WIFI 基板
  2.Arduino UNO
  3.Proto shield for UNO & MEGA
  4.SSD1306 0.96" OLED (I2C対応品)
      (SSH1106 1.3" OLED でも可能、また、無しでもシリアルモニタから
           割り付けIP等の確認が可能)
  5.HC-SR04超音波距離センサー
  6.L9110S 2チャンネルHブリッジモータドライバー(今回、1チャンネル分
          のみ利用)
  7.手作りのオリジナルI/Oテスト基板
       (Red & Green LED, slide switch, pre-set resister が実装)

 [動作状況]
  動作状況は次のURLから確認できます。
   (WiFiBridgeの時のものとほぼ同じです。)
    

<関連資料>
  利用したWebSocketのライブラリは次のもので、理解しやすく、
    またサンプルもちゃんと動作したので使いました。
   URL : https://github.com/Links2004/arduinoWebSockets

  Firmataのプロトコルに関しては、こちらを参考にしました。
       URL : http://firmata.org/wiki/Protocol

  超音波距離センサーに対応したPingFirmataはこちらの記事で紹介されている
    ソースコードを参考にしました。
       URL : http://johnny-five.io/api/proximity/#pingfirmata
   

<テスト内容と結果>
   ESP-01のWebSocketのサーバとしての利用に関しては、WiFiBridgeの時の
     ものと同じ内容をさせるとどうなるかを確認する事で、次の様な内容を
     行わせる事にしました。

       1.WiFiBridgeの時に利用したテストI/O基板の制御
       2.同じくTAMIYA Tracked Vehicle の制御

   動作させた結果としては、次の様なものでした。

       1.WebSocketを利用すると、WiFiBridgeを利用した場合と同様に、
             ほぼリアルタイムでの制御が可能な事が判りました。
       2.ただし、Johnny-five は利用できないので、Firmataのプロトコルによる
             UNOの制御は独自に作成する必要が有りました。
       3.でも、ホストPCが不要となる為、スマホとの中断後の再連結が容易で、
             取り扱いはとても便利になる事が判りました。(WiFiBridgeでは
             ホストPC側のNode.jsの再起動が必要でしたが、WebSocketでは
             不要です。)

 [テストでの機器の接続]
    イメージ 3

     上記のUNOの0(RXD)と1(TXD)端子の接続に関しては、ESP-01側の準備と
      設定が済んでWebSocketの機能を利用する時のもので、UNOのUSBtoTTLの
      機能を利用してESP-01側の準備と設定を行う時は別の接続となります。
     (こちらを参照。UNOのUSBtoTTLを利用する初期段階では、この部分が
        変更できる様にしている事が必要です。)

    イメージ 4

 [起動方法]
   テストの起動は次の操作で行います。 (ESP-01 WiFiBridgeの記事 を参照)
   
       1.ESP-01にWebSocketのプログラクを書き込む
       2.Network SSID とその Password を設定
       3.UNOにPing Read 付きの StandardFirmataを書き込む
       4.UNOのRXD/TXDの配線を元に戻して、UNOのリセットを押して
             モジュール全体を再起動

 [操作画面]
    イメージ 5

 [Ping Read command]
   Ping Readのインターフェイスをコードより解析したものは次の様なものと
   なっていました。割り当てられている sysex commands のコードは0x75で、
   これは Firmata の仕様では「SHIFT_DATA」に割り当てられているものですが、
   Standard Firmata には実装されていないのでそのまま利用しています。 別の
   Firmata にこの Ping Read の機能を付加して利用する場合は変更が必要かも
   知れません。

       /* ping check
        * -------------------------------
        *  0  START_SYSEX (0xF0) (MIDI System Exclusive)
        *  1  ping read (0x75)
        *  2  pin (0 to 127)
        *  3  pulse polarity (1:positive, 0:negative)  HC-SR04:positive
        *  4  pulse dulation (uS) bits 24-30
        *  5  pulse dulation (uS) bits 31 (1 or 0)
        *  6  pulse dulation (uS) bits 16-22
        *  7  pulse dulation (uS) bits 23 (1 or 0)
        *  8  pulse dulation (uS) bits  8-14
        *  9  pulse dulation (uS) bits 16 (1 or 0)
        * 10  pulse dulation (uS) bits  0- 6
        * 11  pulse dulation (uS) bits  7 (1 or 0)
        * 12  time out period (uS) bits 24-30
        * 13  time out period (uS) bits 31 (1 or 0)
        * 14  time out period (uS) bits 16-22
        * 15  time out period (uS) bits 23 (1 or 0)
        * 16  time out period (uS) bits  8-14
        * 17  time out period (uS) bits 16 (1 or 0)
        * 18  time out period (uS) bits  0- 6
        * 19  time out period (uS) bits  7 (1 or 0)
        * 20  END_SYSEX (0xF7) (MIDI End of SysEx - EOX)
        */
      
       /* ping response
        * -------------------------------
        *  0  START_SYSEX (0xF0) (MIDI System Exclusive)
        *  1  ping read (0x75)
        *  2  pin (bit 0 - 6)
        *  3  pin (bit 7)   : normal 0
        *  4  response (uS) bits 24-30
        *  5  response (uS) bits 31 (1 or 0)
        *  6  response (uS) bits 16-22
        *  7  response (uS) bits 23 (1 or 0)
        *  8  response (uS) bits  8-14
        *  9  response (uS) bits 16 (1 or 0)
        * 10  response (uS) bits  0- 6
        * 11  response (uS) bits  7 (1 or 0)
        * 12  END_SYSEX (0xF7) (MIDI End of SysEx - EOX)
        */

 [コード類]
   コード類は次のURLからダウンロードできます。
     Code download URL : https://www.dropbox.com/s/agu9syw9vrocluu/WebSocket_test.zip?dl=0

<UNO側の準備>
   UNOのUSBtoTTLの機能を利用してESP-01へのコードの書き込みを行う場合は、
   ESP-01 WiFiBridgeの記事 を参考にして、一旦UNOのチップのTXポートの
   出力状態を解除するコードを書き込んだ後にESP-01のコード書き込みと
   SSID/Passwordの設定を行い、その後に StandardFirmata + Ping_Read の
   コードの書き込みを行って下さい。

<ESP-01側の準備>
 [開発環境]
   ESP8266の開発環境を構築するには、WeMos D1に関するこちらの記事
   参考にして下さい。書き込み時に指定するボードは「Generic ESP8266 Module」
   が利用可能です。なお、書き込みにUNOのUSBtoTTLの機能を利用する場合は、
   ESP-01 WiFiBridgeの記事を参考にして、TX/RXの配線の変更と、この記事に
   有るUNOのチップのTXポートを開放するUNOのコードを利用して同様に行って
   下さい。この方法は、一連の作業を伴って煩雑となるので、コードの修正の頻度が
   高い場合には、ESP-01を単独で駆動させる別のものを利用する方法が良いかと
   思います。こちらでは、次のデバイスを修正したもので書き込みと
   SSID/Passwordの設定を行っています。

 [書き込み/設定ツール]
    イメージ 6


   こちらの記事で紹介したESP-01用のUSBtoTTLのデバイスに、2つのタクト
   SWを付けて、書き込みモードの設定とリセットが行える様にしたものを
   利用しています。
 
   <書き込みモード>
      2つのスイッチを押して、Reset SW を先に離すと、書き込みモードに
       なります。

   SSID/Passwordの設定>
      Arduino IDE のシリアルモニタを起動して、ESP-01のリセットを行うと、
      SSIDとPasswordの設定を行うメッセージが出るのでそれに従って設定を
      行って下さい。(UNOのUSBtoTTLを利用する場合は、ESP-01の書き込み時
      と同じ接続、同じUNOのコードの書き込みで利用して下さい。)