趣味のマイコンいじり

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

TAMIYA Tracked Vehicle をWiFiで動かして見ました

昔、UNO単体で動かしたTAMIYA模型を先の記事のWiFiBridgeを利用してWiFi
動かして見ました。Johnny-fiveに必要なモデルが揃っていて、それらを組み合わ
せればLEGOの様な感覚でスクリプトを書く事ができました。いつの間にか、必要な
インフラが揃っていてマニアにはとても便利な時代になっていたのを実感しました。
以下はその時の状況です。

<IOT動作モデルの概要>
  前に超音波距離センサーの動作チェックの時に利用したTAMIYAの「タンク工作
  基本キット」を使って次の様なIOTの動作モデルを作って検討して見ました。

 [全体の構成]
    イメージ 4
   
  1.先のこちらの記事で記載したWiFiBridgeモジュールを利用
        (Frimata実装のUNO+WiFiBridge実装のESP-01の組み合わせ)
  2.HC-SR04による距離センサーを搭載
  3.モータ駆動にはLS9110Sチップを利用している2チャンネルのHブリッジ
          の片方を使用
  4.ホストPCからは、モータの回転方向と回転速度を設定
  5.WiFiBridgeモジュールからは、前方の障害物までの距離をホストPCに返答
  6.モータドライブとHC-SR04コントールの雛形はJohnny-fiveの次のものを
          利用
            モータドライブ : http://johnny-five.io/examples/motor-hbridge/
             HC-SR04 : http://johnny-five.io/examples/proximity-hcsr04/

 [使用した主要部品]
    イメージ 1

  1.UNO(firmata)+ESP-01(WiFiBridge)モジュール  ---> こちらの記事を参照
  2.HC-SR04  ---> こちらの記事を参照
  3.L9110Sモータドライブモジュール  ---> こちらの記事を参照
  4.TAMIYA Tracked Vehicle  ---> こちらの記事を参照
  5.スマホ充電用バッテリー

 [動作状況]
  動作状況は次のURLから確認できます。
   

