Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

手作りGPSロガー 7回目 「GPS受信機」

f:id:miraluna:20180103123444j:plain:w300

完成プログラムはこちら


Mira f:id:miraluna:20180105114819j:plain:w30          🎀目次へ🎀

宇宙にある人工衛星と通信ができるなんて、すごい!

GPS = Global Positioning System

毎度お世話になっています。GPS受信機も秋月電子さん。

GPS受信機キット「みちびき」対応
[AE-GYSFDMAXB]

これは受信機。発信はしません。
衛星から発信された情報を受信して、現在位置を割り出します。高度も出せるし、狂いのない世界時計としての情報も得られるの。

今回はシンプルに緯度と経度だけ得ることにした。
+βの記事では「高度」も記録します。)

ところで昨年「みちびき」が4号機まで打ち上げられましたね。
今年2018年から運用が始まるようで、日本・オセアニアではいつも1機以上のみちびきが空の見えるところにいるそうです。アメリカのGPSだけだと誤差が数mあるけど、みちびきが補強すれば誤差は数cmだって! なんだか怖いくらいの精度。

ルナがこのGPSロガーを持って旅をしたのはヨーロッパだけど、これから精度の高い情報を得られるのが楽しみ。

f:id:miraluna:20180103123849j:plain:w300


〇つなぎ方

まずはGPS受信機とみつは(ATmega328)のつなぎ方を紹介します。

GPSモジュールは他のものにも流用できるように、取り外しが可能な組み込み方にしました。上の写真の右のほうにぶら下がってるのがそう。ピンソケットで抜き差しするようにしてあるの。

配線端子は5つあるんだけど、「1pps」というのは正確な1秒間を得るときに使うものなので、今回は配線しません。なので配線は4本。

・5v電源         5vのプラス電源につなぎます。
・GND           マイナス電源につなぎます。
・(GPS側) RX(データ入力)  みつはのD8ピン(みつはのTX)※  
・(GPS側) TX(データ出力)  みつはのD9ピン(みつはのRX)

GPS側のRX線にはダイオード(電流を一方通行にするため)と
 抵抗をはさんで3.3v電源をとります。以下の図参照。
f:id:miraluna:20180109115908p:plain:w300

説明書ではみつは側のTXとRXがD0とD1になってるけど、私はD8とD9を使った。プログラムを書くときに指定すれば平気。
なるべく配線がすっきりするようにね。はんだ初心者は苦労も多いの。

それから電源なんだけど、5vになってるわよね。指定電圧は3.8v~12vなの。だから5vへの昇圧を考えていたんだけど、データシートを見ると3.7vでもいけそうな気がして。それでブレッドボード上での試験運転でも3.7v電源で十分機能してたから、そのまま実装しちゃった(*'v`*)
その後安定して機能してます。
(より安定した動作を求める方は5vの確保を。)


〇プログラム

ここからはGPSの情報を得るプログラムです。

スケッチではTinyGPS++というライブラリを使います。
ライブラリについては ↓こちらを見てね。
手作りGPSロガー プラスαの2回目 「Arduinoでライブラリを使うための準備」 - Mira&Luna's nursery lab

Arduinoに通信用のプログラムを書き込んで。

//例:)
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

const int rx=8,tx=9;     //接続したrxとtx 逆にならないように注意
TinyGPSPlus gps;
SoftwareSerial ss(rx,tx);

void setup() {
Serial.begin(9600);   //Arduino通信速度 
ss.begin(9600);    //GPSの通信速度は受信機の説明書を読んでね
}


void loop() {
while (ss.available()>0){   //GPSが衛星からのデータを受信しているとき
char c = (ss.read());    //データを読む
gps.encode(c);      //データを解読
Serial.print(c);       //シリアルモニタに表示する
}
}


〇さあ、衛星を補足しましょう

GPS受信機をArduinoにつないでシリアル通信を始めるとき、初めは衛星を補足するために空の見えるところに置いておきます。
どのくらい置けばいいのか分からなかったから、私はGPSをもって河原を散歩した。するとLEDがチカチカし始めて、GPSを補足したことを教えてくれる。
初めてチカチカしたときは嬉しくて、走って帰った。一度しっかりと捉えれば受信機が位置を計算して、次回からは1分もしないで補足できるようになるんだって。
私も何回も繰り返しやってるうちに、電源を入れてから40秒くらいで補足するようになった。

受信機が衛星を捉えたらパソコンにつないで通信してみる。
Arduinoのプログラムから、虫眼鏡のマークのシリアルモニタを開く。
うまくいっていれば、1秒ごとにデータが表示されるはず。

どんどんどんどん。不可解な文字列が......。  で、これをどうすればいいか。

送られてくるデータはNMEAフォーマットというもので、$マークごとに違う情報(センテンス)が区切られています。
$GPVTG,.......
$GPRMC,.....
$GPGGA,..... etc....
さらにそのセンテンスはコンマ「,」でデータの内容が区切られています。

GPRMCを例に見てみましょう。

$GPRMC,050841.053,A,35.658581, N,139.745433,E,000.0,115.4,100118,,,A*6A

というセンテンスだった場合、

$       ここから始まる
GP      GPSのデータ
RMC     RMCのセンテンス
050841.053  おーこれは良いお子さん ではなく、世界時刻。
       5時8分41秒053。hh mm ss.sssです。日本はこれに+9時間する。
A      有効。Vは有効でない。
35.658581  緯度
N      北緯
139.745433  経度
E      東経
000.0    移動速度(ノット)
115.4    移動方位
100118   世界日時。2018年1月10日。 dd mm yyです。
A       測位モード。ごめんなさい、よくわからないの。
*6A     チェックサム。6A 。

こんなふうに情報が書かれていて、改行で次のセンテンスになる。

こうしてシリアル通信で情報は得られるんだけど、情報量が多いし、重複するものもあるし、安定して得るのが難しいデータもあるので、ほしい情報だけとりましょう。
RMCでは緯度経度や時刻はわかるけど、高さはわからないからGGAから取るとか、速度をkm/hで知りたいから速度はVTGから取るとか、ほしい情報によって必要なセンテンスも変わってきます。

はじめはここからデータを切り取ってSDカードに記録しようとしていたの。でも、TinyGPS++というライブラリを使うととてもシンプルに主な情報を取ることができるから、途中からそっちを使うことにした。

例えば、
緯度情報を得るには

String(gps.location.lat(),6);

だけで十分だし、
経度なら

String(gps.location.lng(),6);

これだけ。簡単でしょ。


緯度経度を記録するプログラムは、最後の完成したプログラムで紹介します。
(高度を記録するプログラムは、+βの記事で紹介します。)


さあ、ここまでくればあと少し。  次回は実装!

  の前に、ATmega328/168/88 をArduinoでプログラムを書き込める状態にして、マイクロコンピュータを単独で(Arduinoから離して)使えるようにするやり方を紹介したいと思います。


続く。


6回目」へ        「8回目」へ

       ★目次へ