技術情報

M5Stack COM.X Sigfoxの使い方

2020.09.18

お待たせしました。遂にM5Stack公式から、Sigfox通信用拡張モジュールCOM.X Sigfoxがリリースされました。M5StackにセルラーやLoRa通信等機能を追加するCOM.Xファミリーとしての製品です。スイッチサイエンスから販売されていますので、こちらからご購入下さい。

img-20200918-technical-01.png

COM.X Sigfoxの仕様

COM.X Sigfoxは、SEONG JI(旧Wisol)SFM11R3を搭載した拡張ボードで、Sigfox ATコマンド(シリアル通信)でSigfox通信を制御することができます。
主な仕様は下記の通りです。

項目仕様
サイズ 54.2 x 54.2 x 13.2 mm
質量 27g
付属アンテナ ANT-916-CW-HWR-SMA
対応RC RC3(日本:ARIB T-108準拠)

COM.X Sigfoxの公式ドキュメントには、RC5も記載されていますが、韓国向けのRadio Configurationですので、日本国内ではRC5を使わないようにしてください。

M5Stack COM.X Sigfoxユースケース

M5StackはArduino IDEやUIFlow、MicroPythonで開発可能であり、COM.X Sigfoxの位置づけは、Arduino UNO向けのSigfox Shield for Arduino(UnaShield)やArduino ZERO向けのUnaMKRのM5Stack版となります。
加え、M5Stackは、320 x 240のカラーLCDや3つのボタン、バッテリーベースが付いていますので、センシング情報をディスプレイに表示しながら、定期的ないし異常発生時に、そのデータをSigfoxで送信するというユースケースを簡単に構築することができます。

COM.X SigfoxはDevkit扱い

COM.X SigfoxはDevkit扱いとなっていますので、1年間の無料回線が付いています。こちら:Sigfox Devkit(開発キット)を1年間の無償回線で利用するを参考にSigfoxクラウドへデバイス登録してください。2年目以降は、同サイト(Sigfox Buy)から回線購入して、継続利用することも可能です。

COM.X Sigfoxモジュールの拡張

M5Stack、M5Core2ともに、拡張モジュールに対応していますが、M5Core2では、拡張モジュールを取り付けるため、2mm径の六角レンチが必要となります。
それぞれを取り付けたイメージは下のようになります。

M5Stack + COM.X SigfoxM5Core2 + COM.X Sigfox
img-20200918-technical-02.jpeg img-20200918-technical-03.jpeg

COM.X Sigfoxを拡張した場合、M5Stackは付属のバッテリーモジュールをそのまま取り付けられますが、M5Core2の場合は、本体にバッテリーが付いているため、バッテリーモジュールを追加する必要がありません。ただ、下の写真のように、背面がむき出しになるので、何らかのベースユニットを用意した方が見た目は綺麗ですね。

img-20200918-technical-04.jpeg

M5Stackの開発準備

ここでは、M5Stack及びM5Core2を使ったCOM.X Sigfoxの使用方法について説明します。

  1. Arduino IDEのインストール(M5Stack / M5Core2共通)
  2. USBシリアルドライバーのインストール(M5Stack / M5Core2共通)
  3. ボード定義のインストール(M5Stack / M5Core2)
  4. ライブラリのインストール(M5Stack / M5Core2)

USBシリアルドライバーのインストール(共通)

M5StackをPCと接続するため、USBシリアルドライバーをインストールします。

Windows の場合

  1. M5Stack の Web サイトからWindows用の CP210X Driverをダウンロードします。
  2. ダウンロードした CP210x_VCP_Windows.zipを展開します。
  3. CP210xVCPInstaller_x64_v6.7.0.0 をダブルクリックしてインストールします。
  4. 付属のUSB Type-Cケーブル(Core2には付属されていません)を使用して PC と接続します。[デバイスマネージャ] を開き [ポート(COM と LPT)] で Silicon LabsCP210x USB to UART Bridge (COMxx)が表示されることを確認してください。

