どうも、CHASUKEです。
長距離・低電力のIoT向け無線通信規格LPWAの1つである『LoRaWAN(ローラワン)』を使って、自宅周辺の温度をセンシングしてみました。
今回は、LoRaWANのIoTプラットフォームを提供しているセンスウェイ社のLoRaWanスターターキットを使って実現しています。その内容や使い方を紹介します!!
CHASUKE
データ通信にBLEやWiFiではなく、LoRaWANを使っているのがポイント!
今回やったのは、温度センサーで得たデータを可視化するという何ともベタな内容。
けれど、LoRaWAN通信が快適に使えるので、温度センサーから、あれこれ好きなセンサーに付け替えて動作が可能になります。
電源が確保できない場所や、WiFiやBLEが届かない場所でIoTセンシングしたいなら試してみる価値ありです。
それでは行ってみましょう♪
LoRaWAN通信で温度計IoTした仕組み
はじめに今回作った温度計IoTの完成形はこんな感じ。
CHASUKE
SenseWay Mission Connectサービスが、デバイスから飛ばしたデータをビュビューっとアプリケーションまで届けてくれる
LoRaWANデバイス
▼データ取得元となる「温度センサ+LoRaWANデバイス」がこちら。
温度センサーやArduino互換機(ケース内下段)、LoRaWANシールド(ケース内上段)は、LoRaWANスターターキットに含まれています。
割り込み処理用にスイッチ(ブレッドボード)を付けてますが、無くても全然問題ない。別途用意するのは電源くらいですね。
LoRaWANゲートウェイ
さて、LoRaWANデバイスからの通信先は「LoRaWANゲートウェイ」です。
センスウェイがゲートウェイを設置し、IoT通信網を全国に構築中とのこと。そのため、利用するには屋内用もしくは屋外用ゲートウェイを自宅やオフィスに設置する必要があります。
▼屋内用ゲートウェイもちゃんとスターターキットに含まれてます。
温度データが屋内ゲートウェイと通信し、そこから先はWiFiルータ経由で、次のセンスウェイLoRaWANサーバに連携されます。
CHASUKE
屋内用ゲートウェイは無線LANでも接続できるので配置を工夫できそうだ
センスウェイLoRaWANサーバ
続いて登場するのが「センスウェイLoRaWANサーバ」です。
これはセンスウェイ社が独自に構築したLoRaWANサーバになります。受け取ったデバイスからのセンサーデータをMQTT、MQTTSによりアプリケーションへ通信してくれます。
CHASUKE
今回は試してませんが、反対にアプリケーションからデバイスへの通信もできます♪
アプリケーション「Node-RED & Ambient」
さてさて、次にアプリケーションです。
ここでは、各種ノードを組み合わせてプログラミングできるNode-REDを使って、データを受け取ります。
CHASUKE
これが本当に便利で、パレットにMQTTノードをペトっと貼るだけ
▼自宅にあるRaspberryPi(ラズパイ)上でNode-REDを稼働させました。
これで、いつでもデータ受け取りOKです。
CHASUKE
せっかくのデータなので、いつでもどこでも見えなきゃ面白くないよね
ということで、無料で使えるIoTデータ可視化サービス「Ambient」でいつでもどこでも温度センサーをグラフで確認できるようにしてみました。
んで、できたのがコレ。
温度センサー値を1分ごとにプロットできています♪
LoRaWANスターターキットについて
センスウェイ社のLoRaWANスターターキットについて、もう少しだけ触れておきます。
キットの内容と初期設定についてです。
キットの内容
このキットがあれば、センスウェイ社のLoRaWANサービス「SenseWay Mission Connect」を使って、IoTデータの収集・検証ができます。
- LoRaWAN Shield for Arduino(6,400円相当)
- Arduino UNO互換機
- LoRaWANゲートウェイ 3年間レンタル(45,000円/年 相当)
- 1アカウント分の接続料金(3年間、接続回数無制限)
- 温度センサー(ADT7410)
- LoRaWANが学べる センスウェイオリジナル教材PDF
- データ取得までのメールサポート
無制限接続料金とゲートウェイレンタルが3年間利用できて、32,400円。LPWAに興味のある個人だけでなく企業や大学の研究にもちょうど良いですね。
▼こちらがArduino UNO互換機です。
MACにインストールしたArduino IDEで問題なく使えます。
▼LoRaWAN通信が可能になるArduino専用シールドです。
Arduinoに上に被せて使います。
DevEUIとPINコードが同封されており、SenseWay Mission Connectにデバイス登録して利用します。
▼これが、屋内用ゲートウェイです。
無線LANで接続できる(※マニュアル参照)ので、設置場所には困らない。こちらもSenseWay Mission Connectにゲートウェイ登録して利用します。
CHASUKE
おそらくここに貼るべきステッカーも同封されてたよ
キットの初期設定
サービスの利用には、SenseWay Mission Connect(リンク)にデバイス登録が必要です。
今回はスターターキットなので不要ですが、個別で利用するならLoRaWANゲートウェイをココからレンタル申請できます。また、LoRaWANデバイスはAmazonなどで購入します。
SenseWay Mission Connectの利用マニュアルはこちらに揃ってます。
CHASUKE
操作画面付きのマニュアルが非常に参考になった
▼マニュアル通りやって、LoRaWANデバイスとゲートウェイが無事に登録された!
さて、これで初期設定は終わり。
いよいよ実装していきます。
LoRaWAN通信で温度計IoTの実装
準備が揃ったので、センサーデータをLoRaWAN通信で連携し、Web上でグラフ化していきます。
仕組みのところで書いた通り、LoRaWAN通信は「SenseWay Mission Connectサービス」が上手いことやってくれるので、実装は以下だけ。
- LoRaWANデバイスの実装
- Node-REDでデータ受信・Ambient送信
LoRaWANデバイスの実装
こちらはArduino IDEを使ってプログラミングしていきます。
センスウェイ社の技術スペシャリストが開発した「KashiwaGeeks」というライブラリを使えば、簡単にLoRaWAN通信ができました。これはマジで便利なやつです。
GitHubからZIPファイルをダウンロードし、Arduino IDEメニューからライブラリをインストールして使えます。
ちなみに、KashiwaGeeksの使い方は、スターターキットに同封される「LoRaWANが学べるセンスウェイオリジナル教材ハンズオン」にある程度が記載されている。なので、初めての人でも十分挑戦できます。
CHASUKE
データ取得までのメールサポート付きなのも安心材料♪
テスト通信できるプログラム(スケッチ)がこちら
実装していく前に、KashiwaGeeksライブラリのスケッチ例を使って、デバイス登録が正常にされLoRaWAN通信ができているかをテストできます。
▼スケッチ例から「End-node_Sample」を開きます。
デバッグ用にツールからシステムモニタを「57600bps」で開いてから、デバイスにスケッチを書き込みます。
ジャンパーピンで繋げているのは割り込み処理用のスイッチ。
サンプルスケッチでは、1分ごとに固定のダミーデータが送信されています。途中にある「EnableInt0()」をアンコメントして、スイッチをポチッとすれば、ダミーデータを即時に送信するようになってます。
残念ながらスイッチは同封されてないが、もしあればお試しを。
▼システムモニタに「SUCCESS」と表示されれば成功ですね。
20:45:31.661 -> **** End-node_Sample *****
20:45:33.017 -> try to join... accepted.
20:45:43.220 ->
20:45:43.220 -> _/_/_/ KashiwaGeeks 0.10.3 _/_/_/
20:45:43.220 ->
20:45:43.220 ->
20:45:43.220 -> Task1 invoked
20:45:43.220 ->
20:45:43.220 -> Temperature: 1020 degrees C
20:45:43.220 -> %RH: 2020 %
20:45:43.220 -> Pressure: 5005 Pa
20:45:43.254 ->
20:45:43.254 -> Send =>lorawan tx ucnf 12 03fc07e40000138d<=
20:45:46.330 ->
20:45:46.330 -> Recv =>lorawan tx ucnf 12 03fc07e40000138d
20:45:46.367 ->
>> Ok
20:45:46.367 ->
>> tx_ok
20:45:46.367 ->
> <=
20:45:46.367 ->
20:45:46.367 -> SUCCESS
20:45:47.674 -> LoRa sleep.
このサンプルでは、3つのダミーデータ(温度、湿度、気圧)を関数(task1&task2)の2パターンで送信している。参考になる。
ちなみに「03fc07e40000138d」ってのが送信データなのだが、3つのデータを16進数表記にして文字結合しているので、よくわからない文字列になっている。
温度情報を取得・送信するプログラムがこちら
先ほどはダミーデータを通信していたので、温度センサをArduinoにピン接続して、実際のセンサーデータを通信するようにしました。
付属の温度センサーをジャンパーピンで接続して完了。
接続方法はこんな感じ。
基盤むき出しは心配なのでシールド対応の厚めのケースも取り付けた。また、スイッチ用は小さめのブレッドボードを用意。こちらもキットには同封されてません。
▼最終的に出来上がったスケッチがこちら。
#include <KashiwaGeeks.h>
#include <Wire.h>
#define ECHO true
ADB922S LoRa;
//================================
// Initialize Device Function
//================================
#define BPS_9600 9600
#define BPS_57600 57600
void start()
{
ConsoleBegin(BPS_57600);
// 割り込みを有効にする
EnableInt0();
ConsolePrint(F("\n**** LoRaWAN Sample PG *****\n"));
Wire.begin();
/* setup ADB922S */
if ( LoRa.begin(BPS_9600, DR3) == false )
{
while(true)
{
LedOn();
delay(300);
LedOff();
delay(300);
}
}
LoRa.join();
}
//================================
// Power save functions
//================================
void sleep(void)
{
LoRa.sleep();
DebugPrint(F("LoRa sleep.\n"));
}
void wakeup(void)
{
LoRa.wakeup();
DebugPrint(F("LoRa wakeup.\n"));
}
//================================
// INT0 callbaks
//================================
void int0D2(void)
{
ConsolePrint(F("\nINT0で割り込み発生!!!\n"));
taskTemp();
}
//================================
// Functions to be executed periodically
//================================
#define LoRa_Port_COMP 13
int I2CAdrs = 0x48;
void taskTemp(void)
{
uint16_t val;
float tmp;
int ival;
// 温度センサーでデータ取得
Wire.requestFrom(I2CAdrs, 2);
val = (uint16_t)Wire.read() << 8;
val |= Wire.read();
val >>= 3;
ival = (int)val;
if(val & (0x8000 >> 3)) {
ival = ival - 8192;
}
// 摂氏温度換算
tmp = (float)ival / 16.0;
int16_t uplinktmp = tmp * 100;
int rc = LoRa.sendData(LoRa_Port_COMP, ECHO, F("%04x"), uplinktmp);
checkResult(rc);
Serial.println(tmp, 2);
}
/*-------------------------------------------------------------*/
void checkResult(int rc )
{
if ( rc == LORA_RC_SUCCESS )
{
ConsolePrint(F("\n SUCCESS\n"));
}
else if ( rc == LORA_RC_DATA_TOO_LONG )
{
ConsolePrint(F("\n !!!DATA_TOO_LONG\n"));
}
else if ( rc == LORA_RC_NO_FREE_CH )
{
ConsolePrint(F("\n !!!No free CH\n"));
}
else if ( rc == LORA_RC_BUSY )
{
ConsolePrint(F("\n !!!Busy\n"));
}
else if ( rc ==LORA_RC_NOT_JOINED )
{
ConsolePrint(F("\n !!!Not Joined\n"));
}
else if ( rc == LORA_RC_ERROR )
{
ConsolePrint(F("\n !!!UNSUCCESS\n"));
}
}
//===============================
// Execution interval
// ASK( function, initial offset, interval by minute )
//===============================
TASK_LIST = {
TASK(taskTemp, 0, 1),
END_OF_TASK_LIST
};
CHASUKE
サンプルを参考に温度取得ロジックを混ぜ込んだけ
アプリケーション側の実装
さて、データ受け取り用アプリケーションとして、Node-REDを実装していきます。
Node-REDは、パレット上でノードを繋いでプログラミングできます。様々なノードでデータの受け取りも簡単です。
CHASUKE
IoT検証には使いやすいツール
Node.js環境で動かせるので、今使ってるPCにインストールできます。だが今回は、常時稼働を考えてラズパイでNode-REDを用意してます。
インストールや設定は、ググると沢山でてくるので割愛です。
▼まずは、mqttノードを設定して、受け取りデータをデバッグします。
紫色のmqttノード設定は、高町咲衣さん(IoT女子)のページ参考にさせていただきました。
デバッグエリアにJSON形式で色々な情報が表示されてます。LoRaWANデバイスから飛んでくる情報は以下の通りです。
さて、欲しいデータは「data」にある温度センサー値です。
このデータを取り出して、可視化サービスのAmbientに送信するフローがこちら。
それぞれの設定ですが、jsonノードはそのままなので、functionとAmbientノードのみ。
functionノード
dataの値を取り出して、16進数から10進数に変換しています。
Ambientで扱う「d1」というキー名でOK。
var data = {
"d1": parseInt(msg.payload.mod.data, 16) / 100
}
msg.payload = data;
return msg;
Ambientノード
こちらは、デフォルトで存在しないため、「ノードの追加」をします。
CHASUKE
いとも簡単にノード増やせて機能拡張って素晴らしすぎる
▼「node-red-contrib-ambient」ってやつですね。
▼最後に追加したAmbientノードの設定です。
こちらはAmbient(リンク)で作成したチャンネル設定値をコピペすればOKです。
Ambientの設定はとても簡単なので割愛しますが、無料で1日1440データ(毎分1回/1日)、1年間分を保管してくれます。プライベートや公開グラフの切り替えも簡単です。
Web上で温度グラフを確認!
せっかくなので、WiFiやBLEが届かない、少し離れた場所で温度測定をしてみました。
CHASUKE
設置環境によるが、屋内ゲートウェイで2㎞まで届いた実績があるとのこと
とは言っても、野ざらしはさすがにキツいので、ポストに放り込んでおきました。
屋内モジュールが設置してあるマンション4Fから1Fにあるポストまでそれなりに距離はあります。当然WiFiなんて届きません。
ポストは、金属で覆われた状態なので心配だったのですが、蓋を閉めてもちゃんと1分間隔でデータが飛んできました。
温度の変化が見えますねー。
ちなみにポストの中でも通信可能なら、加速度センサーでIoTポストできますね。是非やりたい。
CHASUKE
ポストチェックを効率化できますな
最後に
センスウェイ社のLoRaWANスターターキットで温度計IoTしてみました。
CHASUKE
とっても長い記事になってしまった..
このスターターキットとライブラリ「KashiwaGeeks」のおかげで、省電力・長距離なLoRaWAN通信を使ってデータ集める系のIoTが簡単にできた。
LPWAやIoTの検証におすすめですね。初心者でも十分使えます!
ということで、LoRaWAN通信が快適に使えるので、あとはセンサー付け替えて遊ぶだけ。
CHASUKE
ワクワクしちゃいますなー