行動ログ
最近登山が趣味に追加されたことにより、休みの日はアホみたいに山に行っている。行ってて写真撮ったりはするんだけど、そのうちもっと記録取ってみたいなと思うようになってきた。世間様ではGPSロガーやスマホアプリを使って記録を取ったり、遭難防止に役立てているらしい。まぁ自分は初心者が行くような山ばっかなのでいらんのかもしれんけど、単純にやってみたいの。
何を使おう
どうしたいかというと、とりあえずGPSのログが取れるようにしたい。だからGPSモジュールがつなげて、SDカード等に保存できるようなやつがいい。でなんかないかなーと探してたら
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
pinout
Grove – GPS (Air530)
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センテンスというものらしい。詳しい内容は
とか見たらいいと思う。で、これだけだとなんのこっちゃわからないので、解析してくれるライブラリがある。それがTinyGPS++ってやつ。
TinyGPS++を使用
こちらを使うと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っぽい。いい感じですね。とりまここまで!
コメント