macOS の場合

  1. M5Stack の Web サイトからmacOS用の CP210X Driverをダウンロードします。
  2. ダウンロードしたCP210x_VCP_MacOS.zipを展開します。
  3. SiLabsUSBDriverDisk.dmgをダブルクリックしてマウントします。
  4. FinderでマウントされたSilicon Labs VCP Driver Install Diskが開かれますので Silicon Labs VCP Driver.pkgをダブルクリックしてインストールします。
  5. 付属のUSB Type-Cケーブル(Core2には付属されていません)を使用して PC と接続します。
  6. [システム環境設定] > [セキュリティとプライバシー] でドライバーのロードを承認します。

ボード定義のインストール(M5Stack / M5Core2)

M5Stack、M5Core2をArduino IDEで扱うためボード定義をインストールします。

  1. Arduino IDEを起動します。
  2. メニューから [ファイル] > [環境設定] を選択します。
  3. [設定タブ] の [追加のボードマネージャの URL:] へ以下の URL を入力して [保存] をクリックします。
    https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
  4. Arduino IDEの [ツール] > [ボード] > [ボードマネージャ] を選択します。
  5. 一覧の中からM5Stack by M5Stack officialを選択 (M5Stackで検索すると見つけやすいです)しインストールをクリックします。
  6. Arduino IDEの [ツール] > [ボード] メニューから、接続するM5に合わせて、ボードを選択します。
  7. M5Stackの場合Arduino IDEの [ツール] > [ボード] > [M5Stack Arduino] > [M5Stack-Core-ESP32] を選択します。
  8. img-20200918-technical-05.png
  9. M5Core2の場合Arduino IDEの [ツール] > [ボード] > [M5Stack Arduino] > [M5Stack-Core2] を選択します。
  10. img-20200918-technical-06.png

ライブラリのインストール(M5Stack / M5Core2)

開発において、M5ライブラリを使用できるようにライブラリをインストールします。

  1. Arduino IDEを起動します。
  2. Arduino IDEの [スケッチ] > [ライブラリをインクルード] > [ライブラリを管理…] を選択します。
  3. 使用するM5に合わせ、一覧の中からライブラリをインストールします。
    • M5Stackの場合M5Stack by M5Stackを選択。
    • M5Core2の場合M5Core2 by M5Stackを選択。

M5Stackで開発をする

M5Stack、M5Core2で開発する場合、各ライブラリをインクルードします。

  • M5Stack用ライブラリをインストールした場合、#includeがインクルードされます。
  • M5Core2用ライブラリをインストールした場合、#includeがインクルードされます。

サンプルスケッチ

ボタンクリックに応じ、①UPLINK(上り)メッセージのSigfox送信、②DOWNLINK(下り)要求付メッセージのSigfox送信、③ID / PAC情報の取得を行うサンプルスケッチをM5Stack、M5Core2用に用意しました。

M5Stack用サンプルスケッチ

m5stask-sigfox.c
#include 

void setup() {
  M5.begin(true, false, true);
  Serial2.begin(9600, SERIAL_8N1, 16, 17);
  showTempl();
}

void loop() {
  if (Serial2.available()) {
    displayResults(Serial2.readString());
  }
  M5.update();

  if (M5.BtnA.wasReleased()) {
    showTempl();
    M5.Lcd.println("Send Message.");
    Serial2.println("AT$SF=CAFE");
  } else if (M5.BtnB.wasReleased()) {
    showTempl();
    M5.Lcd.println("Send Message with Ack.");
    Serial2.println("AT$SF=C0FFEE,1");    
  } else if (M5.BtnC.wasReleased()) {
    showTempl();
    M5.Lcd.println("Device ID&PAC: ");
    Serial2.println("AT$I=10");
    Serial2.println("AT$I=11");
  }
}

