Posts 緯度と経度を取得しよう
Post
Cancel

緯度と経度を取得しよう

この記事で使うソースコード

ライブラリのインストール


GPSセンサの値を取得しようでGPSセンサが受信する値を取得しました。

受信した値は、緯度経度等の情報を含む文字の羅列でした。 CanSatの制御プログラムを書いていく上では、ここから必要な情報を取り出す必要があります。

CanSatの誘導においてGPSセンサから取得した値のうち、緯度と経度の情報を使う場合が多いです。 ここでは、ライブラリを使ってGPSセンサが受信した値から、緯度と経度を取得していきます。

最初にhttps://github.com/mikalhart/TinyGPSPlusのGitHubリポジトリからライブラリをインストールしましょう。 リポジトリからZIPファイルをダウンロードして、Arduino IDEにインポートします。 インストールの詳しい方法は9軸センサの値を取得しようで詳しく説明しています。

緯度・経度を取得するプログラムを作成する


ライブラリのインストールが完了したら、緯度・経度を取得するプログラムを作成していきます。 まずはライブラリをincludeします。 TinyGPSPlus gpsはTinyGPSPlusのインスタンスを生成しています。 gps.location.lat()のようにメソッドにアクセスして緯度を取得できます。

GPSセンサとマイコンの通信にハードウェアシリアルを使用するのはGPSセンサの値を取得しようと同じです。

1
2
3
4
5
#include <TinyGPS++.h>

static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
HardwareSerial ss(2);

setup関数ではソフトウェアシリアルとハードウェアシリアルのボーレートを設定しています。 今回はGPSセンサとの通信に用いるハードウェアシリアルのボーレートをGPSBaudという変数に定義してみました。 static constを宣言しているので、GPSBaudは定数になります。 よく使う変数は定数としてこのように定義することもできます。

1
2
3
4
5
6
void setup() {
  Serial.begin(115200);
  ss.begin(GPSBaud);

  Serial.println("GPS start!");
}

loop関数を見ていきましょう。 ss.read()でGPSセンサから読み取った値をchar型の変数cに代入して、gps.encode()の引数として渡しています。

GPSセンサから取得できる値はNMEAフォーマットの情報となっています。 1行が$GPGGA,061251.000,3542.0553,N,...のように先頭が「$」で始まり、「改行文字(\r\n)」で終わります。 各行は「,」で区切られています。 gps.encode()メソッドはNMEAフォーマットの文字列をパースする役割をしています。

GPSセンサから更新された位置情報を取得するとgps.location.isUpdated()からtrueが返ってきて、gps.location.lat()で緯度の値を、gps.location.lng()で経度の値をそれぞれ取得できます。

1
2
3
4
5
6
7
8
9
10
void loop() {
  while(ss.available() > 0){
    char c = ss.read();
    gps.encode(c);
    if(gps.location.isUpdated()){
      Serial.print("Lat=\t");   Serial.print(gps.location.lat(), 6);
      Serial.print(" Lng=\t");   Serial.println(gps.location.lng(), 6);
    }
  }
}

緯度経度が取得できると、シリアルコンソールに緯度経度の値が出力されます。

gps-lat-lng GPSセンサから緯度・経度の情報を取得した様子

This post is licensed under CC BY 4.0 by the author.

9軸センサの値を取得しよう

GPSセンサで取得した位置情報をGoogleマップに描画しよう