はじめに
今回は「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アドレスに変更する
