はじめに
今回は「M5Stack Basic V2.7」と「CatM + GNSS」を使用してGPS(位置情報)を取得する方法を紹介する。
・M5StackをArduino IDEで動かす方法については過去の記事を参照

M5Stackとは何か、何ができるか
目次
・M5Stackとは?
・M5Stackの中身
・使用方法
・活用例
M5Stackと...

M5StackをArduino IDEで動かす
目次
・はじめに
・使用デバイス
・Arduino IDEのインストール
・BOARDS MANAGERの設定
...
使用デバイス
M5Stack Basic V2.7

・M5Stackの2.7バージョン、CatM+GNSSモジュールとの通信を管理し、取得したGPSデータを処理・表示する中心的な役割を担う。
CatM + GNSSモジュール

・CatM+GNSSモジュールは、LTE Cat-M1通信とGNSS(GPS)機能を統合したモジュールであり、低消費電力で広域通信が可能なため、IoTデバイスに最適なモジュールとなっている。今回はGPS衛星から位置情報を取得し、そのデータをM5Stackに送信する役割を担う。
接続方法
全体構成

ハードウェア接続
1. PCとM5StackをTypeC-USBで接続
2. GROVEオス-メスケーブルを使用してM5StackとCatM+GNSSを接続

3. CatM+GNSSに9~24Vの電源・GPSアンテナ・LTEアンテナを繋げる
コード概要
#include <M5Stack.h>
#include <Wire.h>
// GPSモジュールとのシリアル接続を定義
#define SerialGPS Serial2
void setup() {
M5.begin(); // M5Stackの初期化
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初期化完了");
}
void 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);
parseGPSData(gpsInfo);
}
} else {
Serial.println("有効なGPSデータがありません");
}
}
delay(5000); // 5秒待機後、再度照会
}
void parseGPSData(String gpsInfo) {
gpsInfo.trim();
String data[10];
int index = 0;
while (gpsInfo.length() > 0 && index < 10) {
int commaIndex = gpsInfo.indexOf(",");
if (commaIndex == -1) {
data[index++] = gpsInfo;
break;
} else {
data[index++] = gpsInfo.substring(0, commaIndex);
gpsInfo = gpsInfo.substring(commaIndex + 1);
}
}
Serial.println("解析されたGPSデータ:");
for (int i = 0; i < index; i++) {
Serial.print("データ[");
Serial.print(i);
Serial.print("]: ");
Serial.println(data[i]);
}
// GPS情報の表示
if (index >= 7) {
String latitude = data
;
String longitude = data
;
String altitude = data[5];
String speed = data[6];
Serial.print("緯度: ");
Serial.println(latitude);
Serial.print("経度: ");
Serial.println(longitude);
Serial.print("高度: ");
Serial.println(altitude);
Serial.print("速度: ");
Serial.println(speed);
// M5Stackのディスプレイに表示
M5.Lcd.clear();
M5.Lcd.setCursor(0, 0);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("緯度: %s\n", latitude.c_str());
M5.Lcd.printf("経度: %s\n", longitude.c_str());
M5.Lcd.printf("高度: %s\n", altitude.c_str());
M5.Lcd.printf("速度: %s\n", speed.c_str());
} else {
Serial.println("無効なGPSデータ形式");
}
}
コードの説明
- 初期設定:
M5.begin()
でM5Stackを初期化。Serial.begin(115200)
データ転送速度SerialGPS.begin(9600, SERIAL_8N1, 16, 17)
UART通信で実装するため、16/17Pinに設定する
- GPSモジュールの初期化:
SerialGPS.println("AT+CGNSPWR=1")
でGNSSの電源をオンに。SerialGPS.println("AT+CGNSSEQ=\"RMC\"")
でGNSS出力のシーケンスを設定。
- データ取得ループ:
SerialGPS.println("AT+CGNSINF")
でGNSS情報を要求。- 取得したデータを解析し、緯度、経度、高度、速度などの情報を表示。
実行結果
Arduino IDEの画面

緯度(Latitude):35.678227
経度(Longitude):139.687100
高度(Altitude):42.436
速度(Speed):0.00
・電波が届かない室内などではデータが取得できない場合がある
・TypeCケーブルの表裏の向きを逆に差すことでデータが取得できるようになる場合がある
取得した位置データをGoogleMapで確認
