通信キャリヤ利用型LPWAであるLTE-Mの体験

LTE-M

個人でも気軽に購入でき、パソコン等に接続して比較的小容量(例えば数百バイト)のディジタルデータを遠距離に届けることのできる移動無線通信LPWA(low power wide area)が人気です。

LPWA無線通信機器を複数台だけ準備して、互いに通信できるようにすれば、月額利用料のかからない環境測定システムでさえ構築可能です。一方の基地局を通信キャリヤに肩代わりしてもらい、この通信キャリヤに月額利用料を支払うことで、インターネット接続機能やデータのグラフ化機能を提供してもらうこともできます。後者のLPWAには、フランスのSigfoxや、LoRaWAN、そして最近では第4世代携帯電話システムLTE(long term evolution)の基地局を改修して規格化したLTE-Mがあります。

Wio LTE M1/NB1

2018年10月中旬に、ソラコムがLTE-Mの一般向けサービスを開始しましたので、早速、購入しました。通信キャリヤはKDDIです。無線通信基板Wio LTE M1/NB1の他に、LTE-M用のSIMカードが必要です。

LTE-M

この無線通信基板は中国企業のSeeed Studioが製造したもので、そこにある通信モジュールはQuectel社のBG96でした。この通信モジュールは、技術基準適合制度(技適)を取得しています。

LTE-M

この無線通信基板のSIMカードスロットとSDカードスロットはスタックされていて、省スペースです。

LTE-M

横から見てもこのスロットはコンパクトです。自らのセンサが接続できるようにGloveコネクタがあります。

LTE-M

本体にはSTM32F4マイコンがついていて、Gloveコネクタに接続したセンサ情報をLTE-Mにより伝送する装置をArduino IDEを用いて開発することができます。開発に必要なライブラリは、日々、更新されているようでして、とても活発です。この基板に電源を投入すると、初期化が始まります。私の基板では、実際に通信を始められるまでに30秒程度かかりました。この基板にはRGB LEDが搭載されていますので、ここに電波強度が表示されるようにしてみました。ポータブルバッテリを接続して自動車で広島県内を走行しましたが、山奥でも十分な電波強度で利用できることに驚きました。

LTE-M

サンプルを参考にして作成したプログラムは次の通りです。

#include <WioCellLibforArduino.h>
#include <math.h>

#define L_EQUIP  100
#define L_MSG    100
#define T_SEND   1800
#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"
#define WEBHOOK_URL "http://beam.soracom.io:8888/lte-m/"

WioCellular Wio;

void ColorScale(double value, int *rr, int *gg, int *bb)
{ // https://qiita.com/krsak/items/94fad1d3fffa997cb651
    int r, g, b;
    double  tmp_val = cos( 4 * 3.14159 * value );
    int     col_val = (int)( ( -tmp_val / 2 + 0.5 ) * 255 );
         if ( value >= ( 4.0 / 4.0 ) ) { r = 255;     g = 0;       b = 0;       }
    else if ( value >= ( 3.0 / 4.0 ) ) { r = 255;     g = col_val; b = 0;       }
    else if ( value >= ( 2.0 / 4.0 ) ) { r = col_val; g = 255;     b = 0;       }
    else if ( value >= ( 1.0 / 4.0 ) ) { r = 0;       g = 255;     b = col_val; }
    else if ( value >= ( 0.0 / 4.0 ) ) { r = 0;       g = col_val; b = 255;     }
    else {                               r = 0;       g = 0;       b = 255;     }
    *rr = r; *gg = g; *bb = b;
    return;
}

void setup() {
  delay(200);

  SerialUSB.begin(115200);
  SerialUSB.println("Initialize.");
  Wio.Init();

  SerialUSB.println("Cellular ON.");
  Wio.PowerSupplyCellular(true);
  delay(500);

  SerialUSB.println("LED ON.");
  Wio.PowerSupplyLed(true);
  delay(500);
  Wio.LedSetRGB(1, 1, 1);

  SerialUSB.println("Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    Wio.LedSetRGB(1, 0, 0);
    SerialUSB.println("failed.");
  }
  delay(500);
  
  SerialUSB.println("Connecting to \"" APN "\".");
  Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL_IMSI);
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    Wio.LedSetRGB(1, 0, 0);
    SerialUSB.println("failed.");
  }

  char imei[L_EQUIP]; 
  SerialUSB.print("IMEI: ");
  if (Wio.GetIMEI(imei, L_EQUIP)) SerialUSB.println(imei);
  else                            SerialUSB.println("IMEI read error");

  char imsi[L_EQUIP];
  SerialUSB.print("IMSI: ");
  if (Wio.GetIMSI(imsi, L_EQUIP)) SerialUSB.println(imsi);
  else                            SerialUSB.println("IMSI read error");
}

void loop() {
  static int count=T_SEND;
  int rssi = Wio.GetReceivedSignalStrength();
  char msg[L_MSG];
  sprintf(msg, "Time left: %4d  RSSI: %d dBm", count, rssi);
  SerialUSB.println(msg);
  if (rssi == -999) Wio.LedSetRGB(0, 0, 1);
  else {
    int rr, gg, bb;
    ColorScale((rssi+109)/(109.-53.), &rr, &gg, &bb);
    int r = int (rr/25.5+0.5);
    int g = int (gg/25.5+0.5);
    int b = int (bb/25.5+0.5);
    Wio.LedSetRGB(r, g, b);
  }
  count --;
  if (count == 0) {
    Wio.LedSetRGB(0, 0, 0);
    SerialUSB.println(WEBHOOK_URL);
    char data[150];
    sprintf(data, "{\"rssi\":\"%d\",\"uptime\":\"%lu\"}", rssi, millis() / 1000);
    SerialUSB.print("Post: "); SerialUSB.print(data); SerialUSB.println("");
    int status=0;
    if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
      SerialUSB.println("Post failed.");
    } else {
      SerialUSB.print("Status:"); SerialUSB.println(status);
    }
    count = T_SEND;
  }
  delay(2000);
}

また、このボードはLiPo電池管理ICも付いていて、充電もできて、便利です。

LTE-M

LTE-M Button

その後、LTE-M Buttonが発売されました。ボタンを押した情報、長押しした情報、そしてダブルクリックした情報の3種類を区別して、電池残量とともにクラウドにアップロードするものです。私のWio LTE M1/NB1では接続までに30秒程度の時間がかかる一方、このLTE-Mは5秒くらいでデータ送信まで完了します。

LTE-M

もちろん、技適も取得しています。

LTE-M

説明文にしたがい、3種類のボタンの押し方をslackに表示する方法を試して、うまく行きました。はじめて、Amazon AWSをまともに使いました。

Wio LTE M1/NB1とLTE-M Buttonの両方を使い比べて見ましたが、色々なことができるWio LTE M1/NB1の方が楽しいと感じました。

作成日: 27th November 2018