<目的>
近年データの見える化、働き方改革、IoTというバズワードが広がっている。特に最近
では、データの見える化というものは、野外に広がっている。野外にエッジデバイスを
設置する際に考慮しないといけないことは、通信の確保、電源の確保である。
今回はその二つを同時に解決すると考えられている、LoRaWANを接続する実験を行った。
特にLoRaWANはBLEやwi-fiに比べ速度は遅いが通信距離が長く、消費電力も抑えられるので
比較的スピードが求められない屋外でのセンシングでの使用に向いていると考えられる。
そこで今回はLoRaWANの変調方式を理解する、色々なデータ形式を扱うことを目的に
下記の実験を行った。
<理論>
LoRaWANとはLoRa変調を利用したWide Area Networkのことである。
つまりLoRaWAN規格は、LoRa変調技術の規格ではなく、無線通信ネットワークの規格である。
この辺りは混同しやすいので、注意が必要である。
ここで、LoRaWAN技術の特徴についてまとめる。
・長距離通信が可能である
・距離に応じてデータレートを変えることにより、通信速度と受信感度を調整できる
・低消費電力である
・双方向の通信が可能である
・位置測定が可能である(条件を満たす必要があるが分解能は低い)
<使用機器>
LoRa shieled for Arduino
Arduino UNO
macbookpro
senseway gateway
<実験方法>
ArduinoIDEに使用するライブラリのインストール
データを作成して送信する
MQTT受信
必要なデータの取り出し
データの変換
ライブラリのインストール
今回はKiwi Technology社の提供するライブラリを利用した。https://github.com/askn37/LoRaWAN_TLM922S
通常のArduinoのライブラリと同じように
zipアーカイブをダウンロードしてライブラリマネージャで読み込んだ。
必要があればMultiUART https://github.com/askn37/MultiUARTのライブラリもインクルードしておく。
今回はカウントアップデータを送信する実験を行ったのでライブラリを利用したサンプルスケッチを下記に示しておく。
/*************** * * CommandSample - TLM922S-P01A command sample for Arduino * * target architectures: Atmel AVR (ATmega 328P, 1284P and other) * * release site: https://github.com/askn37/LoRaWAN_TLM922S * maintainer: askn https://twitter.com/askn37 * */ #include <Arduino.h> #include "LoRaWAN_TLM922S.h" #define TX_PIN 12 // D12 O to I TLM_MISO/RX(12) #define RX_PIN 11 // D11 I to O TLM_MOSI/TX(11) #define WAKE_PIN 7 // D7 O to I TLM_INT2/WakeUp/~Sleep(7) #define SET_DR 2 // DRを2に設定する #define LORAWAN_BAUD 9600 //ボーレートを9600に設定 #define CONSOLE_BAUD 9600 int n=0; //テスト用ダミーカウントデータ char pubMessage[128]; //pubMessageのメモリを確保 LoRaWAN_TLM922S LoRaWAN(RX_PIN, TX_PIN); //lorawanのセット void setup (void) { lora_setup(); } void loop (void) { lora_loop(); } void lora_setup(){ while (!Serial); //serialportが開くのを待つ Serial.begin(CONSOLE_BAUD); //ボーレート9600でポートを開く Serial.println(F("Startup")); LoRaWAN.begin(LORAWAN_BAUD); while (!LoRaWAN.getReady()) delay(1000); while (!LoRaWAN.factoryReset()) delay(1000); Serial.println(F("try join otaa")); while (!(LoRaWAN.join(JOIN_OTAA) && //lorawanが接続するのを待つ LoRaWAN.joinResult())) delay(1000); // Serial.println(F("accepted")); // DR値を設定する LoRaWAN.setDataRate(SET_DR); //DRの設定、今回はDR3 Serial.print("setDataRate:"); Serial.println("DR=2"); } void lora_loop(){ n++; if (LoRaWAN.tx(TX_CNF, 1)) { Serial.print(F("test")); sprintf(pubMessage,"count%d",n); Serial.println("pubMessage"); LoRaWAN.txData(pubMessage); //payloadの構築 if (LoRaWAN.txRequest() && LoRaWAN.txResult()) { Serial.println(F("tx_ok")); //送信成功したら表示 } else { Serial.print(F("error:")); Serial.println(LoRaWAN.getResult()); } } delay(10000); }
今回はMQTTの受信にはMQTT-clientサーバーを利用せずにnode-redサーバーを利用した。
node-redサーバーの作成法は過去記事を参考にしてください。
node-redのフローを作成した。
node-redのMQTTノードでサーバーはセンスウェイのものを使用するので、mqtt.senseway.netを入力しポートは
初期設定のまま1883を使用する。セキュリティ情報はセンスウェイ のユーザー名とパスワードを入力し、
トピックはセンスウェイのフォーマットに従い lora/<user name>/<devEUI>rxを指定した。
受信したデータから必要なデータを取り出す方法。
受信した情報は下記のようになっている
受信フォーマットの説明
今回は受信したデータをJSONとして取り扱いメタ情報は無視して、payload部分を取り出した。
具体的には図に示すようにJSONノードを用意してJSONに変換し、functionノードを利用してpayloadを取り出すスクリプトを記述した。
記述したスクリプトを下記に示す。
var data = msg.payload.mod.data; msg.payload= {data} return msg;
(センスウェイを利用してlora通信をした場合にはnode-redに用意されているsensewayノードを使用すると簡単にデータ部分が利用できるので楽である。)
今回の送信試験では文字列を16進数にエンコードして送信したので、受信したものを確認する際にはデコードが必要であるので
functionノードを使用してデコードのためのスクリプトを記述した。
記述したスクリプトを下記に示す。
var data =msg.payload.data; var str; var hex = data.toString(); var str = ''; for (var i = 0; i < hex.length; i += 2) str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); msg.payload={ str } return msg;
結果
送信したダミーデータを受信して、受信したデータをデコードできた。
DR3を使用時データを送信してからAckが戻ってくるまでに実測値で10秒強かかった。
また一定の確率でOTAAが失敗して、通信ができないことがあった。
屋内用のゲートウェイでも数百メートルは通信できることがわかった。条件を整えればまだ距離は伸びると考えられる。
考察
lpwaならではの通信スピードの遅さ、データ量の少なさ、通信が失敗した時の対応を考えておく必要がある。
また外部環境の諸条件によって通信距離が変わることが容易に考えられるので、環境を変えての実験を行い、通信の特性
を掴んでおく必要性があると考えられる。
IoTネットワークLPWAの基礎 鄭立 著2017年6月12日 第一版第1刷発行 株式会社リックテレコム
日経エンジニアスクール IoT最強の指南書 2018年5月21日発行 日経BP社