第6回は現在の走行方向、高度を図るため、GPSユニットを用いて、検証&動作を確認していきます。
第5回はこちらからどうぞ
GPSについて
今回使用するGPSは、秋月電子通商で購入した
「GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応」
を使用します。
秋月電子通商で上記の商品を購入したのは、実装用の基盤はもちろんですが、日本語マニュアルが付いてくるのが購入の決め手でした。
問題が起きた際、単純なセンサーなら信号をオシロスコープで調査するなどでデバックができますが、GPSは難しいですからね。
接続方法に関しては、今回は秋月のマニュアルに従って接続し、セットアップしてください。
ここでは長くなってしまうので、説明しません。
以下のコードはセットアップが完了した状態のGPSを想定しています。
回路
回路図は秋月電子通商のマニュアルを参照してください。
今回はTXDはデジタル10pinに、RXDはデジタルの11pinに接続しています。
マニュアルに記載されている接続図のうち、10kΩの抵抗とダイオードを使用する場面がありますので、事前に用意しておくとよいでしょう。
コード
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int TXPin = 10, RXPin = 11;
TinyGPSPlus gps;
SoftwareSerial ss(TXPin, RXPin);
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("Connect Success");
ss.begin(9600);
ss.println("Connect Success");
}
void loop() { // run over and over
while (ss.available() > 0){
char c = ss.read();
gps.encode(c);
if (gps.location.isUpdated()){
Serial.println(gps.location.lat(), 6); // Latitude in degrees (double)
Serial.println(gps.location.lng(), 6); // Longitude in degrees (double)
Serial.print(gps.location.rawLat().negative ? "-" : "+");
Serial.println(gps.location.rawLat().deg); // Raw latitude in whole degrees
Serial.println(gps.location.rawLat().billionths);// ... and billionths (u16/u32)
Serial.print(gps.location.rawLng().negative ? "-" : "+");
Serial.println(gps.location.rawLng().deg); // Raw longitude in whole degrees
Serial.println(gps.location.rawLng().billionths);// ... and billionths (u16/u32)
Serial.println(gps.date.value()); // Raw date in DDMMYY format (u32)
Serial.println(gps.date.year()); // Year (2000+) (u16)
Serial.println(gps.date.month()); // Month (1-12) (u8)
Serial.println(gps.date.day()); // Day (1-31) (u8)
Serial.println(gps.time.value()); // Raw time in HHMMSSCC format (u32)
Serial.println(gps.time.hour()); // Hour (0-23) (u8)
Serial.println(gps.time.minute()); // Minute (0-59) (u8)
Serial.println(gps.time.second()); // Second (0-59) (u8)
Serial.println(gps.time.centisecond()); // 100ths of a second (0-99) (u8)
Serial.println(gps.speed.value()); // Raw speed in 100ths of a knot (i32)
Serial.println(gps.speed.knots()); // Speed in knots (double)
Serial.println(gps.speed.mph()); // Speed in miles per hour (double)
Serial.println(gps.speed.mps()); // Speed in meters per second (double)
Serial.println(gps.speed.kmph()); // Speed in kilometers per hour (double)
Serial.println(gps.course.value()); // Raw course in 100ths of a degree (i32)
Serial.println(gps.course.deg()); // Course in degrees (double)
Serial.println(gps.altitude.value()); // Raw altitude in centimeters (i32)
Serial.println(gps.altitude.meters()); // Altitude in meters (double)
Serial.println(gps.altitude.miles()); // Altitude in miles (double)
Serial.println(gps.altitude.kilometers()); // Altitude in kilometers (double)
Serial.println(gps.altitude.feet()); // Altitude in feet (double)
Serial.println(gps.satellites.value()); // Number of satellites in use (u32)
Serial.println(gps.hdop.value()); // Horizontal Dim. of Precision (100ths-i32)
delay(1000);
}
}
}
このコードでは、TinyGPS++を利用しています。ほぼ公式のサンプルコードですが、少しだけいじっています。
コードを実行する前に下記リンクからTinyGPS++をダウンロードし、ArduinoIDEにインストールする必要があります。
http://arduiniana.org/libraries/tinygpsplus/
ページ中央の「download」からzipファイルを取得できます。
一つコードの注意点として、シリアルモニターで使用するボーレートが57600になっております。違う値では文字化けして何も読めませんので気を付けてください。
結果
結果は1秒に1回シリアルモニターに出力されます。
結果を乗せると場所が算出できますので、画像はありません。
(ごめんなさい)
結果は上から公式の説明を日本語訳すると
緯度(度)
経度(度)
全緯度の生緯度(+-付き)
上記の10億倍?
全緯度の生緯度(+-付き)
上記の10億倍?
DDMMYYの日付
現在の年
現在の月
現在の日
HHMMSSCCの時間
現在の時
現在の分
現在の秒
現在の1/100秒
速度(単位:100分の1ノット)
速度(単位:ノット)
速度(単位:mile/h)
速度(単位:m/s)
速度(単位:km/h)
角度(100分の1)
角度(360度)
生の高度(単位:cm)
メートル単位の高度(単位:m)
高度のマイル(単位:mile)
高度(単位:km)
フィート単位の高度(単位:feet)
使用中の衛星の数
精度?
です。
日本語訳が少し不安な部分があるのでご存知の方がいらっしゃいましたらアドバイスをお願いします。
まとめ
GPSの一番の機能である現在地の緯度経度は、今回おそらく使用しません。
(もったいない・・・)
しかしGPSにはほかにも、現在の進行方向を取得したり、高度情報を取得できたりと今回ほしい機能がたくさんあります。
ほかのセンサーよりも値が張ってしまいますが、その価値は十分あるでしょう。
また、今回は使用しませんでしたが、1PPS端子を利用すると正確に1秒を取得できます。
自作時計や正確なクロック動作が必要な場合は利用できます。
旅を楽しくするArduino端末を作る。リンク集
その1-不満点を挙げよう-
その2-不満点をまとめよう-
その3-電圧測定器を作る-
その4-温湿度計を作る-
その5-気圧計を作る-
その6-方位・高度計をGPSで-
その7-12Vバッテリーから電力供給
その8-Ver1作成-
その9-電圧計の誤差とその代替案-
その10-Ver2へアップデート-
その11-LCDをI2Cで制御しよう-
その12-LCDをI2C化-
その13-Ver3へアップデート-
その14-USB充電の仕様に関して-
その15-Arduino言語を用いながらBluetoothで通信できるESP32-
その16-旅Arduino Ver4 スマホアプリ化-
この記事へのコメントはありません。