SORACOM AirとRaspberry Piを接続しつつMilkcocoa FreeBoardと連携しました

Posted: / Tags: SORACOM_Air Raspberry_Pi Node.js



最近、Raspberry PiにSORACOMを認識させてみる | IoTニュース:IoT NEWS、こちらの記事を拝見しまして、SORACOM Airを、Raspberry PiとFS01BU(FUJISOFT)でつなぐことが出来ました。

さっそく、SORACOM AirをつないだRaspberry PiとlittleBitsの光センサーモジュール+Arduinoモジュールと連携して照度を記録しつつ、Milkcocoa freeboardと連携できたので、その使い心地をレポートしたいと思います。

今回のやりたいこと

今回のやりたいことは「光センサーで照度を計測しMilkcocoaに記録しつつMilkcocoa freeboardで見れるようにする」です。

milkcocoa_soracom_1.jpeg

littleBitsで光センサーモジュールとArduinoモジュールで照度を計測し、その照度データをRaspberry Pi上でNode.js(serialport)が読み取ります。つづいて、Raspberry PiがSORACOM Airでネットワーク接続できるようにすれば、Milkcocoaへ照度データを記録できます。そして、今回はMilkcocoa freeboardで照度データを確認してみます。

milkcocoa_soracom_2.png

Arduinoモジュールは5秒毎に照度を送信するようにしています。

LightSensorInput.ino
int sensorPin = A0;   // littleBitsA0ポートを示す
int sensorValue = 0;   // センサーの値記録変数

void setup() {
  // 入力のピン
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // 値の読み取り
  sensorValue = analogRead(sensorPin);
  // NodeJS(node-serialport)側に通知
  Serial.println(sensorValue);
  // 5000ミリ秒(5秒)ごとに通知
  delay(5000);
}

littleBits部分のしくみ

littleBits部分の光センサーモジュールとArduinoモジュールで照度を計測しRaspberry Piに伝えています。

milkcocoa_soracom_3.png

また、状態が分かりやすいように光センサーモジュールとArduinoモジュールの間に、バーグラフモジュールを入れて明るさの状態がわかりやすくしています。なにより見た目がキレイですね。

milkcocoa_soracom_4.jpeg

Raspberry Pi部分のしくみ

Raspberry PiでSORACOM Airでネットワーク接続できるようにするのは、以下の記事でとても役に立ちました。

ですが、USB認識させる流れなど、多少てこずったところもあるので、よろしければ補足した私の記事もご参考ください。

Raspberry PiでlittleBitsからきた照度データを読み取りMilkcocoaに記録する部分はこのようになっています。

milkcocoa_soracom_5.png

Node.jsのコードは以下のようになっています。

localhost.js
// express
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var os = require('os');

var MILKCOCOA_APP_ID = "    接続したいAPP_ID    ";
var MILKCOCOA_DATASTORE_ID = "lightsensor_data";

console.log("MILKCOCOA_APP_ID:" + MILKCOCOA_APP_ID);
console.log("MILKCOCOA_DATASTORE_ID:" + MILKCOCOA_DATASTORE_ID);

// NodeJS起動時に自分のネットワーク状態を調べる
// まだMilkcocoaには送らない
console.log("os.networkInterfaces");
console.log(os.networkInterfaces());

// milkcocoa /////////////////////////////////

var MilkCocoa = require("./node_modules/milkcocoa/index.js");
var milkcocoa = new MilkCocoa(MILKCOCOA_APP_ID + ".mlkcca.com");
// dataStore設定
var sampleDataStore = milkcocoa.dataStore(MILKCOCOA_DATASTORE_ID);
// データがpushされたときのイベント通知
sampleDataStore.on("push", function(datum) {
    // 内部のログ
    console.log('[push complete]');
    console.log(datum);
});

// Server ////////////////////////////////////

app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/public'));

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

app.listen(app.get('port'), function() {
    // サーバー起動時にMilkcocoaにネットワーク状態を送る
    var networkInterfaces = os.networkInterfaces();
    sampleDataStore.push(networkInterfaces);
    // こちらは通常の起動したログを出す
    console.log("Node app is running at localhost:" + app.get('port'));
});

// root
app.get('/', function(request, response) {
    response.send('Hello Milkcocoa!');
});

