Arduino 入門 Lesson 68 【GPSモジュール】

arduino-lesson68-00 Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 68
【GPSモジュール】

こにんちは、管理人のomoroyaです。

センサーの使い方の基本を学習する入門編。

今回は、ちょっと古い型番ですがGPSモジュールを入手したのでさっそく遊んでみました。

 

世の中には、まだまだ色々なセンサーがあります。

これからも、色々なセンサーで遊んでいきます。

本記事はLesson 68 【GPSモジュール】です。

名前のとおりGPS衛星を補足し、NMEA プロトコルというデータフォーマットを取得できるモジュールです。

補足
NMEAは米国海洋電子機器協会(National Marine Electronics Association)が定めた規格で、受信機とナビゲーション機器の通信に使用されるプロトコル。

 

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の目標は以下です。

1.GPSモジュールの使い方を学習する
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モジュールのみ。

液晶、電池などと合わせればパソコンなしで使えるため良いかもしれません。

作ってみても面白いかも。

 

必要なもの

※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

GPSモジュールについて説明していきます。

 

GPSモジュール 実物写真

下の写真がGPSモジュールの実物写真です。

本Lessonで使用するものは、ublox NEO-6Mが実装されたモジュール。

 

■本体とアンテナをつないだ状態

アンテナと本体は分離可能です。

arduino-lesson68-01

 

■モジュール部分の拡大図

信号ピンは上から、VCC、GND、TXD、RXD、PPSとなっています。
※本LessonではPPSは使用しません。

arduino-lesson68-02

 

GPSモジュール 回路図

GPSモジュールの回路図を示します。

回路に興味がないかたは必ず読み飛ばしてください。

回路図を見てわかるように、RX/TXは直接NEO-6Mに接続されることがわかります。

Arduino は5V出力、NEO-6Mは3.3Vですので、接続するにはレベル変換回路を使用する必要があります。
※直接接続すると壊れる可能性があります!

ただし、NMEAフォーマットをArduino で読むだけであれば、RXは使用する必要がありません。
※Arduino の出力ピンは接続しないということ

読み出しだけであれば、GPSモジュールのTXとの接続だけで十分です。

 

レベル変換回路については下記で紹介しています。

手元に1つ置いておいて損はないと思います。

 

■詳細回路図

GY-NEO-6MV2 GPSモジュールの説明から抜粋。

arduino-lesson68-03

 

GPSモジュール(NEO-6M) 仕様

遊び、学習で使う分には気にする特性はとくにありません。

供給電圧が2.7V~3.6Vとなっていますが、GPSモジュールには3.3VのLDOが搭載されているためVCCに5Vを与えて問題ありません。

くどいですが、RX、TXピンにArduinoの信号ピンを接続するときは、レベル変換(5V → 3.3V)が必要です。

注意
RX/TXにArduinoのピンを
直接つなぐ場合は自己責任でお願いします。
使用範囲外です!

 

といっても、本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

 

回路図がこちら。

arduino-lesson68-04

 

こちらがブレッドボード図。

arduino-lesson68-05

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品はGPSモジュール」のみとなります。

部品はわずかであるため接続は簡単です。

 

使用するポートは

  • Serial入力(RX):8
  • Serial出力(TX):7 ← 使わない!
  • 5V、GND

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

arduino-lesson68-06

 

コードの書き込み

接続が終わったら、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で使用したもの以外もあります。

詳細は下記で確認ください。

TinyGPS++ | Arduiniana

 

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が点灯します。

補足
LED点灯後、衛星を補足することができればLEDが点滅にかわります。
スケッチとは無関係の動作です。
まずは電源を入れてGPSモジュールの点滅を確認してください。
点滅するまでに、それなりの時間をようします。
点滅しなければ、外に出てみる。
それでも、点滅しなければ壊れているかも・・・。

 

シリアルモニタを開いて読みだしたデータをみてみましょう。

■シリアルモニタの結果

$GP**」などから始まるセンテンスと呼ばれる1行ごとの文字列がカンマ区切り形式で出力されます。

いわゆる「NMEAフォーマット」です。

これでも、読めないこともないのですが・・・。

arduino-lesson68-07

 

ということで、「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

では、さっそく動作を確認していきます。

再度書いておきますが、点滅確認必要です。

補足
LED点灯後、衛星を補足することができればLEDが点滅にかわります。
スケッチとは無関係の動作です。
まずは電源を入れてGPSモジュールの点滅を確認してください。
点滅するまでに、それなりの時間をようします。
点滅しなければ、外に出てみる。
それでも、点滅しなければ壊れているかも・・・。

 

シリアルモニタを開いて読みだしたデータをみてみましょう。

■シリアルモニタの結果

わかりやすくなりました。

隠している箇所に、精度よく緯度、経度、高度が取得できています。

また、補足している衛星は8個のようです。

arduino-lesson68-08

 

本Lessonで使用したGPSモジュールは安価ですが十分な精度があります。

測定した、緯度、経度をgoogle mapで表示するとほぼ一致。

恐るべし、GPSモジュール!

 

まとめ

本Lessonは、以下を目標としました。

1.GPSモジュールの使い方を学習する
2.GPSモジュールを動かすスケッチを描く
3.GPSモジュールからデータを取得する

 

GPSモジュールは衛星から色々な情報を取得できる電子部品。

工夫次第でいろんなことに使える電子部品です。

GPSモジュールは色々と出回っています。

何か1つ入手すれば、色々と遊べると思います。

 

Lesson 68 【GPSモジュール】 はここまで。

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 69は【電流センサモジュール】です。

Arduino 入門 Lesson 69 【電流センサモジュール】
本記事はLesson 69 【電流センサモジュール】。名前のとおり電流値を測定できるのですが、ホール素子をを用いているため学校で習うような測定箇所に電流計を入れるということではありません。そのため測定機器の内部抵抗を気にすることなく電流値を…

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編Arduino入門編2で使用しているUNOはAmazonにて購入可能です。

Arduino入門編では互換品を使用。

Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)

 

Amazonでお得に買う方法

Amazonでお得に購入するならAmazon MastercardAmazonギフト券がおすすめです。

時期により異なりますが、様々なキャンペーンを実施しています。

\Amazonギフト券/
Amazonギフトカード キャンペーン

Amazon Mastercard お申込み
Amazon Mastercard 申し込み 

 

いずれの場合もプライム会員である方がお得!!

\Amazon Prime 30日間の無料会員を試す/
無料会員登録 

 

 

コメント

タイトルとURLをコピーしました