WICED SenseをIntel Edisonから使う

[WICED Sense](http://ja.broadcom.com/products/wiced/sense/) というデバイスがあります。これはBroadcomが作っているBLEタグです。BLEに加えて、以下の5つの MEMS センサーが搭載されています。

![edison_wiced.png](https://qiita-image-store.s3.amazonaws.com/0/8781/c1ca15cc-36e6-a1b4-3fc7-d624dc6ff88c.png)

-   三軸ジャイロ
-   加速度計
-   方位
-   気圧計
-   湿度、温度計

Intel EdisonとWICED SenseをMac Book Pro 13Inchに乗せて撮影しました。小ささが分かると思います。

国内からはここから買えます。1つ2450円です。(でも、今は完売してますね)
<http://www.macnicaonline.com/SHOP/BCM9WICED_SENSE.html>

買ったら本体内の電池ボックスの中に通電防止のプラスチックが挟まっていますので、まずそれを取ります。(ここでハマりましたw)

スマホから接続してみる
----------------------

"WICED Sense" という名前のアプリをgoogle playからインストールします。ぼくはNexus5を使っていますのでAndroidアプリですが、iPhoneでもアプリが出ています。

-   <https://play.google.com/store/apps/details?id=com.broadcom.app.wicedsense>

アプリを起動すると、BluetoothをOnになりScanが始まります。そこでWICEDが出てきたらタップします。(もしかしたら上のボタンをまずおして、wakeupさせる必要があるかもしれません)

1.  Connectをタップ
2.  WICED Senseの下のボタンを押す

で「ブ」と短く一回鳴れば接続完了です。画面に電池容量や温度などの情報が表示されるでしょう。

![wiced_app.png](https://qiita-image-store.s3.amazonaws.com/0/8781/a06df1b5-39a3-3cd7-4968-c1af3f7161e7.png)

こんな感じで表示されます。

firmwareが更新されているので、メニューから「Check for software updates」を選び、最新版に更新します。「ブブブ」とうるさいですが、30秒ぐらいで完了します。

では、続いて Intel Edisonから見てみましょう。

Intel Edisonから接続してみる
----------------------------

Intel EdisonからWICED Senseを使ってみましょう。

まず、Edisonにログインし、以下のコマンドでbluetoothを有効にしておきましょう。(ここではEdisonへのログイン方法などは解説しません)

``` {.sourceCode .bash}
rfkill unblock bluetooth
```

### cylonから扱う

[cylonjs](http://cylonjs.com/) というnodeライブラリがあります。これはJavaScriptでAurdinoなどいろいろなものを制御しよう、というものです。これがWICED Senseに対応しています。

WICED SenseにつなぐにはEdisonに以下の３つのnode packageをインストールしておく必要があります。

-   npm install noble
-   npm install cylon-ble
-   npm install cylon-wiced-sense

### 情報を取ってみる

以下のコードをEdison上に保存し、 `node get_info.js` と実行します。

``` {.sourceCode .javascript}
var Cylon = require('cylon');

Cylon.robot({
  connection: { name: 'bluetooth', adaptor: 'central', module:
  'cylon-ble', uuid: '207377654321'},
  devices: [{name: 'battery', driver: 'ble-battery-service'},
            {name: 'deviceInfo', driver: 'ble-device-information'},
            {name: 'generic', driver: 'ble-generic-access'},
            {name: 'wiced', driver: 'wiced-sense'}],

  display: function(err, data) {
    if (err) {
      console.log("Error:", err);
    } else {
      console.log("Data:", data);
    }
  },

  work: function(my) {
    my.generic.getDeviceName(function(err, data){
      my.display(err, data);
      my.generic.getAppearance(function(err, data){
        my.display(err, data);
        my.deviceInfo.getManufacturerName(function(err, data){
          my.display(err, data);
          my.wiced.getData(function(err, data){
            my.display(err, data);
          });
        });
      });
    });
  }
}).start();
```

以下のような感じで、どんどんデータが出てきます。 `Connecting` のところで、上ボタンを押す必要があるかもしれません。

``` {.sourceCode .none}
I, [2014-11-14T13:38:26.496Z]  INFO -- : Initializing connections.
I, [2014-11-14T13:38:26.511Z]  INFO -- : Initializing connection 'bluetooth'.
I, [2014-11-14T13:38:26.780Z]  INFO -- : Initializing devices.
I, [2014-11-14T13:38:26.782Z]  INFO -- : Initializing device 'battery'.
I, [2014-11-14T13:38:26.788Z]  INFO -- : Initializing device 'deviceInfo'.
I, [2014-11-14T13:38:26.790Z]  INFO -- : Initializing device 'generic'.
I, [2014-11-14T13:38:26.792Z]  INFO -- : Initializing device 'wiced'.
I, [2014-11-14T13:38:26.823Z]  INFO -- : Starting connections.
I, [2014-11-14T13:38:26.827Z]  INFO -- : Connecting to 'bluetooth'.
I, [2014-11-14T13:38:30.841Z]  INFO -- : Starting devices.
I, [2014-11-14T13:38:30.843Z]  INFO -- : Starting device 'battery'.
I, [2014-11-14T13:38:30.846Z]  INFO -- : Starting device 'deviceInfo'.
I, [2014-11-14T13:38:30.849Z]  INFO -- : Starting device 'generic'.
I, [2014-11-14T13:38:30.851Z]  INFO -- : Starting device 'wiced'.
I, [2014-11-14T13:38:30.854Z]  INFO -- : Working.
Data: WICED Sense Kit
Data: { value: 'Generic Tag', description: 'Generic category' }
Data: Broadcom
Data: { accelerometer: { x: 1, y: -1, z: 82 },
  gyroscope: { x: -26, y: -78, z: 203 },
  magnetometer: { x: 842, y: -523, z: -2101 } }
Data: { accelerometer: { x: 0, y: -3, z: 83 },
Data: { accelerometer: { x: 0, y: -2, z: 83 },
  gyroscope: { x: -24, y: -150, z: 261 },
  magnetometer: { x: 850, y: -532, z: -2099 } }
Data: { humidity: 618, pressure: 10155, temperature: 245 }
```

では、この得られたデータをMQTTで送ってみましょう。

MQTTで送ってみる
----------------

MQTTで送るには、mqttcliが便利です。drone.ioにてbuild済みのバイナリを配っていますので、linux\_386用のファイルを以下のようにして取ってきます。(chmodが必要です)

``` {.sourceCode .bash}
curl -O https://drone.io/github.com/shirou/mqttcli/files/artifacts/bin/linux_386/mqttcli
chmod ugo+x mqttcli
```

そして、 \~/.mqttcli.cfg に [MQTT as a Service:sango](https://sango.shiguredo.jp) で得た情報を記載しておきます。

``` {.sourceCode .javascript}
{
  "host": "sango.mqtt.example.jp",
  "port": 1883,
  "username": "shirou@github",
  "password": "BLAHBLAH"
}
```

あとはさっきのnodeの標準出力を食わせてあげれば、どこからでもデータを受け取れます。

``` {.sourceCode .bash}
node get_info.js | ./mqttcli pub -t "shirou@github/edison" -s
```

あとはDBに突っ込むなりアラートを送るなり、好きなようにいじれますね。

まとめ
------

WICED Senseという各種センサーが搭載されているBLEタグがあります。これをIntel Edisonから扱ってみました。さらに、得られたデータをMQTTで送ってみました。

Intel Edisonは小型でどこにでも置けますし、WIFIが付いているのも大きいです。WICED Senseも小型でとても扱いやすいです。さらにMQTTを組み合わせることで、手軽にセンサー情報を扱うことが出来るようになりました。