LoginSignup
21
12

More than 1 year has passed since last update.

M5Stack CAT-M UNIT をSORACOMで使う

Last updated at Posted at 2021-12-15

はじめに

2021年9月に発売されたM5Stack CAT-M UNIT(SIM7080G搭載)を動かしてSORACOMまで送信した話です。

初めにTwitterを見たときは日本で使えるのか不明だったのでスルーしていました。
ですが最近国内での使用レポートを見かけるようになりそれならばと購入してみました。

**CAT-M(LTE Cat.M1)**とは4G LTE の携帯電話通信網を利用し広範囲・省電力でIoT機器に適した通信規格です。SORACOMではDOCOMOとKDDI網が利用でき1回線ごと月110円~からと個人でも手を出しやすいです
Interface 無線通信モジュール一覧 セルラー系

MCT向けの省電力LPWA規格「LTE Cat.M1」、国内提供は免許が必要で携帯電話キャリアが中心に-INTERNET Watch

M5Stackには3G 拡張ボードがありますが近々3G網が終わるということもありそれに代わる通信モジュールになります。

自己紹介

農業Iotにチャレンジ中!
モットーは「楽をするためなら手間は惜しまない」
好きなM5Stack製品は M5StickC 最近は#スタックチャン が気になってます
好きなSORACOMサービスは バイナリーパーサーです

ハードウェア

https://shop.m5stack.com/products/sim7080g-cat-m-nb-iot-unit
https://docs.m5stack.com/en/unit/cat_m
http://www.cathay.jp/product/lte/SIM7080G.pdf

SIM7080G搭載類似商品
https://www.waveshare.com/wiki/SIM7080G_Cat-M/NB-IoT_HAT
https://www.waveshare.com/pico-sim7080g-cat-m-nb-iot.htm
https://nextstep.official.ec/items/55779084

モジュールモデル SIM7080G
制御コマンド ATコマンド
Cat-M 上り: 1119Kbps 下り: 589Kbps
通信インターフェース UART: baud 115200 8N1
プロトコルサポート TCP / UDP / HTTP / HTTPS / TLS / DTLS / PING / LWM2M / COAP / MQTT
スタンバイ動作電流 49.4mA
価格 27.50ドル 36.90ドル(2022.7.19現在)

技適マークも印字してあります
NB-IoTにも対応してますがよく知らないのでここでは触れません

回路図
https://static-cdn.m5stack.com/resource/docs/static/assets/img/product_pics/unit/cat_m/cat_m_sch_01.webp
VCC 5V入力を3.3Vに降圧しモジュール内でSIM_Vcc 1.8v を生成しています 。
(モジュール動作電圧は2.7V~4.8VDC)
NETLIGHTにつながる青色LEDが通信接続中は早く点滅します。64ms ON, 300ms OFF
PWRKEYにパルスを送るとモデムのリセットできるそうですがSTATUSと0Ωで直結してあります。

SIM7080G Hardware Design

今回は手元にあったDocomoのNANOsimを挿して使いました

スケッチ

SORACOM公式製品の

通称 画像
あのボタン スクリーンショット 2021-12-15 214357.png
しろボタン スクリーンショット 2021-12-15 214008.png
ひげボタン スクリーンショット 2021-12-15 214026.png
にせボタン スクリーンショット 2021-12-15 214648.png

を真似してM5StickCとCAT-M UNITで「まねボタン(仮称)」を作ってみました。
ボタンを押すとSORACOM Harvestにボタンの状態とバッテリーレベルを送信します。
今回は確認のため稼働時間を含め毎分1回送信してます。

(なお電力消費については考慮してないのでそのままでは乾電池で長期間使える本物のボタンのような実用性はありません)

TinyGSMライブラリはSIM7080Gに対応しているのでそれを利用します。

client.write()を使いエンドポイント uni.soracom.io:23080 へバイナリーで送信します。 

sim7080G_sample.ino
#include <Arduino.h>
#include <M5StickC.h>
#include "AXP192.h"

#define TINY_GSM_MODEM_SIM7080
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
#define SerialMon Serial
#define SerialAT Serial1

#define ENDPOINT "uni.soracom.io"

