LPWA(Low Power Wide Area)という通信技術があります。名前の通り、消費電力が少なく、長距離をカバーできる通信で、IoT端末に適しています。LPWA通信の一つであるSigfoxのM5Stack用の通信モジュールがあるので、それを試してみました。

SigfoxはフランスのSigfox社が提供するLPWAネットワークで、日本では京セラコミュニケーションシステム株式会社(KCCS)が展開しています。IoT端末からSigfoxでデータを送信する場合、データはSigfox用の基地局を経由してSigfoxクラウドに送られます。Sigfoxクラウドにアクセスして送信したデータを確認することもできますし、Sigfoxクラウドからユーザーのシステムにデータを転送することもできます。

今回は、M5Stackにつけた環境センサで温度、湿度、気圧を測り、そのデータをSigfoxで送信し、SigfoxクラウドからAmbientに転送してグラフ化してみます。

ハードウェア

今回利用したのは「M5Stack用Sigfoxモジュール」です。写真右のようにM5Stackに重ねて使います。「COM.SigFox」と書かれた部分がSigfoxモジュールです。

M5Stackとはシリアルで通信します。送受信のピンは送信(TX)用として0/13/17ピン、受信(RX)用として5/15/16ピンをDIPスイッチで選べます。出荷時はTX:17、RX:16に設定されています。M5Stack BasicやGrayを使う場合で、シリアル通信でアクセスする他のデバイスがなければ出荷時のままで大丈夫です。M5Stack Fireは17/16ピンがPSRAMに接続されているので、設定を変える必要があります。

DC電源ソケットがありますが、M5Stackに重ねて使う場合はM5Stackから給電されるので、DC電源をつなぐ必要はありません。

デバイス登録

「M5Stack用Sigfoxモジュール」は開発キットとして、1年間の無償回線で利用することができます。Sigfoxでデータを送信するには、Sigfoxシステムにデバイスを登録します。登録にはモジュールに固有のSigfoxデバイスIDとPAC(認証コード)を使います。この情報はM5Stack用Sigfoxモジュール内部に書き込まれており、次のURLにあるプログラムをM5Stackで実行するとM5Stackの液晶画面とシリアルモニタにデバイスIDとPACが表示されます。

https://github.com/m5stack/M5-ProductExampleCodes/blob/master/Module/COMX_SigFox/COMX_SigFox.ino

デバイスIDとPACが確認できたら、次のサイトでデバイスIDとPACを入力してデバイスを登録します。
https://buy.sigfox.com/

登録の流れは「Sigfox Devkit(開発キット)を1年間の無償回線で利用する」に詳しく書かれています。

デバイスを登録して、Sigfoxクラウドにログインし、Deviceタブをクリックすると、登録したデバイスIDが表示されています。

データを送信してみる

KCCSさんの「M5Stack COM.X Sigfoxの使い方」というページにM5Stackからデータを送信するサンプルプログラムがあるので、それを動かしてみます。M5StackのAボタンを押すと「0xCAFE」というデータを送信します。Bボタンを押すと「0xC0FFEE」というデータを送信し、クラウドからDOWNLINK(下りメッセージ)を受信します。最初、「CAFE」「COFFEE」という文字列かと思ったのですが、「CAFE」は「0xCA」「0xFE」という16進表記された2バイトのデータ、「C0FFEE」は「0xC0」「0xFF」「0xEE」という3バイトのデータです。

Sigfoxに送信できるデータは12バイトで、シリアル回線に次のようなコマンドを送るとデータが送信できます。

AT$SF=16進表記のデータ

DOWNLINKメッセージを受けるには、設定が必要です。SigfoxクラウドのDEVICE TYPEタブをクリックし、表示されたデバイスのName(今の場合は「M5Stack_DevKit_1」)をクリックし、右上の「Edit」をクリックするとデバイスタイプの設定画面が表示されます。その中のDownlink dataのDownlink modeを「DIRECT」に変更します。

プログラムを動かし、Aボタンを押すと、数秒後にM5Stackの液晶画面に「OK」と表示されます。次にBボタンを押すと、

RX=00 00 96 29 00 00 FF 85

BSIO: 09629
RSSI: -123

と表示されます(値はデバイスによって異なります)。

SigfoxクラウドのDEVICEタブをクリックし、表示されたデバイスのIDの部分をクリックして、そのデバイス情報の画面にいき、左のメニューの「MESSAGE」を選択すると、次のように送信されたメッセージを確認できます。

センサデータをSigfoxクラウドに送る

Sigfoxでデータが送信できたので、次はセンサデータをSigfoxクラウドに送ってみます。

例としてM5Stackの環境センサ「M5Stack用環境センサユニット ver.2(ENV II)」を使い、温度、湿度、気圧を測定し、その値をSigfoxクラウドに送ることにします。

まず、温度、湿度、気圧データをSigfoxの送信メッセージにエンコードすることを考えます。

環境センサユニットのライブラリから取得する温度、湿度、気圧データは浮動小数点型(float型)です。温度の場合、測定範囲は-40.0℃から120.0℃なので、次のように100を足して10倍すると16ビット整数(uint16_t)で表現できます。

(t + 100) * 10

これはIoT端末側のArduinoプログラムで計算できます。Sigfoxクラウドが受け取ったデータをAmbientでグラフ化するまでのどこかで受け取ったメッセージから元のデータに戻すために、この逆の計算をしたいのですが、計算する場所が見つかりませんでした。そこで今回は上記のような計算をせず、SigfoxサイトのサンプルプログラムにあったconvertFloatToHex()という関数を使い、float型データを4バイトの16進データに変換しました。

https://github.com/kccs-iot/sigfox-shield-arduino/blob/master/examples/basic/basic-temp-humid-pressure/basic-temp-humid-pressure.ino

温度、湿度、気圧をそれぞれ4バイトの16進にするので、送信メッセージは次のようになります。

環境センサから温度、湿度、気圧を取得してSigfoxクラウドに送るプログラムは次のようになります。なお、このサンプルプログラムでは、Sigfoxへの送信を確認するために30秒ごとにデータを送信していますが、Sigfoxで送れるのは1日140メッセージまでなので、同じ間隔でデータを送り続けるには11分以上の間隔で送る必要がありますので気をつけてください。

プログラムを動かし、Sigfoxクラウドを見ると、次のようにデータが送られているのが確認できます。

センサデータをSigfoxクラウドからAmbientに転送する

Sigfoxクラウドには受信したデータを他のサービスに転送するCallbackという機能があります。AWS IoTやMicrosoft Azure IoT Hubなどへの転送の他に、HTTP/HTTPSで一般的なサーバーにデータを転送するCustom Callbackがあり、これを使ってAmbientにデータを転送できます。

Custom Callbackを設定する前に、まず転送先を用意します。Ambientの場合は、Ambientにアカウントを作り、ログインして送信先となるチャネルを生成します。チャネルを生成すると次のチャネル一覧画面に、生成したチャネルのIDとその他の情報が表示されます。

Ambientを使い始める流れは「Ambientを使ってみる」をご覧ください。

SigfoxのCustom Callbackの設定は、Sigfoxクラウドでおこないます。DEVICE TYPEタブをクリックし、Custom Callbackを設定するデバイスタイプの名前をクリックし、左メニューのCALLBACKSをクリックし、右上の「New」をクリックすると、次の画面が表示されます。

ここでCustom callbackを選択すると、Custom Callbackの設定画面が表示されます。

ここで、次のように設定します。

Type:「DATA」「UPLINK」
Channel:「URL」
Custom payload config: tmp::float:32 hum::float:32 pressure::float:32
Url pattern: https://ambidata.io/api/v2/channels/チャネルID/data
Use HTTP Method:「POST」
Send SNI:✓

Custom payload configは送信したデータの扱い方を指定するものです。今回は温度、湿度、気圧データをそれぞれ4バイト(32ビット)のfloat型で送っています。そこで、最初の32ビットをfloat型で「tmp」という名前で、2番目と3番目も32ビットのfloat型で「hum」、「pressure」という名前で扱うように指定しています。この部分は送るデータによって変えてください。

Url patternはAmbientにデータを送るときのアドレスです。チャネルIDの部分にAmbientでチャネルを生成したときのIDを入れます。

Use HTTP Methodに「POST」を選択すると「Content type」と「Body」欄が現れます。ここにAmbientに送信するデータのタイプと中身(Body)を設定します。

それぞれの欄は次のように設定します。

Content type:application/json
Body:
  {
    "writeKey": "ライトキー",
    "d1": {customData#tmp},
    "d2": {customData#hum},
    "d3": {customData#pressure}
  }

ライトキーはAmbientで生成したチャネルのライトキーを入れます。d1、d2、d3は、Custom payload configで指定した「tmp」をd1に、「hum」をd2に、「pressure」をd3にセットして送信することを意味します。

これでCustom Callbackの設定は完了です。

先程のM5Stackのプログラムを動かすと、温度、湿度、気圧データがSigfoxクラウドに送られ、Custom Callbackで設定したようにAmbientに転送されます。Ambientにログインしてチャネル一覧ページで、データを送信したチャネルをクリックすると、次のように送ったデータがグラフ化されているのが確認できます。

おまけ:Sigfoxクラウドでのデータ表示のカスタマイズ

Sigfoxクラウドに送ったデータを見る時にも、Custom payload configと同様にデータの扱いを指定できます。SigfoxクラウドのDEVICE TYPEタブをクリックし、デバイスタイプの名前をクリックして、右上の「Edit」をクリックします。Payload display欄のPayload parsingを「Regular (raw payload)」から「Custom grammer」に変更し、Custom configuration欄にCustom payload configに設定したのと同じ様に「tmp::float:32 hum::float:32 pressure::float:32」と入力して「OK」をクリックすると、データの表示方法が変わります。

先程の例では、最初は「41b900e1421401a4447ae118 」という16進でエンコードされたデータだったものが、次のような温度、湿度、気圧データでの表示に変わります。

tmp: 23.12543
hum: 37.001602
pressure: 1003.5171