GPSロガー改良 #01

大雪山に持っていったGPSロガーで録ったデータですが、データの欠損がそこそこありました。受信状態は悪くなかったはずなので、何か他に原因があるのではないかと考えています。GPSモジュールからの信号はシリアルで受け取りますが、いつ何バイト送られてくるかが決まっているわけではないので、SDカードに書き込むタイミングとの問題があるかな?と想像しています。

よく使われているTinyGPS++というライブラリがありますが、容量がそこそこ大きいので、のちのち、あれこれセンサーを載せたいと考えていたため、前回はライブラリは使わず、自分でパースしていました。きちんと動いていましたが、処理が最適とは思えないので、今回は、ひとまずライブラリを使って実装してみたいと思います。

前回持っていったロガーはこんな感じです。冷凍庫の実験で-35℃まで下げた結果、動作がおかしくなりましたが、常温で放置した結果、今のところ動いているようです。(このあたり、きちんと検証していくためにも、まずきちんとモニタリングできる低温環境を作らなければなりません...)

デバッグ用にLEDがついてます。

ひとまず、ライブラリを使って受信するところまでのコード。

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

#define SERIAL_BAUD 9600

const int GPS_RX = 8;
const int GPS_TX = 9;


TinyGPSPlus gps;
SoftwareSerial gpsSerial(GPS_RX, GPS_TX);


void setup() {

  Serial.begin(SERIAL_BAUD);
  while (!Serial) {} // wait
  Serial.println("serial initialized\n");

  gpsSerial.begin(9600);

}

void loop() {

  while (gpsSerial.available() > 0) {
    char c = gpsSerial.read();
    Serial.print(c);

    gps.encode(c);
    if (gps.location.isUpdated()) {
      Serial.print("lat : "); Serial.println(gps.location.lat(), 6);
      Serial.print("lng : "); Serial.println(gps.location.lng(), 6);
      Serial.print("alt : "); Serial.println(gps.altitude.meters());
    }
  }
}

シリアルモニターに返ってきているのを確認できました。

次回、SDカードに書き込む部分を追加していきますが、ここでタイミングを考えないと前回と同じ結果になる気がします。ひとまず、一定間隔で書き込むのではなく、受信できているときだけ、緯度/経度/高度をSDカードに書き込んでみたいと思います。