TinyGsm        modem(SerialAT);
TinyGsmClient client(modem);

typedef struct struct_message {

  float  batvol;
  float  usbvol;
  uint16_t uptimesec;
  bool     BtnA;
  bool     BtnB;
} struct_message;

struct_message myData;
  // binary-parser
  // batvol:0:float:32:little-endian usbvol:4:float:32:little-endian uptimesec:8:uint:16:little-endian BtnA:10:uint:1:0 BtnB:11:uint:1:0

void setup() {
  M5.begin();//default baud rate 115200
  M5.Lcd.fillScreen(WHITE);
  delay(200);
  SerialMon.println("Wait...");

  // Set GSM module baud rate
  SerialAT.begin(115200, SERIAL_8N1, 33, 32);//M5StickC
  delay(1000);

  // Restart takes quite some time
  // To skip it, call init() instead of restart()
  SerialMon.println("Initializing modem...");
  // modem.restart();
  modem.init();

  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem Info: ");
  SerialMon.println(modemInfo);
 //modem.gprsConnect("soracom.io", "sora", "sora");// 初回だけ必要
  SerialMon.print(F("waitForNetwork()"));
  while (!modem.waitForNetwork()) SerialMon.print(".");
  SerialMon.println(F(" Ok."));

  SerialMon.print(F("gprsConnect(soracom.io)"));
  modem.gprsConnect("soracom.io", "sora", "sora");
  SerialMon.println(F(" done."));

  SerialMon.print(F("isNetworkConnected()"));
  while (!modem.isNetworkConnected()) SerialMon.print(".");
  SerialMon.println(F(" Ok."));

  SerialMon.print(F("My IP addr: "));
  IPAddress ipaddr = modem.localIP();
  SerialMon.println(ipaddr);

}

void loop() {
  myData.uptimesec = (uint16_t)(millis()/1000);
  myData.batvol = M5.Axp.GetBatVoltage();
  myData.usbvol = M5.Axp.GetVBusVoltage();
  myData.BtnA = M5.BtnA.wasPressed();
  myData.BtnB = M5.BtnB.wasPressed();

  if (myData.BtnA || myData.BtnB || (myData.uptimesec % 60 == 0)){
  //if (myData.BtnA || myData.BtnB ){
    M5.Lcd.fillCircle(40, 60, 30, GREEN);
    /* connect */
    if (!client.connect(ENDPOINT, 23080)) {
      M5.Lcd.fillCircle(40, 60, 30, RED);
      SerialMon.println(F("failed."));
      delay(3000);
      return;
    }
    /* send */
    client.write((const uint8_t*)&myData, sizeof(myData));
    SerialMon.print("batvol:");SerialMon.println(myData.batvol);
    SerialMon.print("usbvol:");SerialMon.println(myData.usbvol);
    SerialMon.print("uptimesec:");SerialMon.println(myData.uptimesec);
    SerialMon.print("BtnA:");SerialMon.println(myData.BtnA);
    SerialMon.print("BtnB:");SerialMon.println(myData.BtnB);

    SerialMon.println("sent.");
    char buf[1 * 1024] = {0};
    client.readBytes(buf, sizeof(buf));
    client.stop();
    SerialMon.print("recv:");SerialMon.println(buf);
  }
  M5.Lcd.fillScreen(BLACK);
  M5.update();
  delay(100);
}

#SORACOMユーザーコンソール
SORACOMユーザーコンソール -> simグループ管理 -> SORACOM Air for セルラー設定 -> バイナリーパーサー -> フォーマット に入力
:little-endianを付けるのに注意

batvol:0:float:32:little-endian usbvol:4:float:32:little-endian uptimesec:8:uint:16:little-endian BtnA:10:uint:1:0 BtnB:11:uint:1:0

Harvestに送信されているのがわかります。
スクリーンショット 2021-12-15 005121.png

Unified Endpointに送信しているのでSORACOM Funkを使いボタンを押したらSlackに送信することなどもできます

終わりに

このCAT-M UNITを注文して届く間にも次々とSIM7080Gを載せた製品が予告されています。
日本国内でも販売されるようになればWiFiのないところでのIoTが
より低コストでできるようになりそうで期待が持てます。

21
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
12