Arduino(マイコン)からGPSセンサー(モジュール)使ってみました。使用したのは秋月で売っているGPSモジュール(GYSFDMAXB)です。「みちびき」にも対応
とりあえず今回は、GPSセンサーの設定を少し変更して、欲しい情報のみを取得、精度を確認するところまでやってみました。
こういったセンサー類は昔に比べるとずいぶん安くなってきてますが、GPSは私にとってはまだ少し高いですね。
とりあえず情報を取得してみる
▼届いたGPSモジュール▼
半田付け後の写真です。届いた時にはヘッダーピンと、裏にある電池ホルダーは半田していない状態でした。自分で半田付けが必要です。
電池は衛星情報や各種情報をバックアップしておくもので、必要ないなら付けなくてもいいです。ただ、再電源投入時が常にコールドスタートとなるため起動が遅くなるようです。
▼さっそくArduinoと繋いで使ってみました▼
▼繋ぎ方は簡単▼
Arduino 5V <==> GPS 5V Arduino TX ==> GPS RX Arduino RX <== GPS TX Arduino GND <==> GPS GND
で繋ぐだけで良いのですが「UNO 5V」に対して、「GPSモジュール 3.3V仕様」のため、Arduino TX==> GPS RXは直接繋ぐと 壊れてしまう可能性があります。
(秋月の販売ページのマニュアルに繋ぎ方が載ってます)
とりあえずGPSから情報を読み取るだけなら「Arduino TX==> GPS RX」は繋が無くてもO.Kでした。ですので3本のラインだけです。GPSとの接続はソフトウェアシリアルで行ってます。
まずGPSから流されてくる情報をシリアルモニターで表示してみました。
▼使用したスケッチはこんな感じ(抜粋)▼
void loop() { if (mySerial.available()) { Serial.write(mySerial.read()); } }
ループでシリアル通信を垂れ流してるだけです・・。
▼GPSから受信した情報▼
デフォルトでは1秒おきにGPS情報が更新されるようです。
NMEAフォーマットと呼ばれる形式で、「$GP**」などから始まるセンテンスと呼ばれる1行ごとの文字列がカンマ区切り形式で出力されます。それぞれいろいろな情報が載っています。
はじめて知ったのですが、GPSセンサーってこんなに大量な情報が取得できるのですね。ただこれだけの情報をシリアル通信(文字列)で受け取るとたいした処理時間がかかりそうです。
少しスケッチをいじってセンテンス(1行)ごとの取得時間を計測してみました。(挟んで計測してるだけなので大体です・・。)
▼センテンスごとの取得時間(9600bps)▼
Aruduinoでは受信バッファが(確か?)64byteのため、さっきのソースでは一瞬でバッファがいっぱいになってしまいます。ですので、シリアル通信にかかっているだけの処理時間なんですけどね・・・。9600bpsではこれくらいでしょうか。結構な情報量です。文字列なので状況で受信量(受信byte)は変動するでしょうし・・。
私にはいらない情報も多くあるので少しGPSセンサーの設定をいじって情報量を限定してみました。
GPSセンサーの設定変更
GPSセンサーの設定を変更するには、PMTKコマンドを送信してあげれば変更できるようです。
例えば通信ボーレートを4800bpsに変更する場合は、
$PMTK251,4800*14
などと、$PMTK***から始まる、書式に乗っ取ったコマンドを送信すれば設定を変更できます。
最後の*以降はチェックサムとなっており、$~*で挟まれている部分を排他論理和(XOR)し、16進数表記したものです。
ここに便利な計算機がありました。
PMTKの細かい書式等はGPSセンサーの仕様書を確認しましょう。
とりあえず、取得するセンテンス情報を自分に必要な情報のみに減らしてみました。
"$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"
上が出力するセンテンス情報を変更するコマンドです。ここでは$GPGGAと$GPRMCの情報のみを取得する設定です。緯度、経度、捕捉衛星数、移動速度・方向などの情報です。
あと更新頻度(1Hz~10Hz)やボーレートの設定など、その他にもいろいろ設定が変更できるようです。
とりあえず情報量を絞った設定で欲しい情報のみ取得してみました。
▼GPSからの情報▼
経度、緯度、速度など、、欲しい情報のみに受信データを加工して表示してます。今回は表示してませんが、受信している衛星番号も取得できます。
ちなみに「みちびき」初号機が193番できちんと受信してました。
文字列操作が結構めんどいですね。いろいろ工夫が必要そうです。
GPSの設定変更方法はこちらにもう少し詳しく投稿してます。
精度を確認してみる
取得した緯度、経度からGoogleMapで地図表示してみました。
▼GoogleMapでの検索画面▼
窓際です・・・。建物の中の細かい位置まであってます。こんな小さなモジュールですごいです。GoogleMapもすごいですが・・。
時間ができたらドローン(クアッドコプター)の制御プログラムに組み込んでみたいですね。
・参考・
とても分かり易く使い方やGPSについて解説されてます。(プチモンテ)
みちびき対応のGPS受信機(GYSFDMAXB)の使い方 [Arduino]
コメント
突然のコメントお許しください。
私は、これと同じGPSモジュールとArduino2台をXBeeを用いて遠隔通信でデータを取得できないか考えています。
ですが、XBeeの通信がうまくいかず、困っています。どうか、助けていただけないでしょうか。
GPSのデータを押しボタンスイッチを押したときだけ出力するようにしたいと思っています。
メールアドレスにご連絡いただければ、詳しい接続を教えますので、ご返信お待ちしています。
みっちゃんさん、はじめまして。
XBeeを用いての無線通信でしょうか。処理は単純そうなので実現は十分可能そうですが、
私がXBeeを使用したことがないんです・・。使いたいな、と思ったことはあるのですが・・。
力になれるかわかりませんが後ほどアドレスに連絡いたします。
はじめまして。貴殿のHPを参考にさせていただいております。
私もドロ-ン制御にGPS(NEO-6M)を使って位置制御を試みています。
しかしながら、精度が±3mくらいあり思うように空中で静止することが出来ません。
今回、紹介していただいているGPSモジュ-ルではどの程度の精度がありますでしょうか?
(パワ-を投入してから10分間程度の時間での位置精度)
感触でもご教示いただければ幸いです。
もしよさそうなら購入してみようかと考えおります。
まささん、はじめまして。サイト拝見下さり有難うございます。
GPS精度ですが、きっちり測定したことはないですが、±10mくらいはあったように感じます。ひどいときはもう少しあったかと・・。
回答ありがとうございます。やはりそうなんですね。高精度なRTK等のGPSは高額で
手が出ませんので今のものでもう少し頑張ってみたいと思います。ありがとうございます。