#はじめに
Raspberry Pi 2からニフティさんのmobile backendに、JavaScript SDK Version 2を使ってデータをアップする方法をまとめます。
※なぜ、Raspberry Pi "2"と書いているかといいますと、node.jsのインストール方法が違うからです。
アップするデータは、TMP102から取得した温度データです。
TMP102は、I2Cという方式でセンサーからデータを読み込みますので、そのあたりの設定も行います。
#参考ページ
以下にいろいろな情報があります。
特に今回では以下を参考にさせてもらいました。
#環境
今回、使用した環境は以下です。
項目 | 内容 |
---|---|
ハードウェア | Raspberry pi 2 Model B |
SDカード容量 | 8GB |
OS | RASPBIAN JESSIE September 2015 |
node.js | 0.12.7 |
#さて、はじめよう
大まかな流れは以下になります。
- OSのインストール
- node.jsのインストール
- SDKのインストール
- Raspberry piでのI2Cの有効化
- node.jsでの温度データの取得
- mobile backendへのアップロード
以下で、順番に手順を記載しておきます。
##1. OSのインストール
手順については、母艦のOS毎に多くのサイトで取り上げられているので、ここでは省略します。
##2. node.jsのインストール
現状、Raspberry pi用に用意されたパッケージは2では動かないそうなので、ソースからコンパイルします。
ソースは、ここから取得します。
最新は4系ですが、今後使うライブラリがまだサポートされてない可能性が高いので、0.12.xを使用します。現時点で最新の0.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に1時間半ほどかかります)
$ cd v0.12.7/
$ ./configure
$ make
$ sudo make install
##3.SDKのインストール
npmをつかってSDKをインストールします。(6分ほどかかります。)
$ 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
すると設定メニュー画面が表示されますので、8 Advanced Optionsを選びます。
すると、I2Cを有効にするかを聞いてくるので、YESを選びます。
次の画面では、I2Cのモジュールを標準で読み込むかを聞いてきます。今後、常につかうことになると思うので、YESを選びます。
ここで一回再起動します。
4.2 I2Cの動作確認
まず、TMP102を接続します。
I2Cなので接続は4本。
TMP102側 | ラズパイ側 | pin |
---|---|---|
GND | GND | 6 |
SCL | SCL1 | 5 |
SDA | SDA1 | 3 |
V+ | 3.3v | 1 |
あと、TMP102は、ADD0ピンでI2Cのアドレスを指定します。V+につなげば0x49、GNDにつなげば0x48になります(こちら参照)。今回はGNDにつなげました。
次に、I2Cのモジュールが有効になっているかをlsmodで確認します。
$ lsmod
i2c_bcm2708と、i2c_devが表示されていることを確認します。
(もしも表示されていない場合は、再度raspi-configで設定しなおしてみてください)
最後に、TMP102が正しく接続され、認識されているかを確認します。
その目的でi2cdetectを使用するため、i2c-toolsをインストールします。
$ sudo apt-get install i2c-tools
そして、
$ sudo i2cdetect -y 1
パラメータの 1 は忘れないようつけてください。
Raspberry piは2つのi2cのバスをもっており(0と1、i2cdetect -l で確認できます)、今回接続したピンは2つめになるので 1 の指定が必要になります。
今回、TMP102のADDR0はGNDに繋いでいるため0x48がアドレスになります。画面上でも正しく取得できているのが確認できました。
5. node.jsでの温度データの取得
まずは、I2Cから定期的に値を読み込みます。今回は、以下のモジュールを使用しました。
$ npm install i2c
詳しいデータフォーマットについては、こちらのデータシートを参考にしてください。もっと簡単にわからんのかという方は、Arduinoでの例ですが、 13.Arduinoで測定してみる(13)ディジタル温度センサTMP102<2> が参考になります。
以下がサンプルコードです。
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のデバイスとアドレスを指定します。
var sensor = new i2c(ADDR, {device: '/dev/i2c-1'});
以下で、センサーから2バイトづつデータを取り出します。
sensor.readBytes(0x00, 2, function(err, data) {
以下で、取得した2バイトデータを温度に変換しています。
temp = (data[0] << 4 | data[1] >> 4) * 0.0625;
6. mobile backendへのアップロード
6.1 mobile backend側の準備
これについては、以下が詳しいのでここでは省きます。
【IoTを実感しよう!】温度センサのデータをクラウドに保存する(node.js×Raspberr pi)
以下をすませます。
- アプリの新規作成
- アプリキーの入手
- クライアントキーの入手
6.2 コードの作成
コードについても、以下で詳しく説明されているので、ここではTMP102用に改修したコードを記載するだけにとどめます。
【IoTを実感しよう!】温度センサのデータをクラウドに保存する(node.js×Raspberr pi)
改修したコードは以下です。
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を書き換えてください。
var ncmb = new NCMB("YOUR_APPLICATIONKEY","YOUR_CLIENTKEY");
でもって、
$ node temp102.js
で、動作確認。
##最後に
今回は、安価でI2C対応の温度センサーTMP102のデータをmobile backendにアップロードする方法を記載しました。