M5Stack社から発売されたCOM.X SigFoxモジュールをKCCS社様から頂いたので色々作ってみます。
PythonやArduinoは全くわからないのでUIFlowのみで作ります。
ちなみに初めて記事書きました。
##何を作るか
手元にM5Stack Core2・GPSモジュール・ENV2ユニットがあるので、
車に乗せて一定時間ごとに、①緯度経度②温度③湿度④気圧をSigFoxで送信し、Ambientに転送する何かを作る。
##やること(出来たら更新する)
- ID・PACを確認する
- SigFoxにDevKitとして登録する
- サンプルメッセージを送る
- Callback,Custom payload configの設定
- Ambientに仮のGPSデータを送り、地図に表示させる
- 送るデータを16進数に変換するUIFlowのプログラムを作る
- GPSモジュールの緯度経度データを16進数に変換してSigFoxで送信する
- 緯度経度・温度・湿度・気圧すべてのデータをn分ごとにSigFoxで送信し、Ambientに表示させる(完成)
##必要な知識
UIFlow
GPSのデータ形式など
16進数
int,uint,float
SigFox Callback
Custom payload config
ATコマンド(SigFox用)
##使用機材
機材 | 説明 | 備考 |
---|---|---|
M5Stack Core2 | 多機能すぎるアイツ | Core2 1.6.5.1を使用しています |
COM.X SigFoxモジュール | Sigfox通信用拡張モジュール | 頂いた(うれしい) |
GPSモジュール | 内蔵アンテナが有るV2の方 | 座標データ取得のために使用 |
Plusモジュール | いわゆるFireボトムのModule版 | バッテリーの為に使用 |
ENV2ユニット | 温度・湿度・気圧を測定できる | 位置で気圧とか変わるので面白そう |
M5Stack Fireも持っているのですが、PSRAMがあるせいで、UARTのポート設定が面倒になるので使用しません。
また、モジュールをつけると元のバッテリーが付けられなくなるので、Plusモジュールからバッテリーを取ります(Batteryモジュールはちょうど売り切れでなかった)。
##GPIOの設定
SigFoxモジュールとGPSモジュールは、両方ともUARTで通信していますが、初期のGPIOポートは両方ともTXD:16・RXD:17になっています(FireはPSRAMで使用しているので使えません!)。
GPSのモジュールはハンダで付いていて変えるのが面倒なので、DIPスイッチで変えられるSigFoxモジュールの方のGPIOを変えます。
すごーく紛らわしいのですが、GPSモジュールやM5Stack FireとM5Stack Core2でGPIOの番号が違います。
上記のTXD:16・RXD:17はCore2でいうとTXD:13・RXD:14になります。
本題ですが、SigFoxのDIPスイッチはTXD:15・RXD:13に設定しました。
UIFlow上ではTXD:19・RXD:2に設定しました(プログラム上では、TXD/RXDを逆にしないといけません。なんでや)。
とりあえず何も起きてないので大丈夫なはず・・・・。
ちなみに、最初はTXDをGPIO5(Core2上ではGPIO33)にしてましたが、I2Cが使えなくなる=ENV2ユニットが使えなくなるのでやめました。
ご丁寧にG32,33はPortAで使用しますよって公式のドキュメントにも書いてあったんですけどね!
##ATコマンドって何?????
昔使われてたやつらしいです。
本当はもっといっぱいコマンドがあるのですが、とりあえず下記の3つさえあればなんとか使えます。
ATコマンド | 内容 |
---|---|
AT$I=10 | デバイスIDを取得 |
AT$I=11 | デバイスPACを取得 |
AT$SF= | メッセージの送信 |
参考記事:Sigfox Shield for Arduino (UnaShield)をATコマンドのみで動かす | |
下の方に書いてあります。 |
##IDとPACを確認して、DevKitとして登録する
IDとPACを確認して、SigFox BuyにDevKitとして登録します。
それによって1年間無料で使用できます!(切れた場合は1年で700円から1200円ほどで利用できる、安い!)
登録の仕方は下記のわかりやすーい参考記事を見てもらうことにして、UIFlowの方を作っていきます。
こんな感じですかね。
Aボタンを押すとIDとPACがWaitingの部分に表示されます。
時間表示とLEDはおまけです(フリーズしてないかどうかの確認用です)。
参考記事:Sigfox Devkit(開発キット)を1年間の無償回線で利用する
参考記事2:[個人の方]Sigfoxデバイスのトークン切れの時
##サンプルメッセージを送る
送れるメッセージは、最大12Byteのデータ(16進数です)のみです。
つまり、0123456789ABCDEF
のみで、文字数で言えば24文字まで送れます。
例: AT$SF=077edcab1d1a310c193103ce
ただし、4bit(要は文字数が奇数になる場合)はParse Errorが出て送れません。最初に0を入れるなりしましょう。
どこにも書いてなかったので結構迷いました。
だめな例: AT$SF=3CE \\\ERROR : Parse Errorになる
⇓
直した: AT$SF=03CE \\\10進数で974
ということでUIFlowでサンプルメッセージを送る所を作っていきます。
増えたのはLoopの部分と、Bボタンを押したときの挙動ですね。
dataは実際に送ったメッセージ(ここではAT$SF=077EDCAB1D1A310C193103CE
が表示されます)
messageは、送信してしばらくするとOK
や、Error :Parse error
などのメッセージが表示されます。
Parse errorはすぐ表示されるのですが、送信できたときのメッセージOK
はすぐ出ないので、IF文で帰ってきたときに表示みたいな
感じにしています。
参考記事:メッセージ送信方法 - Sigfox Shield for Arduino
下の方に書いてあります。
##Callback,Custom payload configの設定
この2つは、参考記事1~3を何回も読んで理解しました。
要するに、Callbacksは他のサービスへの橋渡し、Custom payload configは送信するために16進数に変換した数字をもとに戻す(10進数とかASCIIとか)機能です。
CallbacksのBodyは参考記事4を丸パクリ参考にしました。
だってわかんないんだもん・・・!
最初の32bit分は緯度、その後の32bit分は経度、次の8bitは温度・・・みたいな感じで勝手に変換してくれます。
なお、d9,d10が緯度,経度になります。それかlat,lngでも指定できます(今回は別の理由で後者を選びました)。
ちなみにですが、送信したビット数とCustom payload configで変換するビット数があっていないとNullを送信するようです。
実際にCallbackした結果。見事にぬるぬるぬるぬる
うまく変換できるとこんな感じになります。上がCallbackでAmbientに送ったメッセージ、下はPayload Displayで設定したやつです。
参考記事1:Sigfox Callback機能
参考記事2:Sigfox Callback - Custom Payload Config機能
参考記事3:Sigfox Callback - Custom Payload Config 応用
参考記事4:Sigfox+Arduino+phMeter+AmbientでIoT
##ここで問題発生
こんな感じで仮のデータをSigFoxで送信し、Callbackを経由して、Ambientに送信することは出来たのですが、
緯度経度のデータはどうやらミリ秒単位では認識してくれないようでなんだかよくわからないところを指してしまうようです。
上の3つがそうです。どこだよここ・・・!
見た感じ、DEG表記のみしか受け付けてくれないようです。下の左側は大阪のどっかの山で、右のは
"lat": "1.25754536E8", "lng": "4.88255744E8"
で送ってますが、後ろのE8が無視されて緯度1.25754536経度4.88255744になっちゃってます。
d9,d10でデータが登録できなかったのですがこれが原因のようです。
さぁさらにここでも問題が。
Sigfoxでデータを送るには16進数でないと送れない。しかも小数点で送るとParse Errorがでる。
となると、Custom payload configのuintの部分をFloatにして小数点にしよう!と思ったのですがFloat32だと桁が足りなくなってしまいます。かといってFloat64は文字数的に無理がある。
じゃぁどうすればいいんだーって感じで詰まりました。助けて。
Callbackで計算とかできればいいんですけどね。
また何かわかったら続きを書きます。