Raspberry pi 2から、mobile backendに温度データをアップする（TMP102版）

#はじめに
Raspberry Pi 2からニフティさんの[mobile backend](http://mb.cloud.nifty.com/)に、[JavaScript SDK Version 2](http://mb.cloud.nifty.com/doc/current/introduction/sdkdownload_javascript.html)を使ってデータをアップする方法をまとめます。

※なぜ、Raspberry Pi "**2**"と書いているかといいますと、node.jsのインストール方法が違うからです。

アップするデータは、[TMP102](https://www.switch-science.com/catalog/1474/)から取得した温度データです。
TMP102は、[I2C](https://ja.wikipedia.org/wiki/I2C)という方式でセンサーからデータを読み込みますので、そのあたりの設定も行います。

#参考ページ

以下にいろいろな情報があります。

- [niftyさんのQiitaページ](http://qiita.com/organizations/nifty)

特に今回では以下を参考にさせてもらいました。

- [【IoTを実感しよう！】温度センサのデータをクラウドに保存する(node.js×Raspberr pi)](http://qiita.com/fumishitan/items/8abae38db286138f23bf)
- [Raspberry Pi の I2C を有効化する方法 (2015年版)](https://blog.ymyzk.com/2015/02/enable-raspberry-pi-i2c/)

#環境
今回、使用した環境は以下です。

|項目|内容|
|:----------|:---------------|
|ハードウェア|Raspberry pi 2 Model B|
|SDカード容量|8GB|
|OS|[RASPBIAN](https://www.raspberrypi.org/downloads/raspbian/) JESSIE September 2015|
|node.js|0.12.7|

#さて、はじめよう

大まかな流れは以下になります。

 1. OSのインストール
 * node.jsのインストール
 * SDKのインストール
 * Raspberry piでのI2Cの有効化
 * node.jsでの温度データの取得
 * mobile backendへのアップロード

以下で、順番に手順を記載しておきます。
##1. OSのインストール

手順については、母艦のOS毎に多くのサイトで取り上げられているので、ここでは省略します。

##2. node.jsのインストール

現状、Raspberry pi用に用意されたパッケージは2では動かないそうなので、ソースからコンパイルします。
ソースは、[ここ](http://nodejs.org/dist/)から取得します。
最新は4系ですが、今後使うライブラリがまだサポートされてない可能性が高いので、0.12.xを使用します。現時点で最新の[0.12.7](https://nodejs.org/en/blog/release/v0.12.7/)をインストールします。

- wgetでソースを取得

 > $ wget http://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz
 > $ tar zxvf node-v0.12.7.tar.gz

- ソースをコンパイルしてインストール(makeに１時間半ほどかかります)

 > $ cd v0.12.7/
 > $ ./configure
 > $ make
 > $ sudo make install

##3.SDKのインストール

npmをつかってSDKをインストールします。（６分ほどかかります。）

 > $ cd
 > $ npm install -S ncmb

インストール中に、以下のワーニングがでるようですが、無視してよいようです。

 > npm WARN optional dep failed, continuing fsevents@1.0.2

##4. Raspberry piでのI2Cの有効化

いくつか方法があるようですが、今回はraspi-configを使った方法で設定します。

### 4.1 raspi-configでのI2Cの有効化
---
以下のコマンドを実行します。

 > $ sudo raspi-config

![i2c_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/3a15c8e5-63c5-5b34-5caa-0c95343e8351.jpeg)
すると設定メニュー画面が表示されますので、**8 Advanced Options**を選びます。

![i2c_002.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/62f0abfa-36dc-8dab-fd45-a2f9b62bf38f.jpeg)
次の画面では、**A7 I2C**を選びます。

![i2c_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/74cbf9fd-1c1c-aa05-ed16-3f43f449599e.jpeg)
すると、I2Cを有効にするかを聞いてくるので、**YES**を選びます。

![i2c_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/cb5c10eb-da71-77a7-776c-c3cf3985cfcc.jpeg)
有効になったことを知らせる画面が表示されます。

![i2c_005.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/ab8b645f-70df-0a21-94f7-f58e07c9e464.jpeg)
次の画面では、I2Cのモジュールを標準で読み込むかを聞いてきます。今後、常につかうことになると思うので、**YES**を選びます。

![i2c_006.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/a4805535-251d-d529-af36-354e05b52d5e.jpeg)
有効になったことを知らせる画面が表示されます。

ここで一回再起動します。

### 4.2 I2Cの動作確認
---
まず、TMP102を接続します。

接続はこんな感じになります。
![TMP102_RASPI.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/98ec0413-c5f0-a0be-439b-e1cbb9610e3c.jpeg)

I2Cなので接続は４本。

|TMP102側|ラズパイ側|pin|
|:---|:---|:---|
|GND|GND|6|
|SCL|SCL1|5|
|SDA|SDA1|3|
|V+|3.3v|1|

あと、TMP102は、ADD0ピンでI2Cのアドレスを指定します。V+につなげば0x49、GNDにつなげば0x48になります（[こちら](http://www.eleki-jack.com/FC/2011/06/12arduino12tmp102.html)参照）。今回はGNDにつなげました。

次に、I2Cのモジュールが有効になっているかをlsmodで確認します。

 > $ lsmod

![i2c_010.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/09a3b551-9d4c-4d4c-79e3-adb91fffc8d3.jpeg)

**i2c_bcm2708**と、**i2c_dev**が表示されていることを確認します。
（もしも表示されていない場合は、再度raspi-configで設定しなおしてみてください）

最後に、TMP102が正しく接続され、認識されているかを確認します。
その目的で**i2cdetect**を使用するため、i2c-toolsをインストールします。

 > $ sudo apt-get install i2c-tools

そして、

 > $ sudo i2cdetect -y 1

![i2c_011.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/41e063a5-fceb-48ba-281e-73af9d682dcc.jpeg)

パラメータの **1** は忘れないようつけてください。
Raspberry piは2つのi2cのバスをもっており(0と1、i2cdetect -l で確認できます)、今回接続したピンは2つめになるので 1 の指定が必要になります。
今回、TMP102のADDR0はGNDに繋いでいるため0x48がアドレスになります。画面上でも正しく取得できているのが確認できました。

## 5. node.jsでの温度データの取得

まずは、I2Cから定期的に値を読み込みます。今回は、以下のモジュールを使用しました。

- [i2c](https://www.npmjs.com/package/i2c)

 > $ npm install i2c

詳しいデータフォーマットについては、こちらの[データシート](https://www.sparkfun.com/datasheets/Sensors/Temperature/tmp102.pdf)を参考にしてください。もっと簡単にわからんのかという方は、Arduinoでの例ですが、 [13.Arduinoで測定してみる（13）ディジタル温度センサTMP102<2>](http://www.eleki-jack.com/FC/2011/06/13arduino13tmp102.html) が参考になります。
以下がサンプルコードです。

```app.js
var i2c = require('i2c');

var ADDR = 0x48;
var INTERVAL = 1000;

var sensor = new i2c(ADDR, {device: '/dev/i2c-1'});
readValue = function() {
  sensor.readBytes(0x00, 2, function(err, data) {
    var temp;
    temp = (data[0] << 4 | data[1] >> 4) * 0.0625;
    console.log(temp);
  });
};

setInterval(function() {
    readValue();
},INTERVAL);
```

以下で、I2Cのデバイスとアドレスを指定します。

```app.js
var sensor = new i2c(ADDR, {device: '/dev/i2c-1'});
```

以下で、センサーから２バイトづつデータを取り出します。

```app.js
sensor.readBytes(0x00, 2, function(err, data) {
```

以下で、取得した２バイトデータを温度に変換しています。

```app.js
temp = (data[0] << 4 | data[1] >> 4) * 0.0625;
```
## 6. mobile backendへのアップロード

### 6.1 mobile backend側の準備

これについては、以下が詳しいのでここでは省きます。

[【IoTを実感しよう！】温度センサのデータをクラウドに保存する(node.js×Raspberr pi)](http://qiita.com/fumishitan/items/8abae38db286138f23bf)

以下をすませます。

- アプリの新規作成
- アプリキーの入手
- クライアントキーの入手

### 6.2 コードの作成

コードについても、以下で詳しく説明されているので、ここではTMP102用に改修したコードを記載するだけにとどめます。

[【IoTを実感しよう！】温度センサのデータをクラウドに保存する(node.js×Raspberr pi)](http://qiita.com/fumishitan/items/8abae38db286138f23bf)

改修したコードは以下です。

```temp102.js
var NCMB = require("ncmb");
var i2c = require('i2c');

var ncmb = new NCMB("YOUR_APPLICATIONKEY","YOUR_CLIENTKEY");

var ADDR = 0x48;
var INTERVAL = 60000;

var sensor = new i2c(ADDR, {device: '/dev/i2c-1'});

uploadValue = function() {
  sensor.readBytes(0x00, 2, function(err, data) {
    var temp;
    temp = (data[0] << 4 | data[1] >> 4) * 0.0625;
    console.log(temp);

    var TemperatureClass = ncmb.DataStore("Temperature");
    var temperatureClass = new TemperatureClass();

    var today = new Date();

    temperatureClass.set("temperature",temp);
    temperatureClass.set("date",today);
    temperatureClass.save()
     .then(function(){
      console.log("message is saved.");
     })
    .catch(function(err){
     console.log(err.text);
    });
  });
};

setInterval(function() {
    uploadValue();
},INTERVAL);
```

各自作成したキーで以下の***YOUR_APPLICATIONKEY***と***YOUR_CLIENTKEY***を書き換えてください。

```temp102.js
var ncmb = new NCMB("YOUR_APPLICATIONKEY","YOUR_CLIENTKEY");
```

でもって、

 > $ node temp102.js

で、動作確認。

##最後に

今回は、安価でI2C対応の温度センサーTMP102のデータをmobile backendにアップロードする方法を記載しました。

次回は、[ToCoStick](http://tocos-wireless.com/jp/products/TWE-Lite-USB/)か[XBee](http://www.digi-intl.co.jp/products/wireless-wired-embedded-solutions/zigbee-rf-modules/zigbee-mesh-module/)を使った例について書こうかと思っています。