M5Stack CAT-M UNIT をSORACOMで使う

# はじめに
2021年9月に発売されたM5Stack CAT-M UNIT（SIM7080G搭載）を動かしてSORACOMまで送信した話です。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Tomorrow! UnitCatM with sim7080g with Telec and SoftBank certification, <a href="https://t.co/5IA58W61Y0">pic.twitter.com/5IA58W61Y0</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1435961903860252672?ref_src=twsrc%5Etfw">September 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

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

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

[MCT向けの省電力LPWA規格「LTE Cat.M1」、国内提供は免許が必要で携帯電話キャリアが中心に-INTERNET Watch](https://internet.watch.impress.co.jp/docs/column/nettech/1177611.html)

M5Stackには[3G 拡張ボード](https://soracom.jp/store/5231/)がありますが近々３G網が終わるということもありそれに代わる通信モジュールになります。

# 自己紹介
農業Iotにチャレンジ中！
モットーは「楽をするためなら手間は惜しまない」
好きなM5Stack製品は　M5StickC 最近は[#ｽﾀｯｸﾁｬﾝ](https://protopedia.net/prototype/2345)　が気になってます
好きなSORACOMサービスは　[バイナリーパーサー](https://users.soracom.io/ja-jp/docs/binary-parser/)です


# ハードウェア
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](http://mt-system.ru/sites/default/files/documents/sim7080g_hardware_design_v1.04.pdf)

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


# スケッチ
SORACOM公式製品の

| 通称|画像|
|:-----------:|:------------:|
|[**あのボタン**](https://soracom.jp/store/5208/)|![スクリーンショット 2021-12-15 214357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/0b5b117b-6f0e-78da-54b1-7ab46a0fa462.png)|
|[**しろボタン**](https://soracom.jp/store/5206/)|![スクリーンショット 2021-12-15 214008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/f612f079-a4bd-b210-a6f3-8bb37cad99ba.png)|
|[**ひげボタン**](https://soracom.jp/store/5207/)|![スクリーンショット 2021-12-15 214026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/e637e89f-d122-a7a8-1a2a-2a93a2653e53.png)|
|[**にせボタン**](https://github.com/kenichiro-kimura/soracom-button)|![スクリーンショット 2021-12-15 214648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/f302cdab-8b29-84b8-d32a-add1f5ceefe8.png)|

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

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">まねボタン <a href="https://t.co/rIqqxM6Pyd">pic.twitter.com/rIqqxM6Pyd</a></p>&mdash; mnl_t (@mnlt18) <a href="https://twitter.com/mnlt18/status/1471096724592947202?">December 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
（なお電力消費については考慮してないのでそのままでは乾電池で長期間使える本物のボタンのような実用性はありません）


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


https://qiita.com/kaz19610303/items/c6f291a66eb3b8c2debf

client.write()を使いエンドポイント　uni.soracom.io:23080　へバイナリーで送信します。　
* 参考文献[『作って学ぶSORACOM入門』](https://techbookfest.org/product/5273269798174720)

```cpp: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/eb1a42bf-ed2d-2576-5f4e-a623b6262b6a.png)

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


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

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">something soon. <a href="https://t.co/84oGAXiLAc">pic.twitter.com/84oGAXiLAc</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1468557818361827331?ref_src=twsrc%5Etfw">December 8, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Unit CatM+GNSS. with DC/DC. <a href="https://t.co/sPfYY5tpBp">pic.twitter.com/sPfYY5tpBp</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1471038791611662340?ref_src=twsrc%5Etfw">December 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">UnitCatM+GNSS is ready to manufactory. <a href="https://t.co/gXO7cBa5fQ">pic.twitter.com/gXO7cBa5fQ</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1481924779888492547?ref_src=twsrc%5Etfw">January 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">PoECam-W with Telec. CatM+GNSS JP Unit with telec. <a href="https://t.co/BxGVL2Pe9a">pic.twitter.com/BxGVL2Pe9a</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1512611907039277057?ref_src=twsrc%5Etfw">April 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="pl" dir="ltr">StampCatM <a href="https://t.co/Z5LjTOQLnL">pic.twitter.com/Z5LjTOQLnL</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1470307394463088644?ref_src=twsrc%5Etfw">December 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">StampCatM(sim7080G) works. <a href="https://t.co/prUbhwYNWE">pic.twitter.com/prUbhwYNWE</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1470966143535837187?ref_src=twsrc%5Etfw">December 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="pl" dir="ltr">StampCatM <a href="https://t.co/rfMN3NijNd">pic.twitter.com/rfMN3NijNd</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1473630858024161281?ref_src=twsrc%5Etfw">December 22, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Keep Developing on StampCatM <a href="https://t.co/MVUnN8ATmi">pic.twitter.com/MVUnN8ATmi</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1474213277089419264?ref_src=twsrc%5Etfw">December 24, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ThermalOnline-CatM = MLX90640+Sim7080G+RS485+Core+DinRail+IoTBASE <a href="https://t.co/Y9vYMpyGgu">pic.twitter.com/Y9vYMpyGgu</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1465154480807157760?ref_src=twsrc%5Etfw">November 29, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">📣📣 So Christmas eve and to help you not get bored during the holidays we&#39;ve added two new items- a functional base for IoT data transmission and a remote thermal monitoring kit. Have fun catching those items but don&#39;t get caught by the evil snowman🎄<br>👉<a href="https://t.co/NaOsxS46ag">https://t.co/NaOsxS46ag</a> <a href="https://t.co/pvc7S1h8Ns">pic.twitter.com/pvc7S1h8Ns</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1474341590390902784?ref_src=twsrc%5Etfw">December 24, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ToughCom base board. <a href="https://t.co/QEZXv6ZXZX">pic.twitter.com/QEZXv6ZXZX</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1475437226234286080?ref_src=twsrc%5Etfw">December 27, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="cs" dir="ltr">AtomDTU Mate ing <a href="https://t.co/OZdZI9lcJj">pic.twitter.com/OZdZI9lcJj</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1491801413801758721?ref_src=twsrc%5Etfw">February 10, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">StampCatM/Cat1 next week. <a href="https://t.co/S9yD7nkzoz">pic.twitter.com/S9yD7nkzoz</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1529654577116884997?ref_src=twsrc%5Etfw">May 26, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">📣STAMP Cat-M is the global version of CatM &amp; NB-IoT dual-mode wireless communication module. Control Via AT Commands, and supports multiple communication protocols. Designed for applications that need low latency and low throughput data communication.<br>👉<a href="https://t.co/S96lGWLeX4">https://t.co/S96lGWLeX4</a> <a href="https://t.co/lctDsexBFw">pic.twitter.com/lctDsexBFw</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1532572788044681216?ref_src=twsrc%5Etfw">June 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>