今回は、GPSモジュールを使ってArduinoで位置情報を取得してみます。
目次
- GPSのしくみについて
- GPSモジュールについて
- 回路とプログラムの作成
- ライブラリを使って位置情報を整える
- まとめ
1.GPSのしくみについて
GPSという言葉自体はスマートフォンやカーナビなどで一般的な生活の中でもよく耳にする単語だと思います。なんとなくイメージでは「地球の周りをぐるぐる回っている衛星からの電波で位置がわかるんでしょ?」という感じだと思います(筆者だけ?)。実際どのようなしくみでGPSは衛星から位置情報をどうやって知ることができるのでしょうか?
GPSのしくみは簡単に説明すると、上記図のように、地球上にたくさん回っているGPSで利用できる衛星からの電波を利用して、その衛星からの距離をもとに自分自身の位置情報を取得することができるしくみです。2009年12月の情報ではGPS衛星は31機(wikipedia)で、それ以降も衛星の打ち上げは各国で行われていて、日本国内の測量で利用できる衛星の数は大体50個前後らしいです。ただし、実際には地球の裏側を回っていたりするので、私たちの上空に位置する衛星の数は限られていて、その数が位置情報の精度に影響します。また、ビル街などのように電波を遮るものが多いところも衛星との通信電波が弱くなるため、精度が出ない、ということが多々あります。
2.GPSモジュールについて
今回利用するモジュールは「GPS受信機キット 1PPS出力付き 「みちびき」対応 [AE-GYSFDMAXB]」となります。「みちびき」対応とありますがどんなものなのでしょうか? まず「みちびき」を調べてみます。
準天頂衛星システム「みちびき」とは
みちびき(内閣府) – http://qzss.go.jp/overview/services/sv01_what.html
みちびき(準天頂衛星システム)とは、準天頂軌道の衛星が主体となって構成されている日本の衛星測位システムのことで、英語ではQZSS(Quasi-Zenith Satellite System)と表記します。ただし、「準天頂衛星」という場合には、準天頂軌道の衛星と静止軌道の衛星の両方を合わせて呼ぶため、準天頂軌道の衛星を区別する必要がある場合は「準天頂軌道衛星」といいます。
衛星測位システムとは、衛星からの電波によって位置情報を計算するシステムのことで、米国のGPSがよく知られており、みちびきを日本版GPSと呼ぶこともあります。-引用
上記トップページの説明にあるように、簡単に理解するならば日本版GPSということですね。さらに調べるとすでにみちびきは3基打ち上げられていて、2017年中には4基目も打ち上げ予定とのこと。この打ち上げが成功すれば常に日本の上空には2基以上の即位することができるようになって、なんと誤差は数cmの精度までになるとのこと。
今回は、そんな衛星の力をお借りしてArduinoでGPSを使って位置情報を取得してみたいと思います。
3.回路とプログラムの作成
GPSモジュールを利用するためにさっそく回路とプログラムを作成していきます。このモジュールはそのままArduinoに接続して利用することができるので、下記図の対応を見ながら接続していきます。
今回はソフトウェアシリアル通信を使ってモジュールと通信を試してみます。ファイルの「スケッチ例」から「SoftwareSerial」-「SoftwareSerialExample」を開き、Arduinoに書き込み動作させてみます。
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port mySerial.begin(9600); mySerial.println("Hello, world?"); } void loop() { // run over and over if (mySerial.available()) { Serial.write(mySerial.read()); } if (Serial.available()) { mySerial.write(Serial.read()); } }
書き込みが終わって、動作させると、シリアルモニター(通信レートは57600に設定)には何やらGPSモジュールからデータが返ってきていることがわかりますね。これがGPSの生データになります。
ひとまず、GPSモジュールから位置情報データらしきものが取得できることがわかりました!
でも、このままだとちょっと何をどう読んだらいいのかわかりませんね。
このGPSのデータの形式はNMEAフォーマットという形式で、その形式がわかれば理解することも可能なのですが、Arduinoのプログラムで扱うにはちょっと厄介ですので、ライブラリを使って手軽に扱えるようにしてみます。
4.ライブラリを使って位置情報を整える
NMEAフォーマットを手軽に扱うことができるArduino用のライブラリとして「TinyGPS++」を今回利用したいと思います。サイトのダウンロードボタンからライブラリのzipをダウンロードした後、「スケッチ」-「ライブラリをインクルード」-「.zip形式でライブラリを追加」から、ライブラリを追加してください。
このライブラリでは、下記のようにシリアル通信で受信したデータをエンコード関数で使いやすい形に変換することができます。
gps.encode([ソフトウェアシリアルからの受信データ]); if (gps.location.isUpdated()){ // GPS情報が正常に更新されていたら Serial.print("LAT="); Serial.println(gps.location.lat(), 6); //緯度情報を表示 }
先ほどのソフトウェアシリアルのプログラムのloop関数部分を主にこのライブラリの出力に変換してみたものが下記のプログラムになります。
#include <TinyGPS++.h> #include <SoftwareSerial.h> TinyGPSPlus gps; SoftwareSerial mySerial(10, 11); // RX, TX //TinyGPSCustom magneticVariation(gps, "GPRMC", 10); void setup() { // Open serial communications and wait for port to open: Serial.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port mySerial.begin(9600); mySerial.println("Hello, world?"); } void loop() { // run over and over while (mySerial.available() > 0){ char c = mySerial.read(); //Serial.print(c); gps.encode(c); if (gps.location.isUpdated()){ Serial.print("LAT="); Serial.println(gps.location.lat(), 6); Serial.print("LONG="); Serial.println(gps.location.lng(), 6); Serial.print("ALT="); Serial.println(gps.altitude.meters()); } } }
実際にプログラムを書き込んで動作させると、緯度経度(LAT、LONG)などがわかりやすい形で表示されているのが確認できます。これを使ってほかのセンサーと連携したり、インターネットを通じてデータを貯えたりなど活用がしやすくなりましたね。
まとめ
今回はGPSモジュールの基本的な使い方を学ぶことができました。次回はこのGPSモジュールと第52回から取り組んだ3G回線を組み合わせて一定時間でサーバーに位置情報を送るGPSロガーの作成に取り組んでみたいと思います。