超音波測距センサ（HC-SR04）を用いいた身長測定

背景
　身長測定といえば何を思い浮かべますでしょうか。健康診断や背の順整列、もしかしたら、小さい頃に柱に削った思い出を持っている方もいるのではないでしょうか。
　今回はつっぱり棒を利用した、身長測定のIoTを作ってみましょう。

アイディア
　距離を測るセンサを上部に設置しそこから得られる距離情報を、地面からセンサまでの距離から引くと身長になります。これをWebサービスに送ることで身長を記録できると考えました。

実装

- 道具
    - Arudino
    - 超音波測距センサ（HC-SR04）
    - ジャンパワイヤ（オス／オス）4本

- 準備
    - Arudinoのプログラミングは、Arudino用のC/C++をベースに拡張したArudino言語が採用されていますが、今回はJSからArudinoをFirmata経由で制御できるjohnny-fiveを使います。

    - Firmataのインストール

        - https://github.com/rwaldron/johnny-five#setup-and-assemble-arduino
    - jonny-fiveのインストール
        - https://github.com/rwaldron/johnny-five#hey-you-heres-johnny
    - PingFirmataのインストール
        - https://github.com/rwaldron/johnny-five/wiki/Proximity#pingfirmata
        - Arduinoで超音波測距センサ（HC-SR04）を使用するには、「PingFirmata」を書き込む必要があります。（http://denshibu.blog.fc2.com/blog-entry-71.html）

- 手順１　Arudinoとセンサとを接続
    - Echo
        - A0
    - Trig
        - A0
    - VCC
        - 5V

配線図

- 手順２　JSで距離を取得できるか確かめてみる
    - app.jsなど、javascriptファイルを作成しnode_modulesディレクトリと同階層に作成します。そのファイルに以下のスクリプトを書きます。

```
var five  = require("johnny-five");
var board = new five.Board();

board.on('ready', function () {

    var proximity = new five.Proximity({
        controller: "HCSR04",
        pin: "A0"
    });

    proximity.on("data", function() {
        console.log("Proximity: ");
        console.log("  cm  : ", this.cm);
        console.log("  in  : ", this.in);
        console.log("-----------------");
    });

    proximity.on("change", function() {
        console.log("The obstruction has moved.");
    });

});
```

    - 実行します

```
$ node app.js
```

　手順３　取得できた距離をデバイスに飛ばす

- 取得した距離はWebSocketでPCなどのデバイスに送ります。
    - WebSocketを行なうためにsocket.ioをインストールします

```
$ npm install --save socket.io
```

    - 前回のプログラムにsocket.ioを追加します

```
var port = 8888;
var io  = require('socket.io').listen(port);

var five  = require("../../node_modules/johnny-five");
var board = new five.Board();

var socket2;

io.sockets.on('connection', function (socket) {
    socket2 = socket;
});

board.on('ready', function () {

    var proximity = new five.Proximity({
        controller: "HCSR04",
        pin: "A0"
    });

    proximity.on("data", function() {
        socket2.emit('message', this.cm);
    });

    proximity.on("change", function() {
        socket2.emit('message', this.cm);
    });

});
```

- 手順４　受信した距離情報から身長を求める
    - WebSocketで送られた距離情報をPCで受け取るために、scket.io-clientをindex.htmlに読み込ませます。このファイルはsocket.ioをインストール際に一緒にnode-modules入っています。こちらをDocumentRootに移動させて読み込ませて下さい。

```
<script src="asset/js/socket.io-client/socket.io.js"></script>
```

 WebSocketで送られたデータを取得するプログラムを書きます

```
var host    = 'localhost';
var port    = 8888;
var socket  = io.connect(host + ':' + port);

socket.on('connect', function (data) {
    socket.emit('start');
});

socket.on('message', function(data){
    var distance = data;
    console.log("distance:" + distance);
});
```

 受信した距離から身長を求める
 超音波測距センサを地面から2mの高さに設置したと仮定すると、その距離から受信した距離を引いた値は、その人の頂点ということになります。つまり身長になります。これをプログラムにします。

```
var installation = 200;

socket.on('message', function(data){
    var distance = data;
    var height   = installation - floatFormat(distance, 2);

    console.log("height:" + height);
});

// 小数点処理
function floatFormat( number, n ) {
    var _pow = Math.pow( 10 , n ) ;
    return Math.round( number * _pow ) / _pow ;
}

- 手順５　身長を画面に表示する
    - index.htmlを用意します

<!DOCTYPE html>
<html lang="ja"
<head
    <meta charset="UTF-8"
    <title>身長測定</title
</head
<body>

身長は、<span id="height"></span>cm

<script src="asset/js/socket.io-client/socket.io.js"></script
<script src="asset/js/bundle.js"></script
</body
</html>
```

    - 上記HTMLの<span id=height></span>の間に身長測定の結果を挿入します。

```
var host    = 'localhost';
var port    = 8888;
var socket  = io.connect(host + ':' + port);
var element = document.getElementById("height”); // 追加

var installation = 200;

socket.on('connect', function (data) {
    socket.emit('start');
});

socket.on('message', function(data){
    var distance = data;
    var height  = installation - floatFormat(distance, 2);

    element.innerHTML = height; // 追加
});

// 小数点処理
function floatFormat( number, n ) {
    var _pow = Math.pow( 10 , n ) ;

    return Math.round( number * _pow ) / _pow ;
}
```

- 手順６　設置する
    - 今回使用するつっぱり棒は以下になります。（平安伸銅工業 キッズ収納ラック ホワイト 取付高さ200~275cm TGK-1）

![h_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/25625/03785a58-d314-b251-ac80-41ab17556d6d.jpeg)


上図のカゴの高さを200cmに調整し、Arduinoと超音波測距センサ（HC-SR04）を下向きにして設置すると完成です
 前で作成したhtmlをブラウザで表示させ、超音波測距センサ（HC-SR04）の下に立つと身長が表示されます。

- まとめ
    - 超音波測距センサ（HC-SR04）を利用することで、近未来的な身長測定を作成することが出来ました。ただし正確性は保証できませんのでご了承下さい。

- 発展案として
  - 現在PCとArduinoは接続したままでないと超音波測距センサ（HC-SR04）を制御したりWebSocket通信を利用したりはできません。
  - こちらはArduinoが単体でインターネットに接続できるように以下のシールドを加えるとPCから独立させることが可能です。
  - https://www.amazon.co.jp/gp/product/B00XC054NS/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1
  - また、今回利用したJonny-Fiveで作成したプログラムはArduinoには書き込まれていないので、Arduino専用の言語でプログラム書き直す必要があります。
  - Webサービス側に認証機能と記録機能を用意することで、例えば子どもの成長を自動記録するシステムを構築できます。
  - 防犯機能として出口にこの装置を付けておくと有事の際に身長が記録されるようなシステムを構築出来たりもします