サークルのほうで、GPSを使って面白いことができたらいいと思ったので、ちょっと使ってみました。

 秋月でGPSモジュールを検索したら「みちびき」対応のものがあったので、それを買ってきて使うことにしました。

・回路
 今回はアナログシリアルを使ったことや1PPSを使わなかったため、入っている説明書とは少し違う回路になってます。
 説明書ではTXとRXになっている所を今回はDIGITALピンの3,2ピンに接続しています。

・プログラム
 ネットで見つけたプログラムを改良して使っています。ゴリ押しで速度を出しているのでプログラムが汚いですが、そこには目を瞑ってください...
#include <SoftwareSerial.h>
#include <math.h>
 
// rxPin = 2  txPin = 3
SoftwareSerial mySerial(2, 3);
 
// NMEAの緯度経度を「度」(DD)の文字列に変換する
String NMEA2DD(float val) {
  int d = val / 100;
  int m = (((val / 100.0) - d) * 100.0) / 60;
  float s = (((((val / 100.0) - d) * 100.0) - m) * 60) / (60 * 60);
  return String(d + m + s, 6);
}
 
// UTC時刻から日本の標準時刻に変換する(GMT+9:00)
String UTC2GMT900(String str) {
  int hh = (str.substring(0,2).toInt()) + 9;
  if(hh > 24) hh = hh - 24;
 
  return String(hh,DEC) + ":" + str.substring(2,4) + ":" + str.substring(4,6);  
}
 
  float ai,bi,di;//緯度の状態
  float ak,bk,dk;//経度の状態
  float fi=294.2940886111111;//緯度一分当たりの距離
  float fk=295.2841203703704;//経度一分当たりの距離
  float dmi,dmk,def;//移動距離
void setup() {
  mySerial.begin(9600);
  Serial.begin(115200);
}
void loop() {
  // 1つのセンテンスを読み込む
  String line = mySerial.readStringUntil('\n');
 
  if(line != ""){
    int i, index = 0, len = line.length();
    String str = "";
  
    // StringListの生成(簡易)
    String list[30];
    for (i = 0; i < 30; i++) {
      list[i] = "";
    }
 
    // 「,」を区切り文字として文字列を配列にする
    for (i = 0; i < len; i++) {
      if (line[i] == ',') {
        list[index++] = str;
        str = "";
        continue;
      }
      str += line[i];
    }
    
    // $GPGGAセンテンスのみ読み込む
    if (list[0] == "$GPGGA") {
      
      // ステータス
      if(list[6] != "0"){      
        // 現在時刻
        Serial.println(UTC2GMT900(list[1]));
        
        //緯度
        bi =list[2].toFloat();
        di = bi - ai;
        dmi = di * fi;
        Serial.print(" 緯度:");
        Serial.println(NMEA2DD(list[2].toFloat()));

        //経度
        bk =list[4].toFloat();
        dk = bk - ak;
        dmk = dk * fk;
        Serial.print(" 経度:");
        Serial.println(NMEA2DD(list[4].toFloat()));

        //速度
        def=sqrtf(dmi*dmi + dmk*dmk);
        Serial.print("速度:");
        Serial.println(def);
        
      }else{
        Serial.print("測位できませんでした。");
      }
      
      Serial.println("");
      ai =bi;
      ak =bk;
    }
  }
}


・動作
 GPS信号を扱っている関係で、出力に緯度と経度が乗ってしまうので画像は上げられないのですが、速度を出力することは一応できました。しかし、等速に移動しているときでも結構表示される速度に違いが出てしまいました。


 今回は、精度の良いGPS信号を得ることができていたのに、あまりそれを活用することができませんでした。このモジュールは10Hzで信号を出すことができるので、それを利用してもっと複雑な処理をすれば精度が上がると思います。
 すぐ改良したいのですが、大学が始まってしまって忙しくなってしまったので今回はここまで、それではまた今度。