CayenneLPPが使えると、とっても楽チンなコト
先日、LoRaWAN 界隈では、少し熱いニュースがありました。 なんと、スイッチサイエンス社から、待望の LoRaWAN 対応の Arduino ボード Arduino MKR WAN 1310(以降、MKR1310)が正式に発売されたのです。
Arduino MKR シリーズ、スイッチサイエンスウェブショップで 2021 年 8 ⽉ 6 ⽇販売開始
以前から、MKR1310 は、Arduino 公式サイトでも販売されておりますが、スイッチサイエンスさんが公式に発売してくれるのは大変ありがたい話です。 いわゆる「技適」を取得済みのボードでありますから、安心して利用できます。
MKR1310 は Arduino ボードなので、LoRaWAN のオリジナルセンサーノードを手元で手軽にいつもの慣れた Arduino IDE 系環境で開発ができてしまうわけです。これは、LoRaWAN マニアでなくても飛びついてしまうのでしょうか?
今回は、LoRaWAN センサーノードをプロトタイプ開発する際に、無くてはならない非常に便利な仕組みCayenneLPPと、それを活用した MKR1310 上でのファームウェア開発の骨子をご紹介したいと思います。
1. CayenneLPP とは?
物質的豊かさを謳歌してきた世代・人にとっては、何やらドイツ風味の自動車のことか?と思うかもしれませんが、あれとは全く別物です。
IoT 向けのトータルソリューションを提供する米 myDevices, Inc 社は、IoT プラットフォームCayenneを提供しています。元々は、この Cayenne で、センサーノードからデータを送る場合に、送信データの Payload 仕様を簡単に定義し実行できる環境を提供しているものが、Cayenne Low Power Payload(略して、CayenneLPP)です。
LoRaWAN を含む LPWAN センサーノードは、低消費電力で動作させる必要があります。よって、上位側へ送信するセンサーデータは効率的な形式であることが必須です。この点を考慮し、ファームウェアの実装を簡単に行う上で、この CayenneLPP は、非常に便利で強力なものです。
2. Arduino IDE で CayenneLPP を使う
Arduino IDE で、LoRaWAN センサーノード向けのファームウェアを書くときに、次の手順で、送信データの Payload が出来ちゃいます。
- Arduino IDE で、CayenneLPP ライブラリをインストール
- ソース本体冒頭で、CayenneLPP ライブラリをインクルードし、CayenneLPP クラスのオブジェクトを定義
- ソース本体内、LoRaWAN パケットを送信する前に、CayenneLPP の仕様に基づき、送信する値(温度や湿度など)を、当該オブジェクトのメンバ変数に代入
- その後、LoRaWAN そケットを送信するメンバ関数に、当該オブジェクトのメンバ関数 getBuffer()と getSize()を代入
これだけで、送信データの Payload を作れてしまうという、楽ちん極まりなく嬉しい限りです。
3. MKR1310 で LoRaWAN 用ファームウェアを作る
CayenneLPP と MKR1310 の恩恵を受けることで、LoRaWAN 用ファームウェアのプロトタイプを非常に手軽に作ることが可能です。 ここでは、その骨格部分だけ簡単にご紹介します。
3.1. Arduino IDE で、ライブラリをインストール
- Arduino IDE > ツール > ライブラリを管理… で、MKRWANを検索
- 「MKRWAN」と「MKRWAN_v2」が見つかるので、(今回は)「MKRWAN」をインストール
- Arduino IDE > ツール > ライブラリを管理… で、CayenneLPPを検索
- 「CayenneLPP」(by Electronic Cats)をインストール
3.2. ソース本体冒頭 ライブラリのインクルードとオブジェクト定義
ソース本体冒頭で、MKRWAN と CayenneLPP ヘッダをインクルードします。 同時に、オブジェクトを定義します。
#include <MKRWAN.h>
#include <CayenneLPP.h>
LoRaModem modem;
CayenneLPP lpp(51);'
3.3 LoRaWAN プラットフォームへの Join
LoRaWAN プラットフォームへの Join 処理を、setup()関数で行います。
// LoRaWAN通信モジュールの初期化・対応周波数の設定(日本は、AS923を利用)
modem.begin(AS923);
// プラットフォームへのJoin
modem.joinOTAA(appEui, appKey);
3.3. ソース本体中身 Payload の設定と Packet 送信
例えば、loop()関数本体で、Payload の設定と Packet 送信を行います。 電池電圧(例えば、batV という変数)と温度(例えば、temp という変数)を Payload に設定したい場合は、以下のようになります。
//lppオブジェクトのブッファリセット
lpp.reset();
//Payload、上位から最初の項目として電池電圧(batV)、2つ目の項目として温度(temp)を設定・代入
lpp.addVoltage(1, batV)
lpp.addTemperature(2, temp);
// 送信準備
modem.beginPacket();
// 送信データの設定・代入
modem.write(lpp.getBuffer(), lpp.getSize());
// 送信
modem.endPacket(true);
4. TheThingsStack で送信データ Payload がどう見えるか?
CayenneLPP の恩恵はこれにとどまりません。
LoRaWAN プラットフォームを(一定の条件下で)無償で利用できる世界最大のプラットフォーム The Things Stack Community Edtionは、CayenneLPP に対応しています。
従って、CayenneLPP 仕様で設定された Payload の場合、TheThingsStack では、Uplink データに対するデコーダーを改めて用意する必要はありません。
コンソール画面 > アプリケーション > ペイロードフォーマッター > アップリンク で、フォーマットタイプとして「CayenneLPP」を選択し、保存してください。
これだけで、Payload が想定した通りにデコードされ表示されるようになります。
参考
- CayenneLPP ライブラリについては、提供元の資料が参考になります。
- The Things Stack V3 Community Edtion が日本語化され、V2 同様に気軽に利用できるようになっています。(TTN Japan アンバサダー 吉田さんのブログより)