この記事は、2023年の M5Stack アドベントカレンダー の 3日目の記事です。
はじめに
以前の記事でLoRaWANゲートウェイを設置し、LoRaWANへの接続方法を検証しました。
- LoRaWANを試す - ゲートウェイ編
- LoRaWANを試す - デバイス編
いよいよ本題(?)、M5StackでLoRaWANに接続してみます。
準備
今回はこのGroveユニットを使ってLoRaWANに接続します。商品ページの写真は古いですが、現在は技適マークもついていて国内で安心して利用することができます。このGroveユニットをM5Stackとシリアル接続します。M5Stackについている赤いGrove端子はI2Cでの利用が推奨されていますが、シリアルでも利用することができます。
AWS IoTのデバイス登録
LoRaWANを試す - デバイス編 同様、ABPで接続します。
- DevEUIはプログラムを実行すると取得して表示します。
- NwkSKey、AppSKeyは固定で設定しています。下記のATコマンド仕様によると、デフォルトは「2B7E151628AED2A6ABF7158809CF4F3C」とのこと(34/58ページ)
プログラム
ソースは こちら です。
M5Stackには標準でLoRaWAN用のライブラリーLoRaWanが含まれていますが、今回は標準のライブラリーに含まれていないRTCの操作、温度の取得などのATコマンドを実行したいので、こちらの andresoliva/LoRa-E5 ライブラリーを利用します。
AS923が指定できなかったり、使ってみるとデフォルトのタイムアウトでは短かったり、するので少し調整しています。
工夫した点としては、後述しますが、Groveユニットのフレームカウンター(ATコマンド仕様書ではUplink Counterと記載)がリセットされると0にリセットされるので、M5StackのPreferenceに最終のフレームカウンターを保存して、起動時に読み込むようにしています。
また、起動直後にWiFimanagerを利用してWiFi接続し、ntpでM5Stackのrtcを時刻同期した後、Grove-Wio-E5のRTCに時刻を書き込んで時刻合わせするようにしています。
1分間隔でバイナリーデータを送信するのと、BtnAを押すと温度を取得して送信します。
実行
1分間隔で、Wio-E5チップないの温度センサーの温度を取得して送信します。
AWS IoTのMQTTテストクライアントを利用してトピックをサブスクライブすると、次のように表示されます。PayLoadDataに送信された情報はBase64エンコードされているので、WebなどでBase64デコードすると、送信したJSON文字列が確認できます。
気づいた点
シリアル接続して、ATコマンドで操作できるので、非常に簡単に接続することができます。まだ、あまり使い込んでないですが、以下の点に気づいているので、今後確認していこうと思います。
- データが重複しないようにフレームカウンターがカウントアップされている。AWS IoTでは古いフレームカウンターを受信しない模様。Groveユニットがリセットされると0にリセットされるので、M5StackのPreferenceに最終のフレームカウンターを保存して、起動時に読み込むようにしている。AWS IoTのフレームカウンターの扱いがカスタマイズ可能か?
- データの送信に7秒程度かかっているが、通常なのか? それとも自分の環境が遅いのか?
- ゲートウェイをしばらく停止した後、クライアントからの送信をAWS IoTの受信が再開しないことがある。フレームカウンター絡み?
- ゲートウェイを停止している際、Grove-Wio-E5の戻り値が送信失敗する場合と、見かけ上送信できているように見えるケースがある。
- まだ、OTAA接続できていない
最後に
どこまで離れても通信できるのか!?が気になるところですが、まだ時間が取れず試していません。。