6軸センサの値をsakura.ioに投げてみる


[初めての電子工作: Arduinoで6軸センサを動かしてみる](http://qiita.com/key/items/8c6b684e6308cc5f451f)の続き。

5000円ちょっとで売られているsakura.ioのβ版モジュールを使うと、Arduinoからsakura.ioへ簡単にデータを投げられる。

- [さくらのIoT Platformβウェブサイト](https://iot.sakura.ad.jp/)
- [さくらのIoT Platformβモジュール販売サイト](http://iot-store.sakura.ad.jp/)

sakura.ioに送信したデータはWebSocketやMQTTなどいくつかの形で外部へ取り出すことが出来るので、ぼくのようなウェブ屋さんにはとても扱いやすい。6軸センサの値を取得してsakura.ioに送信し、WebSocketで取得するところまでトライしてみる。

# 前提

- さくらインターネットにアカウントを持っていること

# 準備

## プロジェクトを作る

[IoTプラットフォームの管理コンソール](https://secure.sakura.ad.jp/iot/)を開いて新しいプロジェクトを作ります。

![貼り付けた画像_2016_12_24_18_13.png](https://qiita-image-store.s3.amazonaws.com/0/29860/65545afa-8ad5-9ae4-1fc5-dbf84a0e7214.png "貼り付けた画像_2016_12_24_18_13.png")

名称はプロジェクト名称は適当でいいです（後から変更できます）。

![貼り付けた画像_2016_12_24_18_13.png](https://qiita-image-store.s3.amazonaws.com/0/29860/c36dd752-0b26-97f4-e7f3-c843ec67b90b.png "貼り付けた画像_2016_12_24_18_13.png")

## モジュールを登録する

sakura.io LTEモジュールを登録します。基板の裏面のシールを剥がすと **ID**, **PASS** の記載があります。

![貼り付けた画像_2016_12_24_18_19.png](https://qiita-image-store.s3.amazonaws.com/0/29860/801b0974-96de-6f34-54f7-cfcfa6392697.png "貼り付けた画像_2016_12_24_18_19.png")

プロジェクトの *モジュール登録* を開いて…

![貼り付けた画像_2016_12_24_18_14.png](https://qiita-image-store.s3.amazonaws.com/0/29860/f3925c70-ceb4-ba32-9fa3-6832ecb341a6.png "貼り付けた画像_2016_12_24_18_14.png")

**登録用ID** にモジュールの **ID** を、 **登録用パスワード** にモジュールの **PASS** を入力します。これでモジュールの登録は完了。

![貼り付けた画像_2016_12_24_18_15.png](https://qiita-image-store.s3.amazonaws.com/0/29860/59712feb-5640-550d-788c-31a4ab2874f5.png "貼り付けた画像_2016_12_24_18_15.png")

## 連携サービスの追加

WebSocketのエンドポイントを作成するため *サービス追加* を開きます。

![貼り付けた画像_2016_12_24_18_16.png](https://qiita-image-store.s3.amazonaws.com/0/29860/06fdd3fa-fc36-ecfe-ef2e-dde1c527bd9e.png "貼り付けた画像_2016_12_24_18_16.png")

いくつかあるうちの **WebSocket** を開いて…

![貼り付けた画像_2016_12_24_18_17.png](https://qiita-image-store.s3.amazonaws.com/0/29860/8fe7e9a8-f59b-b91a-5d51-c0dc383adaf0.png "貼り付けた画像_2016_12_24_18_17.png")

適当に名前をつけます（これも後から変更できます）。

![貼り付けた画像_2016_12_24_18_22.png](https://qiita-image-store.s3.amazonaws.com/0/29860/767bf077-ab97-939b-5e96-69540394b797.png "貼り付けた画像_2016_12_24_18_22.png")

トークンとWebSocketエンドポイントが作成されるので保存しておしまい。

# WebSocketからデータを取得する

Golangで書かれたコマンドラインツールの[sakuraio-cli](https://github.com/sakura-internet/sakuraio-cli)を使うと簡単です。 *XXXX* と書かれた箇所は、サービス登録時に取得したトークンを入力します。

```bash
sakuraio-cli service websocket listen --token=XXXX
```

接続されるとキープアライブを行っていることがペイロードからわかります。ペイロードのシリアライズ方式はJSONなので人間が読みやすくていいですね。だいたい10秒に1回ほど接続維持のため通信を行うようです。タイムスタンプはISO8601形式です。

```json
{"type":"keepalive","datetime":"2016-12-24T09:36:34.421300505Z"}
{"type":"keepalive","datetime":"2016-12-24T09:36:44.42129101Z"}
{"type":"keepalive","datetime":"2016-12-24T09:36:54.421342341Z"}
```

# サンプルコードを実行してペイロードを確認する

さくらインターネットさんのgithubレポジトリにある[GY-521](https://github.com/sakura-internet/SakuraIOArduino/tree/master/examples/GY-521)のサンプルを実行し、6軸センサの値をsakura.io LTEモジュールへ送信します。回路図やソースコードはレポジトリのファイルを見てください。

Arduinoにプログラムをロードしてしばらく待つと、sakura.io LTEモジュールがオンラインになったことがわかります。

```json
{
    "datetime": "2016-12-24T08:30:40.217788971Z",
    "module": "XXXX",
    "payload": {
        "is_online": true
    },
    "type": "connection"
}
```

さらに少し待つと、6軸センサが取得した値が流れてきます。チャネル定義は次のようになっています。

 * Channel 0: Temperature in celsius
 * Channel 1: Accelerometer X (G)
 * Channel 2: Accelerometer Y
 * Channel 3: Accelerometer Z
 * Channel 4: Gyro X (degrees / sec)
 * Channel 5: Gyro Y
 * Channel 6: Gyro Z

```json
{
    "datetime": "2016-12-24T09:53:03.514430413Z",
    "module": "XXXX",
    "payload": {
        "channels": [
            {
                "channel": 0,
                "datetime": "2016-12-24T09:53:03.429432065Z",
                "type": "f",
                "value": 29.07059
            },
            {
                "channel": 1,
                "datetime": "2016-12-24T09:53:03.443432065Z",
                "type": "f",
                "value": 0.10620117
            },
            {
                "channel": 2,
                "datetime": "2016-12-24T09:53:03.454432065Z",
                "type": "f",
                "value": -0.032958984
            },
            {
                "channel": 3,
                "datetime": "2016-12-24T09:53:03.466432065Z",
                "type": "f",
                "value": 0.96362305
            },
            {
                "channel": 4,
                "datetime": "2016-12-24T09:53:03.480432065Z",
                "type": "f",
                "value": -2.908397
            },
            {
                "channel": 5,
                "datetime": "2016-12-24T09:53:03.492432065Z",
                "type": "f",
                "value": -0.90076333
            },
            {
                "channel": 6,
                "datetime": "2016-12-24T09:53:03.504432065Z",
                "type": "f",
                "value": -0.47328246
            }
        ]
    },
    "type": "channels"
}
```

というわけでデバイスのセンサ値をサクッとWebSocketで取得することが出来ました。便利ですね。