<テスト内容と結果>
   今回の動作モデルでのテストは次の様な内容で、スマホからMIYATAの模型を
     コントロールする方法を調べてみました。

       1.スマホからMIYATAの模型のモータの回転方向と速度の制御
       2.MIYATAの模型からの超音波センサーの応答をスマホで確認

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

       1.スマホからほぼリアルタイムでMIYATAの模型を制御できる事が
             判りました。
       2.また、MIYATAの模型からの超音波センサーの応答もほぼリアルタイムで
             動作する事が判りました。
       3.コードの作成に関しては、Johnny-fiveに沢山のサンプルが用意されて
             おり、目的の動作をさせる為のスクリプトは比較的簡単に作る事が
             できました。

 [テストでの機器の接続]
    イメージ 2
    ピン割り付けは、Johnny-fiveのサンプルのものを使っています。

    イメージ 3

 [準備]
   HC-SR04の動作には、このデバイスに対応した特別なFirmataが必要です。
   次の記事を参考にそれをインストールして下さい。(Firmataの他の機能は
   同じ様に使える様です。)

      URL : http://johnny-five.io/api/proximity/#pingfirmata
            (PingFirmataの項目を参照)

    こちらでは、コマンドプロンプトでの次のコマンドで対応しました。

      1.  npm install -g nodebots-interchange
                                         Firmata交換ソストのインストール
      2.  interchange install hc-sr04 -a uno -p com3 --firmata 
                                         Firmataソフトの交換
          (使っている環境ではUNOとのポートはcom3です。利用環境に合わせて
           変更が必要です。また、この時UNOへの書き込みが行わるので、
           ESP-01とのTX/RXは切り離しておいて下さい。)

    下記からダウンロードした2つのファイルをホストPCのHTTPルートに配置し、
     node.jsからserver.jsを起動する。
   
       1.  HTTPルートに配置する2つのファイル    index.html, server.js
       2.  server.jsの起動   ---> [node server.js] をコマンドプロンプトで実行

     コードのダウンロード先はこちら (Download URL is here.)

 [コード類]
    <index.html>  --- Webアクセス用のコード
          <!DOCTYPE html>
          <html>
          <head>
            <meta charset="utf-8">
            <title>arduino-socket.io</title>
            <script src="/socket.io/socket.io.js"></script>
            <script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
          </head>
         
          <body>
            <font size='5'>TAMIYA Tracked Vehicle<br>WiFi Control test</font><br><br>
         
            <form>
              <p><font size='4'>Set moving direction</font><br>
                <input type="radio" name="dirct" value="back" id="gbak">BAK</input>
                <input type="radio" name="dirct" value="stop" id="gstp">STP</input>
                <input type="radio" name="dirct" value="fwrd" id="gfwd">FWD</input>
              </p>
            </form>
         
            <form>
              <p><font size='4'>Motor Speed</font><br>
                <input type='range' name=Mspd min='90' max='255' id="mspd" value='90'><br>
              </p>
            </form>
         
              <p>
                <span>Forward obstacle (cm)</span><br>
                <span id="fdis"></span>
              </p>
         
            <script type="text/javascript">
              var socket = io();
              socket.on("connect", function(){
                console.log("connect!!");
                socket.on("fwdist", function(value){
                  $("#fdis").text(value);
                });
              });
         
              $(function(){
                $("#gbak").click(function(){
                  socket.emit("msg", "Moter=back");
                });
                $("#gstp").click(function(){
                  socket.emit("msg", "Moter=stop");
                });
                $("#gfwd").click(function(){
                  socket.emit("msg", "Moter=forward");
                });     
                $("#mspd").change(function(){
                  socket.emit("msg", "Speed="+ mspd.value);
                });
              });
            </script>
         
          </body>
          </html>


    <server.js>    --- node.jsの起動スクリプト
          var EtherPortClient = require("etherport-client").EtherPortClient;
          var fs = require("fs");
          var http = require("http");
          var Firmata = require("firmata");
          var server = http.createServer();
          var five = require("johnny-five");
         
          var board = new five.Board({      // for WiFi connection
            io: new Firmata(new EtherPortClient({
              host: '192.168.11.57',        // <--------- ESP-01 IP address  ---------
              port: 23                      // <--------- ESP-01 Port number ---------
            })),
            timeout: 1e5
          });
         
          board.on("ready", function() {
            // Server
            server.on("request", function(req, res) {
              var stream = fs.createReadStream("index.html");
              res.writeHead(200, {
                "Content-Type": "text/html"
              });
              stream.pipe(res);
            });
         
            // Socket.IO
            var io = require("socket.io").listen(server);
            server.listen(8000);
         
            // ultra sonic sensor
            var proximity = new five.Proximity({
              controller: "HCSR04",
              pin: 7
            });
         
            // motor
            var mspeed = 0;
            var dirct = 0;      // 0:stop, 1:forward, 2:back
            var motor = new five.Motor({
              pins: {
                pwm: 3,
                dir: 12
              },
              invertPWM: true
            });
         
            board.repl.inject({
              motor: motor
            });
         
            // Control
            io.sockets.on("connection", function(socket) {
              // check ultra sonic sensor
              proximity.on("data", function() {
                socket.emit("fwdist", this.cm);
              });
         
              // set moter control
              socket.on("msg", function(data) {
                console.log(data);
         
                if (data=="Moter=back") {         // back
                  dirct = 2;
                  motor.reverse(mspeed);
                } else if(data=="Moter=stop"){    // stop
                  dirct = 0;
                  motor.stop();
                } else if(data=="Moter=forward"){ // forward
                  dirct = 1;
                  motor.forward(mspeed);
                } else if(data.substr(0, 6) == "Speed=") {  // speed
                  mspeed = data.substr(6);
                  if(dirct > 0){
                    if(dirct == 1) motor.forward(mspeed);
                    else motor.reverse(mspeed);
                  }
                }
              });
            });
          });