ライブラリのインストール
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センサから緯度・経度の情報を取得した様子