Intern

M5StackとCatM+GNSSモジュールを用いて位置情報を取得する

はじめに

 今回は「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データ形式");
  }
}

コードの説明

  1. 初期設定
    • M5.begin()でM5Stackを初期化。
    • Serial.begin(115200) データ転送速度
    • SerialGPS.begin(9600, SERIAL_8N1, 16, 17) UART通信で実装するため、16/17Pinに設定する
  2. GPSモジュールの初期化
    • SerialGPS.println("AT+CGNSPWR=1")でGNSSの電源をオンに。
    • SerialGPS.println("AT+CGNSSEQ=\"RMC\"")でGNSS出力のシーケンスを設定。
  3. データ取得ループ
    • SerialGPS.println("AT+CGNSINF")でGNSS情報を要求。
    • 取得したデータを解析し、緯度、経度、高度、速度などの情報を表示。

実行結果

Arduino IDEの画面

緯度(Latitude):35.678227
経度(Longitude):139.687100
高度(Altitude):42.436
速度(Speed):0.00

・電波が届かない室内などではデータが取得できない場合がある

・TypeCケーブルの表裏の向きを逆に差すことでデータが取得できるようになる場合がある

取得した位置データをGoogleMapで確認