M5Stack用SIM7080G搭載CAT-M/NB-IoT+GNSSユニットをIoT Connect Mobile Type Sでの動作検証

# はじめに
IoT Connect Mobile Type S というNTTコミュニケーションズが提供している通信回線を M5Stack用SIM7080G搭載CAT-M/NB-IoT+GNSSユニット で動かしてみます。
まずは、このモジュールで通信環境が整うかどうかがポイントになるので、今回は疎通確認までを記事にまとめました。

https://www.ntt.com/business/sdpf/service/icms.html


# 必要なもの

* M5Stack用 SIM7080G搭載 CAT-M/NB-IoT+GNSSユニット（アンテナつき）

https://www.switch-science.com/products/8191

<br>

* M5Stack Core2 IoT開発キット

https://www.switch-science.com/products/6530

<br>

* IoT向けモバイルデータ通信サービス IoT Connect Mobile Type S のSIMカード

https://www.ntt.com/business/sdpf/service/icms.html


# 環境
* PlatformIO
* ライブラリ：TinyGSM


# サンプルコード

```cpp:main.cpp
// SIM7080用のモデムモジュール
#define TINY_GSM_MODEM_SIM7080

#include <M5Core2.h>
#include <TinyGsmClient.h>

// APN設定
const char APN[] = "mobiledata.ntt.com";
const char LTE_USER[] = "";
const char LTE_PASS[] = "";

TinyGsm modem(Serial2);
TinyGsmClient client(modem);

// モデムの初期化
void initSim(){
    // シリアル通信の開始
    Serial2.begin(115200, SERIAL_8N1, 33, 32);
    delay(6000);

    // モデムの初期化
    Serial.println("Initializing modem...");
    if(!modem.init())
    {
        Serial.println("Failed to restart modem.");
    }

    // モデムの情報を表示
    String modemInfo = modem.getModemInfo();
    Serial.println("modem.getModemInfo()");
    Serial.println(modemInfo);

    // SIMカードのチェック
    Serial.println("Checking SIM card...");
    if (!modem.getSimStatus()) {
        Serial.println("SIM card not inserted.");
        return;
    }

    // ネットワークモードと優先モードの設定
    const int NETWORK_MODE = 2;   // 2: Automatic, 13: GSM only, 38: LTE only, 51: GSM and LTE only
    const int PREFERRED_MODE = 1; // 1: CAT-M only, 2: NB-IoT only, 3: CAT-M and NB-IoT
    bool result;
    
    do {
        result = modem.setNetworkMode(NETWORK_MODE);
        Serial.println("Setting network mode to " + String(NETWORK_MODE) + ": " + (result ? "OK" : "NG"));
        delay(500);
    } while (!result);

    do {
        result = modem.setPreferredMode(PREFERRED_MODE);
        Serial.println("Setting preferred mode to " + String(PREFERRED_MODE) + ": " + (result ? "OK" : "NG"));
        delay(500);
    } while (!result);

    // ネットワークへの接続待ち
    Serial.println("Waiting for network...");
    if (!modem.waitForNetwork()) {
        Serial.println("Failed to connect to network.");
        return;
    }

    // ネットワークへの接続状態を表示
    Serial.println("Network connected: " + String(modem.isNetworkConnected()));

    // APNへの接続
    Serial.println("Connecting to APN: " + String(APN));
    if (!modem.gprsConnect(APN)) {
        Serial.println("Failed to connect to APN.");
        return;
    }

    // GPRSへの接続状態を表示
    Serial.println("GPRS connected: " + String(modem.isGprsConnected()));

    // SIMカード、IMEI、オペレーター、ローカルIP、信号強度などの情報を表示
    Serial.println("SIM CCID: " + modem.getSimCCID());
    Serial.println("IMEI: " + modem.getIMEI());
    Serial.println("Operator: " + modem.getOperator());
    Serial.println("Local IP: " + modem.localIP().toString());
    Serial.println("Signal quality: " + String(modem.getSignalQuality()));

}

void setup(){
    M5.begin(true, true, true, false);
    initSim();
}

void loop(){
    Serial.print(".");
    delay(5000);
    M5.update();
}
```

# その他の注意点
* SIMカードの方向
表裏の両面もそうですが、カードの切り欠きの位置にも注意して下さい。
自分だけかもしれないですが、それを間違えていて、しばらく苦戦していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/a6256535-2920-ffc0-ecbd-a6f055abc42f.png)

# 終わりに
個人的には、使うサービスはどこでも良いのですが、いろいろ選択できた方が自由度が高いので、IoT Connect Mobile Type Sで動作することが確認できたのは良かったです。
ここまで来ると、1NCEも使ってみたくなりますね。