山行記録のための行動ログを取りたい① Seeeduino XIAO Expansion Board + Air530

スポンサーリンク
スポンサーリンク

行動ログ

最近登山が趣味に追加されたことにより、休みの日はアホみたいに山に行っている。行ってて写真撮ったりはするんだけど、そのうちもっと記録取ってみたいなと思うようになってきた。世間様ではGPSロガーやスマホアプリを使って記録を取ったり、遭難防止に役立てているらしい。まぁ自分は初心者が行くような山ばっかなのでいらんのかもしれんけど、単純にやってみたいの。

スポンサーリンク

何を使おう

どうしたいかというと、とりあえずGPSのログが取れるようにしたい。だからGPSモジュールがつなげて、SDカード等に保存できるようなやつがいい。でなんかないかなーと探してたら

Seeed Studio Expansion Board Base for XIAO with Grove OLED - IIC, Uart, Analog/Digital
Seeed Studio XIAO Expansion Board is a powerful functional expansion board for Seeed Studio XIAO series of only half Ras...

Seeeduino XIAO用の拡張ボードが出ていた。SDカードも使えるし、何ならディスプレイもついてる。これにしよう、キミに決めた。

スポンサーリンク

Seeed Studio Expansion Base for XIAO with Grove OLED – IIC, Uart, Analog/Digital

はい。ちなみにSeeduinoXIAOがないと使えない。Seeed Studio XIAO SAMD21, Seeed Studio XIAO RP2040, Seeed Studio XIAO nRF52840, Seeed Studio XIAO nRF52840 Senseに対応している。(ESP32に未対応)

wiki

Expansion Board Base for XIAO | Seeed Studio Wiki
Seeed Studio XIAO Expansion board

pinout

スポンサーリンク

Grove – GPS (Air530)

Grove - GPS (Air530),GPS location, Long-distance communication
Grove-GPS (Air530) is a high-performance, highly integrated multi-mode satellite positioning and navigation module, supp...
Grove - GPS (Air530) | Seeed Studio Wiki
Confused of your GPS not working well in urbans or outsides under only one or few statelite module? Then you should not ...

GPSは安めのこれにしてみた。Groveなので接続も楽ちん。ではさっそくコード書いてく。

スポンサーリンク

UARTでモジュールからデータを取得

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 6);

void setup() {
  Serial.begin(57600);
  while (!Serial) {
    ;
  }

  mySerial.begin(9600);
}

void loop() {
  while (mySerial.available() > 0) {
    char c = mySerial.read();
    Serial.print(c);
  }
}

IDE(PC)との通信でSerialを使い、SoftwareSerialでGPSモジュールと通信する感じ?そうするとシリアルモニタに

ていう風に表示されていく。これが何かというとNMEAセンテンスというものらしい。詳しい内容は

GPS - NMEA sentence information

とか見たらいいと思う。で、これだけだとなんのこっちゃわからないので、解析してくれるライブラリがある。それがTinyGPS++ってやつ。

スポンサーリンク

TinyGPS++を使用

TinyGPS++ | Arduiniana

こちらを使うとGPSデータを扱いやすくしてくれる。コードを追記すると

#include <SoftwareSerial.h>
#include "TinyGPS++.h"

TinyGPSPlus gps;
SoftwareSerial mySerial(7, 6);

void setup() {
  Serial.begin(57600);
  while (!Serial) {
    ;
  }

  mySerial.begin(9600);
}

void loop() {
  while (mySerial.available() > 0) {
    gps.encode(mySerial.read());
    if (gps.location.isUpdated()) {
      Serial.print("LAT=");
      Serial.println(gps.location.lat(), 6);
      Serial.print("LONG=");
      Serial.println(gps.location.lng(), 6);
      Serial.print("ALT=");
      Serial.println(gps.altitude.meters());
    }
  }
}

すると

ばっちし表示された!すごい簡単。同様に

if (gps.date.isUpdated()) {
      Serial.print("VAL=");
      Serial.println(gps.date.value());
      Serial.print("YEAR=");
      Serial.println(gps.date.year());
      Serial.print("MON=");
      Serial.println(gps.date.month());
      Serial.print("DAY=");
      Serial.println(gps.date.day());
    }

だと

日付が取得できるし

if (gps.time.isUpdated()) {
      Serial.print("VAL=");
      Serial.println(gps.time.value());
      Serial.print("HOUR=");
      Serial.println(gps.time.hour());
      Serial.print("MIN=");
      Serial.println(gps.time.minute());
      Serial.print("SEC=");
      Serial.println(gps.time.second());
    }

こうだと

時刻が取得できる。よいですね。これらを組み合わせると

if (gps.time.isUpdated() || gps.date.isUpdated() || gps.location.isUpdated()) {
      Serial.print(gps.date.year());
      Serial.print("/");
      Serial.print(gps.date.month());
      Serial.print("/");
      Serial.print(gps.date.day());
      Serial.print(" ");
      Serial.print(gps.time.hour());
      Serial.print(":");
      Serial.print(gps.time.minute());
      Serial.print(":");
      Serial.print(gps.time.second());
      Serial.print(",");
      Serial.print(gps.location.lat(), 7);
      Serial.print(",");
      Serial.print(gps.location.lng(), 7);
      Serial.print(",");
      Serial.println(gps.altitude.meters());
    }

こうとか。そしたら

 

おーCSVっぽい。いい感じですね。とりまここまで!

コメント

タイトルとURLをコピーしました