Arduino 入門
Lesson 68
【GPSモジュール】
こにんちは、管理人のomoroyaです。
センサーの使い方の基本を学習する入門編。
今回は、ちょっと古い型番ですがGPSモジュールを入手したのでさっそく遊んでみました。
世の中には、まだまだ色々なセンサーがあります。
これからも、色々なセンサーで遊んでいきます。
本記事はLesson 68 【GPSモジュール】です。
名前のとおりGPS衛星を補足し、NMEA プロトコルというデータフォーマットを取得できるモジュールです。
NMEAについては、それだけで記事が書けてしまうでの本Lessonでは割愛します。
検索すればでてくるのでそちらを参照ください。
Arduinoのライブラリを使用することで、NMEAフォーマットをあまり意識せず位置情報の取得などが可能です。
「GPSモジュール」はubloxのNEO-6シリーズを使用しています。
NEO-6シリーズは旧世代の製品です。
可能であれば、新しいシリーズを使った方がよいと考えます。
本Lessonで使用している「GPSモジュール」は以下が同等品。
※prime対応品ではありません
※到着までに1か月以上かかるかもしれません。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
本Lessonで使用する「GPSモジュール」は「ublox NEO-6M」が実装されたGPSモジュール。
NEO-6Mにて検索すればデータシートはすぐに見つけることができます。
Lesson 68 目標
本Lessonの目標は以下です。
2.GPSモジュールを動かすスケッチを描く
3.GPSモジュールからデータを取得する
いつものように、遊ぶことが重要です。
「GPSモジュール」ですが、ライブラリを使用するため制御はそれほど難しくありません。
NMEAフォーマットの変換には、「TinyGPS++.h」ライブラリを使用します。
また、「ublox NEO-6M」のInterfaceは以下の4種類に対応しています。
- UART
- USB
- SPI
- DDC
Arduinoのでの制御を考えるとUARTが簡単で良いかと考えます。
そのため、GPSモジュールからのデータ取得は「SoftwareSerial.h」を利用します。
※「SoftwareSerial.h」はArduinoの標準ライブラリ
UARTって何?というかたは下記を参照ください。
準備
ではLessonの準備に取り掛かりましょう。
電子部品は「GPSモジュール」のみ。
液晶、電池などと合わせればパソコンなしで使えるため良いかもしれません。
作ってみても面白いかも。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - M-M Jumper wire(UNOと部品をつなぐための配線)
- M-F Jumper wire(UNOと部品をつなぐための配線)
- M-F M-M F-F セット Jumper wire(UNOと部品をつなぐための配線)
※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
「GPSモジュール」について説明していきます。
GPSモジュール 実物写真
下の写真が「GPSモジュール」の実物写真です。
本Lessonで使用するものは、「ublox NEO-6M」が実装されたモジュール。
■本体とアンテナをつないだ状態
アンテナと本体は分離可能です。
■モジュール部分の拡大図
信号ピンは上から、VCC、GND、TXD、RXD、PPSとなっています。
※本LessonではPPSは使用しません。
GPSモジュール 回路図
「GPSモジュール」の回路図を示します。
回路に興味がないかたは必ず読み飛ばしてください。
回路図を見てわかるように、RX/TXは直接NEO-6Mに接続されることがわかります。
Arduino は5V出力、NEO-6Mは3.3Vですので、接続するにはレベル変換回路を使用する必要があります。
※直接接続すると壊れる可能性があります!
ただし、NMEAフォーマットをArduino で読むだけであれば、RXは使用する必要がありません。
※Arduino の出力ピンは接続しないということ
読み出しだけであれば、GPSモジュールのTXとの接続だけで十分です。
レベル変換回路については下記で紹介しています。
手元に1つ置いておいて損はないと思います。
■詳細回路図
GY-NEO-6MV2 GPSモジュールの説明から抜粋。
GPSモジュール(NEO-6M) 仕様
遊び、学習で使う分には気にする特性はとくにありません。
供給電圧が2.7V~3.6Vとなっていますが、GPSモジュールには3.3VのLDOが搭載されているためVCCに5Vを与えて問題ありません。
くどいですが、RX、TXピンにArduinoの信号ピンを接続するときは、レベル変換(5V → 3.3V)が必要です。
といっても、本Lessonでは読みだしだけできればよいのでRXは使用しません。
- Arduino 5V ⇔ GPS VCC
- Arduino TX → GPS RX(ここは接続しない!)
- Arduino RX ← GPS TX
- Arduino GND ⇔ GPS GND
■仕様抜粋
項目 | 仕様 |
---|---|
供給電圧 | 2.7V ~ 3.6V |
消費電力 | 111mW@3.0V(continuous) |
動作温度 | -40℃ ~ 85℃ |
Serial interface | 1 UART / 1 USB / 1 DCC / 1 SPI |
Serial and I/O | 2.7V ~ 3.6V |
Maximum Navigation update rate | 5Hz |
CFG_COM1/CFG_COM0 | 左記ピンのデフォルトは1/1設定のため UARTaud rate:9600bps |
CFG_GPS0 | 左記ピンのデフォルトは1設定のため Maximum Performance Mode |
測定間隔はデフォルトで1000msとなっているようです。
測位間隔を上げたい場合はNEO-6Mにアクセスして設定変更が必要。
設定変更したい場合はソフトウェアをダウンロードしパソコンと接続する必要があります。
パソコンとの接続はUSBとなるため、USB接続のためのコンバータが必要↓。
本Lessonは遊び、学習を想定しています。
Arduinoの仕様範囲内で使用していれば問題になることもありません。
遊び、学習以外での使用用途をお考えの場合はデータシートを必ず確認しましょう。
実践 回路作成とコード作成
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、「GPSモジュール」を動かしていきましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
Arduinoの使用ピンは以下。
- Serial入力(RX):8
- Serial出力(TX):7 ← 使わない!
- 5V、GND
回路図がこちら。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は「GPSモジュール」のみとなります。
部品はわずかであるため接続は簡単です。
使用するポートは
- Serial入力(RX):8
- Serial出力(TX):7 ← 使わない!
- 5V、GND
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。
本Lesssonのスケッチは下記を参考にしています。
コマンド説明
本Lessonでは、「SoftwareSerial.h」「TinyGPS++.h」のライブラリを使用します。
簡単に関数を説明しておきます。
■「SoftwareSerial.h」
関数名 | 説明 |
---|---|
SoftwareSerial xxx(rxPin, txPin) | xxxという新しいSoftwareSerialオブジェクトの作成 rxPin:データを受信するピン txPin:データを送信するピン |
xxx.begin(speed) | シリアル通信のスピード(ボーレート)を設定 speed: 300、1200、2400、4800、9600、14400、19200、28800、31250、38400、57600、115200 |
xxx.available() | ソフトウェアシリアルポートのバッファに何バイトのデータが到着しているかを返す |
xxx.read() | 受信した文字を返す 戻り値:読み込んだ文字、ない場合は-1 |
■「TinyGPS++.h」
本Lessonで使用したもの以外もあります。
詳細は下記で確認ください。
isValid()、isUpdated()のどちらを使うのかは使用に合わせて選択ください。
関数名 | 説明 |
---|---|
TinyGPSPlus xxx | xxxという新しいTinyGPSPlusオブジェクトの作成 |
xxx.encode() | 到着した文字()をArduinoに送信 |
xxx.location.isValid() | オブジェクトに有効なデータが含まれているかどうか、およびクエリを実行しても安全かどうかを示す |
xxx.location.isUpdated() | 最後にクエリを実行してからオブジェクトの値が更新されたかどうかを示す |
xxx.date.year() | 最新の修正日 年(UT) |
xxx.date.month() | 最新の修正日 月(UT) |
xxx.date.day() | 最新の修正日 日(UT) |
xxx.satellites.value() | 使用中である衛星の数 |
xxx.location.lat(), 6 | 現在地の緯度、小数点以下6桁 |
xxx.location.lng(), 6 | 現在地の経度、小数点以下6桁 |
xxx.altitude.meters() | 高度(m) |
xxx.speed.kmph() | 対地速度(km/h) |
サンプルコード1
まずは、単純にNMEAフォーマットをシリアルモニタに読み出してみます。
読み出すだけであれば、「TinyGPS++.h」は必要ありません。
//Lesson 68-1 GY-NEO-6M GPS Sensor //GPSセンサッモジュールでNMEAフォーマトを読む //https://omoroya.com/ #include <SoftwareSerial.h> const int P_RX = 8; //Arduinoで受信するピンの設定 const int P_TX = 7; //設定するが接続しない SoftwareSerial mySS(P_RX, P_TX); //mySSというオブジェクトの作成 void setup() { Serial.begin(9600); //シリアル通信のスピード(ボーレート)を設定 mySS.begin(9600); //mySSシリアル通信のスピード(ボーレート)を設定 } void loop() { //データが有効であれば読み出し if (mySS.available()) { Serial.write(mySS.read()); } }
動作確認1
では、さっそく動作を確認していきます。
まず、GPSモジュールは窓際、もしくは外で使用する必要があります。
おそらく、室内では衛星を補足することはできません・・・。
GPSモジュールの電源をONにすると実装されているLEDが点灯します。
シリアルモニタを開いて読みだしたデータをみてみましょう。
■シリアルモニタの結果
「$GP**」などから始まるセンテンスと呼ばれる1行ごとの文字列がカンマ区切り形式で出力されます。
いわゆる「NMEAフォーマット」です。
これでも、読めないこともないのですが・・・。
ということで、「TinyGPS++.h」の出番です。
サンプルコード2
「TinyGPS++.h」ライブラリを利用して「NMEAフォーマット」からほしい情報のみ取り出します。
//Lesson 68-2 NEO-6M GPS Sensor //GPSセンサッモジュールでNSMフォーマトから欲しい情報のみ取り出す //https://omoroya.com/ #include <TinyGPS++.h> #include <SoftwareSerial.h> const int P_RX = 8; //Arduinoで受信するピンの設定 const int P_TX = 7; //設定するが接続しない TinyGPSPlus gps; //gpsというオブジェクトの作成 SoftwareSerial mySS(P_RX, P_TX); //mySSというオブジェクトの作成 void setup() { Serial.begin(9600); //シリアル通信のスピード(ボーレート)を設定 mySS.begin(9600); //mySSシリアル通信のスピード(ボーレート)を設定 } void loop() { //データが有効であれば読み出し while (mySS.available() > 0){ if (gps.encode(mySS.read())){ //Serial.println("gps start"); display_monitor(); } } } void display_monitor() { //GPS情報が正常に更新されていたら表示 if (gps.location.isUpdated()) { //年、月、日、衛星数、緯度、経度、高度、対地速度の表示 Serial.print(gps.date.year()); // 年 (2000+) (u16) Serial.print("-"); Serial.print(gps.date.month()); // 月 (1-12) (u8) Serial.print("-"); Serial.print(gps.date.day()); // 日 (1-31) (u8) Serial.print(" SateNum="); Serial.print(gps.satellites.value()); //衛星数 Serial.print(" LAT="); Serial.print(gps.location.lat(), 6); //緯度 Serial.print(" LNG="); Serial.print(gps.location.lng(), 6); //経度 Serial.print(" ALT="); Serial.print(gps.altitude.meters()); //高度 Serial.print(" SPEED="); Serial.print(gps.speed.kmph()); //対地速度 Serial.println(" "); } }
動作確認2
では、さっそく動作を確認していきます。
再度書いておきますが、点滅確認必要です。
シリアルモニタを開いて読みだしたデータをみてみましょう。
■シリアルモニタの結果
わかりやすくなりました。
隠している箇所に、精度よく緯度、経度、高度が取得できています。
また、補足している衛星は8個のようです。
本Lessonで使用したGPSモジュールは安価ですが十分な精度があります。
測定した、緯度、経度をgoogle mapで表示するとほぼ一致。
恐るべし、GPSモジュール!
まとめ
本Lessonは、以下を目標としました。
2.GPSモジュールを動かすスケッチを描く
3.GPSモジュールからデータを取得する
「GPSモジュール」は衛星から色々な情報を取得できる電子部品。
工夫次第でいろんなことに使える電子部品です。
GPSモジュールは色々と出回っています。
何か1つ入手すれば、色々と遊べると思います。
Lesson 68 【GPSモジュール】 はここまで。
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson 69は【電流センサモジュール】です。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント