M5Stack Basicを使ってSigfoxの超簡易版無線電波測定ツールを作ってみます。
ただし、ここで取得できる電波状況はSigfoxの下り通信を使い、代表局のBase Station IDとそのRSSIを取得するだけのものですので、本来のSigfoxの品質評価指標(Link Quality Indicator: LQI)とはことなります。LQIを取得するためには、Data Advanced Callbackを使用する必要があり、その方法はこちらを参考にしてください。
#準備するもの
今回は、M5StackとSigfox Breakout Board [BRKWS01]を使います。
- M5Stack Basic
- M5Stack用プロトモジュール *これはなくてもとりあえず動くものは作れます
- [Sigfox Breakout Board [BRKWS01]] (https://www.kccs-iot.jp/solution/product/device32/)
左から、M5Stack Basic、プロトモジュール、Sigfox Breakout Boardとなっています。
#M5Stackでの開発準備
M5Stackは、Arduino IDEとM5Flow(MicroPython)の2種類の開発環境が用意されていますが、ここでは、M5Flowを使うためには、M5Stackのファームウェアをアップデートしないといけないということもあり、Arduino IDEを使用することとします。
##Arduino IDEの準備
Arduino IDEはこちらからダウンロード、インストールしてください。Arduino IDEを使う場合は、M5Stack用に下記のソフトウェアおよびドライバが必要となります。
- ESP32ボード定義
- M5Stackライブラリ
- CP210X Driver
###ESP32ボード定義のインストール
Arduino IDEの[ファイル]_[環境設定]を開きます。
追加のボードマネージャのURLに下記URLを貼り付けます。
https://dl.espressif.com/dl/package_esp32_index.json
その後、[ツール]_[ボード]_[ボードマネージャ]メニューを選択し、ボードマネージャを開きます。ESP32と検索すれば、esp32 by Espressif Systems
が出てくると思いますので、インストールします。
###M5Stackライブラリのインストール
次に、[ツール]_[ライブラリの管理]メニューからライブラリマネージャを開き、M5Stack by M5Stack
をインストールします。(M5Stackで検索)
###CP210X Driver
CP210Xドライバは、M5StackとPCとを接続するUDBケーブル用のドライバとなっており、M5Stackの公式ページから、ご自身のOSにあったドライバをダウンロード、インストールします。
#M5StackとSigfox Breakout Boardを接続
まずは、プロトモジュールを使用せずに、M5Stack付属のピンケーブルを使ってSigfox Breakout Boardを接続します。接続後のイメージは下の写真のようになります。
少し分かりにくいので、配線例を下記に記します。Breackout Boardに3.3Vの入力と、UART用のTX/RXを接続することとなります。Breakout Boardの使い方については、こちらを参考にしてください。
#Sigfox下り通信
冒頭にも述べた通り、今回の仕組みは、Sigfoxの下り通信を使って返されるBase Station IDとRSSIを取得し、M5Stack上に表示するというものになっていますので、少しSigfox下り通信について説明しておきます。
Sigfoxの下り通信は、デバイスから上りメッセージを送信する際に、下り要求オプションを追加する事から始まります。通常上りメッセージは、SigfoxクラウドからアプリケーションサーバにCallbackされますが、その時に下り要求オプションが付いているメッセージは、アプリケーションサーバでJSON形式の応答を返すことにおり、元のデバイスまで、その下りメッセージが送信される仕組みとなっています。この仕組みを有効にするには、SigfoxクラウドのDevice Type設定でDownlink modeをCallbackに設定する必要があります。
ちなみに、上りメッセージは複数局で受信されますが、下りメッセージアは、最も有効な局(一局)から返信されます。
#Sigfox下りメッセージの準備
Sigfox下りメッセージに対応するために、SigfoxクラウドDevice Type設定のDownlink dataの設定をします。
Downlink modeは、通常はアプリケーションsサーバを経由するため、CALLBACKを選択しますが、今回は、アプリケーションサーバを経由しない(つまり、Sigfoxクラウドから直接ダウンリンクを返す)ようにしたいので、DIRECTを選択します。
DIRECTを選択した場合、Downlink data in hexaという入力項目が有効になります。ここでは、デフォルト設定の通り、{tapid}0000{rssi}
と設定しておきます。
tapidは、下りメッセージを送信する局のID、rssiはその局が受信したメッセージの受信レベルを意味します。
#サンプルコード
M5Stack側のサンプルコードを以下に記します。
#include <M5Stack.h>
void setup() {
M5.begin(true, false, true);
M5.Power.begin();
Serial.begin(9600);
Serial2.begin(9600, SERIAL_8N1, 16, 17);
M5.Lcd.clear(BLACK);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(65, 10);
M5.Lcd.println("Sigfox RF monitor");
M5.Lcd.setCursor(0, 35);
M5.Lcd.println("A: Send Message");
M5.Lcd.println("B: Send Message with DL");
M5.Lcd.println("C: Check Device ID");
M5.Lcd.setTextColor(RED);
}
void loop() {
if (Serial2.available()) {
displayResults(Serial2.readString());
}
M5.update();
if (M5.BtnA.wasReleased()) {
M5.Lcd.println("Send Message.");
Serial2.println("AT$SF=1234");
} else if (M5.BtnB.wasReleased()) {
M5.Lcd.println("Send Message with Ack.");
Serial2.println("AT$SF=5678,1");
} else if (M5.BtnC.wasReleased()) {
M5.Lcd.print("Device ID: ");
Serial2.println("AT$I=10");
}
}
void displayResults(String ack)
{
M5.Lcd.println(ack);
int i = ack.indexOf("RX=");
if (i >= 0) {
ack.replace(" ", "");
String bs = ack.substring(i + 6, i + 11);
String rs = ack.substring(i + 15);
signed int rssi = (int16_t)(strtol(rs.c_str(), NULL, 16));
M5.Lcd.print("BSID: ");
M5.Lcd.println(bs);
M5.Lcd.print("RSSI: ");
M5.Lcd.println(rssi);
}
}
3種類のボタン(A/B/C)に応じたコマンドを用意していますが、RSSI確認に使うのは、ボタンBを押した時です。
ボタンBを押すと、AT$SF=5678,1
というフレーム送信コマンドが、Serial2からBreakout Board側に送られるようにしています。5678は適当なPayloadですが、その後の1が、下り要求オプションとなります。
下り受信までには数十秒要しますが、送られてきた下りメッセージを、このモジュールはRX=
で始まる応答として返すようです。その後のデータ配列は、Sigfoxクラウドで設定したDownlink data in hexaに従います。今回の場合は{tapid}0000{rssi}です。
#動作確認
Arduino IDEで、ボードの選択がM5Stack-Core-ESP32となっていること、シリアルポートがM5Stackとの接続ポートであることを確認後、スケッチのコンパイル及びマイコンボードへの書き込みを行います。
無事成功し、Bボタンを押すと、下の写真のように受信レベルが確認できると思います。
#M5Stackプロトモジュールで
Breakout Board基板が丸出しというのも気になる場合、M5Stackプロトモジュール内にモジュールを配置することにより、少しはスマートになるかと思います。プロトモジュールにはケーブル出しの穴もあるので、外部アンテナも付けやすいかと思います。(中段のグレーのモジュールがM5Stackプロトモジュールです。)
ただ、純正のプロトモジュールのコネクタからの線だしが面倒なので、はんだ付け時にはがっかりするかもしれませんが。