Edited at

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

More than 3 years have passed since last update.


はじめに

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


さて、はじめよう

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


  1. OSのインストール

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

  3. SDKのインストール

  4. Raspberry piでのI2Cの有効化

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

  6. 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


i2c_001.jpg

すると設定メニュー画面が表示されますので、8 Advanced Optionsを選びます。

i2c_002.jpg

次の画面では、A7 I2Cを選びます。

i2c_003.jpg

すると、I2Cを有効にするかを聞いてくるので、YESを選びます。

i2c_004.jpg

有効になったことを知らせる画面が表示されます。

i2c_005.jpg

次の画面では、I2Cのモジュールを標準で読み込むかを聞いてきます。今後、常につかうことになると思うので、YESを選びます。

i2c_006.jpg

有効になったことを知らせる画面が表示されます。

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


4.2 I2Cの動作確認


まず、TMP102を接続します。

接続はこんな感じになります。

TMP102_RASPI.jpg

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_010.jpg

i2c_bcm2708と、i2c_devが表示されていることを確認します。

(もしも表示されていない場合は、再度raspi-configで設定しなおしてみてください)

最後に、TMP102が正しく接続され、認識されているかを確認します。

その目的でi2cdetectを使用するため、i2c-toolsをインストールします。


$ sudo apt-get install i2c-tools


そして、


$ sudo i2cdetect -y 1


i2c_011.jpg

パラメータの 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> が参考になります。

以下がサンプルコードです。


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'});


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


app.js

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


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


app.js

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)

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


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_APPLICATIONKEYYOUR_CLIENTKEYを書き換えてください。


temp102.js

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


でもって、


$ node temp102.js


で、動作確認。


最後に

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

次回は、ToCoStickXBeeを使った例について書こうかと思っています。