Intern

M5Stackで取得したGPSデータをLTE通信で確認する方法

はじめに

 今回は「M5Stack Basic V2.7」と「CatM + GNSS」を使用して取得したGPS(位置情報)をLTE通信で確認する方法を紹介する。
 ※SIMカードがないため、実際の実装はしていない。

 前回の記事ではシリアル通信でデータを取得する方法をまとめている、今回の記事ではLTE通信で行う場合の変更点のみを紹介するため、大部分を抜粋している。

M5StackとCatM+GNSSモジュールで取得した位置情報をMQTTでNode-REDに送る 目次 ・はじめに ・使用デバイス ・接続方法 ・Node-REDのフロー ・実行結果 ...

LTE通信の設定(変更点)

 ハードウェア接続

 1. CatM+GNSSにLTEアンテナを取り付ける

 2. CatM+GNSSにSIMカードを挿入する

 コード概要

#include <M5Stack.h>
#include <TinyGsmClient.h>
#include <PubSubClient.h>

// GPRS認証情報
const char apn[] = "your_apn";  // 使用するAPNに置き換えてください
const char gprsUser[] = "";     // 必要なければ空のままでOK
const char gprsPass[] = "";     // 必要なければ空のままでOK

// MQTT設定
const char* mqtt_server = "your_mqtt_server"; // MQTTブローカーのIPアドレスまたはホスト名
const char* mqtt_topic = "/m5stack/gps";  // MQTTトピック

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

// GPSモジュールとのシリアル接続を定義
#define SerialGPS Serial2

void setup_modem() {
  Serial.println("モデムを初期化しています...");
  modem.restart();

  // 必要に応じてSIMカードのPINを解除します
  // modem.simUnlock("1234");

  Serial.print("ネットワークを待っています...");
  if (!modem.waitForNetwork()) {
    Serial.println(" 失敗");
    while (true);
  }
  Serial.println(" 成功");

  Serial.print(F("APNに接続しています: "));
  Serial.print(apn);
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    Serial.println(" 失敗");
    while (true);
  }
  Serial.println(" 成功");

  if (modem.isGprsConnected()) {
    Serial.println("GPRSに接続されました");
  }
}

void reconnect() {
  // 再接続ループ
  while (!client.connected()) {
    Serial.print("MQTT接続を試みています...");
    // 接続を試みる
    if (client.connect("M5StackClient")) {
      Serial.println("接続されました");
    } else {
      Serial.print("失敗, rc=");
      Serial.print(client.state());
      Serial.println(" 5秒後に再試行します");
      // 再試行まで5秒待機
      delay(5000);
    }
  }
}

void setup() {
  M5.begin();
  Serial.begin(115200); // デバッグ用シリアル通信
  SerialGPS.begin(9600, SERIAL_8N1, 16, 17); // GPSモジュールとのシリアル接続設定

  Serial.println("GPSモジュールを初期化しています...");

  // GPSモジュールの初期化
  SerialGPS.println("AT+CGNSPWR=1"); // GNSS電源をオンにする
  delay(1000);
  while (SerialGPS.available()) {
    char c = SerialGPS.read();
    Serial.print(c);
  }
  Serial.println();

  SerialGPS.println("AT+CGNSSEQ=\"RMC\""); // GNSS出力シーケンスを設定
  delay(1000);
  while (SerialGPS.available()) {
    char c = SerialGPS.read();
    Serial.print(c);
  }
  Serial.println();

  Serial.println("GPS初期化完了");

  setup_modem();
  client.setServer(mqtt_server, 1883);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  SerialGPS.println("AT+CGNSINF"); // GNSS情報を照会
  delay(1000);

  String gpsData = "";
  while (SerialGPS.available()) {
    char c = SerialGPS.read();
    gpsData += c;
  }

  if (gpsData.length() > 0) {
    Serial.println("データを受信しました:");
    Serial.println(gpsData);

    // 受信データの解析
    if (gpsData.startsWith("AT+CGNSINF")) {
      int index = gpsData.indexOf(":");
      if (index != -1) {
        String gpsInfo = gpsData.substring(index + 1);
        String jsonPayload = parseGPSData(gpsInfo);

        // MQTTメッセージの送信
        client.publish(mqtt_topic, jsonPayload.c_str());

        // デバッグ用にシリアル出力
        Serial.println("GPSデータを送信しました:");
        Serial.println(jsonPayload);
      }
    } else {
      Serial.println("有効なGPSデータがありません");
    }
  }
  delay(5000); // 5秒待機後、再度照会
}

String parseGPSData(String gpsInfo) {
  gpsInfo.trim();
  String data[20];
  int index = 0;

  while (gpsInfo.length() > 0 && index < 20) {
    int commaIndex = gpsInfo.indexOf(",");
    if (commaIndex == -1) {
      data[index++] = gpsInfo;
      break;
    } else {
      data[index++] = gpsInfo.substring(0, commaIndex);
      gpsInfo = gpsInfo.substring(commaIndex + 1);
    }
  }

  String jsonPayload = "{";
  jsonPayload += "\"latitude\": " + data + ",";
  jsonPayload += "\"longitude\": " + data + ",";
  jsonPayload += "\"altitude\": " + data[5] + ",";
  jsonPayload += "\"speed\": " + data[6];
  jsonPayload += "}";

  return jsonPayload;
}

 コードの説明

  GPRSの設定
  ・使用するAPNに合わせた設定を行う

  ・ MQTTサーバーの設定をする

  ・その他Wifiからモデムの設定に変更する

Node-REDでデータを確認

 ・サーバをLTEでデータを飛ばしたMQTTブローカーのIPアドレスに変更する