// Serial Port ///////////////////////////////

var serialport = require('serialport');
var portName = '/dev/ttyACM0';
var sp = new serialport.SerialPort(portName, {
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false,
    parser: serialport.parsers.readline("\r\n")
});

// シリアルポート入力からのMilkcocoaへのデータ送信
sp.on('data', function(input) {
    var sensorData = new Buffer(input, 'utf8');
    try {
        console.log('sensorData: ' + sensorData);
        sampleDataStore.push({ sensorData : sensorData });
    } catch(e) {
        return;
    }
});

照度データを読み取りMilkcocoaに記録する以外に、通信が成立した際に、ネットワーク情報を送ることで疎通を確認しやすくしています。

milkcocoa_soracom_18.png

接続してみる

ということで、Raspberry Pi上でSORACOM Airでネットワーク接続を行います。

milkcocoa_soracom_6.png

さきほどのNode.jsサーバーも起動できました。

milkcocoa_soracom_7.png

Milkcocoaにも照度データが記録されています!

milkcocoa_soracom_8.png

なお、今回は手動で接続を行いましたが、毎度行うのは大変です。ですので、RaspberryPiでLXDE(GUI OS)の起動時に自動で動作して手間を少なくするのも手です。私も試してみた記事を書いたので、よろしければご参考ください。

Milkcocoa FreeBoardで表示してみる

さて、照度データを記録したはよいものの、さらに分かりやすくするには、データを可視化する「ひと手間」が必要でしたが、最近Milkcocoaの管理画面はFreeBoardという気軽に見える化できるオープンソースライブラリと連携できるようになったということで試してみます。

早速、データ可視化(β版)というボタンをクリックして表示してみます。

milkcocoa_soracom_9.png

DATASOURCESからADDを押して監視するデータを追加します。

milkcocoa_soracom_10.png

TYPEはMilkcocoaを選択。

milkcocoa_soracom_11.png

今回のデータはlightsensor_dataだったので設定します。

milkcocoa_soracom_12.png

無事登録されました。

milkcocoa_soracom_13.png

つづいて、表示するグラフを設定します。ADD PANEをクリックします。

milkcocoa_soracom_14.png

今回はSparklineという全体の傾向をざっくり把握したい時に使う折れ線グラフを設定します。

milkcocoa_soracom_15.png

VALUEは先ほど監視対象にしたDATA SOURCESのlightsensor_dataのデータを指定します。

milkcocoa_soracom_16.png

待っていると、しっかり折れ線グラフが表示されていました。

milkcocoa_soracom_17.png

いずれしっかりグラフを作る必要があるとしても、こうやってひとまず気軽にグラフが見れると、センサーの調子やグラフを作りこむ前にデータの雰囲気が把握できるので、なんともありがたい機能ですね!現在はベータ版ということですがとても良いので、早く正式版になるとうれしいです。

おわりに

SORACOM Airでセンサーデータを送信してみましたが、さすがはIoTに特化したデータ通信サービスですね。この程度のデータと送信頻度であれば、特に気になることもなくMilkcocoaにサクサクデータを送ることが出来ました。今回は5秒間隔でしたが、もうすこし送信頻度を細かくしたり、データ量を大きくしても行けそうな感触があるので、また試してみたいと思います。

たしかに現在、このようなセンサーデバイスのデータ送信にWifi環境を利用して通信を行う場合も多いです。

しかしWifiは状況によりネットワークが不安定だったり遮蔽物の兼ね合いや同時接続数の問題などもあり不安な面はあります。そこで今回のSORACOM Airの実現するLTE/3G モバイルデータ通信という選択肢も加わると、場合によってはWifiよりも自由に設置場所を考えられたり、Wifiよりも安定した通信環境で使えるケースもあり、可能性が広がりますね。

よろしければ、今回の記事を参考にSORACOM Air+Raspberry PiでMilkcocoaを体感してみてください。

Milkcocoa Advent Calendar 2015の次(10日目)の記事は、hyakusonさんTweetボタンのTweet数表示をMilkcocoa使って再現しようです!


記事内で次の画像を加工・使用しています: "Raspberry Pi Vector Illustration" by Jonathan Rutheiser - Own work. Licensed under CC BY-SA 3.0 via Wikimedia Commons.