前回、Spresenseを使ったエッジAIにて、植物の異常(水不足)を検知し、LINE BOTにて通知するところまで制作しました。
目次
なぜ、LoRaWANなのか?
Spresenseとクラウド間の通信にはSigfoxを利用していましたが、今回はLoRaWANを利用します。
その主な理由は、Sigfoxの下り通信(Downlink)は1日4回までに制限されているためです。よって、デバイスに何かデータを送信する場合には、同じ間隔の設定にすると6時間間隔でDownlinkすることになります。今回の植物の給水の場合には6時間間隔でも問題ないのですが、他のケースの場合には頻回にDownlinkを行いたい場合もあります。そのため、LoRaWANのDownlinkを利用してみます。
また、基本的にSigfoxやLoRaWANのDownlinkは、Uplinkに対する応答としてDownlinkデータを受信することになります。クラウド側の操作をトリガーにして、デバイスにデータを送信することはできません。(LoRaWANのClass Cを使えば可能かもしれませんが消費電力が増加すると思われます)
LoRaにはLoRaWANとPrivateLoRaがあります。これらの違いは過去記事をご覧ください。PrivateLoRaの方が簡単に使えますが、弊社ではTTN YazuというLoRaWANの基地局(ゲートウェイ)を屋上に設置しているので、LoRaWANを利用します。
機材について
今回は下記の機材を利用します。
- Arduino MKR WAN 1310
https://www.switch-science.com/catalog/7385/ - GSM用ダイポールアンテナ(Arduino MKR WAN 1310用)
https://www.switch-science.com/catalog/7386/ - M5Stack用 水分測定センサ付き給水ポンプユニット
https://www.switch-science.com/catalog/6913/
システム概要
概要というかこれが全てなのですが、
(0)エッジAIからLINEに水不足を通知。
(1)LINEに特定のメッセージ(今回は「水」)を入力。
(2)LINE Messaging APIからNode-REDにメッセージ送信。
(3)Node-REDからLoRaWAN(TTN:The Things Network)のMQTTに給水開始コード送信。
(4)デバイスからLoRaWAN(TTN)にデータ送信(Uplink)する応答としてMQTTから給水開始コード受信。
(5)給水ポンプ稼働
はまりポイント
今回利用したMKR WAN 1310は、Arduino IDEのサンプルスケッチのままではDownlinkが動作せず1日悩みました。
解決策としては、modem.joinOTAA()実行後に modem.dataRate(3)を行うと、Downlinkが成功しました。Uplink後にdelay()も入れています。
他のDRの場合はどのような動作になるかは検証できていません。
まとめ
今回はデバイスとクラウド間の通信にLoRaWANとTTNを利用したため、通信も含めランニングコスト0円にすることができました。LoRaWANは仕様としては頻回に通信することも可能ですが、1台のデバイスが通信し続けると他のデバイスが通信できなくなるため、ある程度、間隔をあけて通信する必要があります。
余談ですが、LoRaのモジュールで以前から使っていたESEL ES920LRというのがあり、ファームウェアを書き換えることで、Private LoRaでもLoRaWANでも利用できたのですが、今回後継機種のES920LR3を購入したところ、「プライベートLoRaのみ」に変更されていました。メーカーに問い合わせたところ、LoRaWANは普及していないため今後も対応する予定はないとのことでした。残念です。