void showTempl()
{
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.println("M5Stack COM.Sigfox");

  M5.Lcd.setCursor(30, 220);
  M5.Lcd.print("UP");
  M5.Lcd.setCursor(129, 220);
  M5.Lcd.print("DOWN");
  M5.Lcd.setCursor(238, 220);
  M5.Lcd.print("ID/PAC");  

  M5.Lcd.setTextColor(BLUE);
  M5.Lcd.setCursor(0, 35);
}

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);
  }
}

M5Core2サンプルスケッチ

M5Core2では、①物理ボタンの廃止、②シリアルポートの違いがあり、M5Stack用のスケッチそのままでは動きません。物理ボタンの代わりにタッチポイントによる動作、シリアルポート番号の変更を行っています。

m5core2-sigfox.c

#include
void setup() {
  M5.begin(true, false, true);
  Serial2.begin(9600, SERIAL_8N1, 13, 14);
  showTempl();
}

void loop() {
  if (Serial2.available()) {
    displayResults(Serial2.readString());
  }

  TouchPoint_t pos = M5.Touch.getPressPoint();
  char btn = btnPressed(pos);
  if (btn != 0) {
    showTempl();
    if (btn == 'A') {
      M5.Lcd.println("Send Message.");
      Serial2.println("AT$SF=CAFE");
    } else if (btn == 'B') {
      M5.Lcd.println("Send Message with Ack.");
      Serial2.println("AT$SF=C0FFEE,1");
    } else if (btn == 'C') {
      M5.Lcd.println("Device ID&PAC: ");
      Serial2.println("AT$I=10");
      Serial2.println("AT$I=11");
    }
    delay(1000);
  }
}

char btnPressed(TouchPoint_t pos) 
{
  char btn = 0;
  if (pos.y > 240) {
    if (pos.x < 109) btn = 'A';
    else if(pos.x >= 109 && pos.x <= span=""> 218) btn = 'B'; 
  else if(pos.x > 218) btn = 'C'; 
  } 
return btn; 
} 

void showTempl() 
{
M5.Lcd.clear(BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(10, 10);
M5.Lcd.println("M5Stack Core2 COM.Sigfox");
M5.Lcd.setCursor(30, 220);
M5.Lcd.print("UP");
M5.Lcd.setCursor(129, 220);
M5.Lcd.print("DOWN");
M5.Lcd.setCursor(238, 220);
M5.Lcd.print("ID/PAC");
M5.Lcd.setTextColor(BLUE);
M5.Lcd.setCursor(0, 35);
}

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);
 }
}

補足:DOWNLINK設定

上記サンプルスケッチで、DOWNLINK(下り要求メッセージ)に対応するためには、SigfoxクラウドのDeviceType設定で、Downlink dataの設定を行う必要があります。
上記サンプルは、Downlink modeをDIRECT、つまり、Sigfoxクラウドから直接下りメッセージ応答を返すようにしています。その際には、下りメッセージをDownlink data in hex項目で設定する必要があり、数の通り、{tapId}0000{rssi}とし、受信基地局IDとRSSIをダウンリンクで返す設定としています。

この設定画面へは、Sigfoxクラウドログイン後、上部の[DEVICE TYPE]タブを選択 > 該当のDevice Type Nameを選択 > 右上の[Edit]ボタンクリックとなります。

img-20200918-technical-07.png

番外編(アンテナを変えてみる)

COM.X SigfoxのPCBには、u.FL(IPEX)コネクタがあり、通常は、そこから外部のSMAコネクタにケーブルアウトされています。
ですので、下の写真のようにu.FL(IPEX)タイプのアンテナも利用可能です。

img-20200918-technical-08.jpeg

SFM11R3の技適取得済みアンテナリストは、Seongji(Wisol)社のサポートサイトでダウンロード可能です。

本記事で利用するDevkitはこちら

著者情報

研究部責任者 日比学

京セラコミュニケーションシステム株式会社(KCCS)の経営企画部門で新規事業・研究開発に従事。
Sigfoxネットワークの更なる普及にむけて、IoT、LPWA(Sigfox)関連の情報を発信しています。

【Twitter】https://twitter.com/ghibi