【Arduino】GNSSから情報を取得する

今回は、GNSSモジュールを使用してみましたので、解説していきます。

GNSSモジュールを使用するケースは、現在地を把握したり時刻情報を得たりする場合に使用されるケースが多いと思います。

概要

  • GNSSモジュールを使用し、位置情報を取得する
  • GNSSを受信したら緑色LEDを点灯、未受信は赤色LEDを点灯
  • 緯度経度をLCDモジュールに表示させる

用意するもの

スペック・データシート

GNSSモジュール

使用したGNSSモジュールは秋月電子で購入しました。太陽誘電製のようです。説明書を確認したところ、以下の接続方法をとるようです。

秋月電子より引用

RXとTXはArduinoとテレコに接続し、GNSSのRxとArduinoのTx間にはダイオードと抵抗を接続するような記載がありました。

LCD

使用したLCDはACM1602Kというものです。こちらも秋月電子で購入しましたが、Amazonなどでも安価で販売されているようですので、どちらで購入しても問題なさそうです。
しかし、インタフェースには種類があるようで、私が購入したらものはパラレルでの接続ですが、I2Cなどの製品も多くあります。
この記事ではI2Cは使用していないスケッチとなりますので、ご注意下さい。ピンアサインは以下の通りです。

     秋月電子より引用
created by Rinker
¥3,717 (2023/05/09 21:36:24時点 楽天市場調べ-詳細)

配線

配線は以下の図のようになります。

created by Rinker
¥4,356 (2023/05/09 21:36:24時点 楽天市場調べ-詳細)
ライブラリは、3つ使用しています。インストールされていない場合は、インストールをして下さい。([ツール] - [ライブラリを管理]
ライブラリ

・SoftwareSerial
・TinyGPS++
・LiquidCrystal

SoftwareSerialgpsSerial(2, 3);

TinyGPSPlus gps;
TinyGPS++を使用し、GPSポートの割り当てを行います。今回はArduinoのD2,D3へ割当てました。
全体的な割り当ては、以下の通りです。
接続先1 接続先2
D2 (Rx) GNSS(Tx)
D3(Tx) GNSS(Rx)(ダイオード)
D5 LCD(DB4)
D6 LCD(DB5)
D7 LCD(DB6)
D8 LCD(DB7)
D9 LED(緑)+
D10 LED(赤)+
D11 LCD(E)
D12 LCD(RS)
GND LCD(R/W)
可変抵抗器(2) LCD(VO)
可変抵抗器(1) GND
可変抵抗器(3) 5V
5V LCD(VDD)
GND LCD(VSS)
3V GNSS(10kΩ抵抗)
constint GreenLED = 9;  
constint RedLED = 10;  
GNSS受信とは無関係ですが、ぱっと見で受信しているか否かを判別するために、LEDを割り入れました。空いていたD9,D10へ割当てています。
bool gpsFixed = false;

GPSの補足状況を表すフラグを設定。boolとは真偽値(true/false)を返すものです。(true:1 false:0)
gpsFixedは、GPSモジュールから取得した情報のうち、位置情報(緯度・経度)が有効であり、かつ、捕捉されたGPS衛星の数が1以上であることを示すフラグとなります。このフラグがtrue(1)の場合、GPSモジュールが現在の位置を捕捉していることを意味します。この初期値がfalse(0)であるため、最初はGPSの補足状況は不明です。GPS情報を取得し、位置情報と衛星の数をチェックした後、gpsFixedの値を更新します。
Serial.begin(9600);        
gpsSerial.begin(9600);      
pinMode(GreenLED, OUTPUT);  
pinMode(RedLED, OUTPUT);    

lcd.begin(16, 2);
通信設定のセットアップ。今回使用したGNSSは9600がデフォルトでしたので、このように設定しています。使用するGNSSモジュールによって、適切な値を設定します。pinModeでD9,D10を出力モードに設定します。

while(gpsSerial.available() > 0){
if(gps.encode(gpsSerial.read())){
シリアル通信でGPSデータがあるかどうかを確認。もし、あれば読取り次の処理へ。
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Lat:”);
lcd.print(gps.location.lat(), 6);
lcd.setCursor(0, 1);
lcd.print(“Lon:”);
lcd.print(gps.location.lng(), 6);
今回しようしているLCDが2行タイプのものですので、1行目(0,0)に緯度(Lat)、2行目(0,1)に経度を6桁で表示するようにしています。
if(gps.location.isValid() && gps.satellites.value() > 0){
        gpsFixed = true;
}else{
        gpsFixed = false;
gpsが位置情報を変化させているか、また衛星の捕捉がある場合は、true、そうでなければfalseとしています。
gps.locationは、TinyGPS++ライブラリで提供されるオブジェクトの一つで、GPSモジュールから取得した現在位置情報を保持するためのオブジェクトです。
gps.locationオブジェクトには、以下のような関数があります。
 ・isValid(): 現在の位置情報が有効であるかどうかを返します。有効である場合はtrue、そうでない場合はfalseを返します。
 ・lat(): 現在の緯度を10進度数で返します。
 ・lng(): 現在の経度を10進度数で返します。
 ・altitude(): 現在の高度をメートル単位で返します。
 ・course(): 現在の進行方向を度数で返します。北を0度として、時計回りに360度までの値を取ります。
 ・speed(): 現在の速度をメートル/秒で返します。
if(gpsFixed){
digitalWrite(GreenLED, LOW);
digitalWrite(RedLED, HIGH);
}else{
digitalWrite(GreenLED, HIGH);
digitalWrite(RedLED, LOW);
}
gpsFixedの結果からLEDの点灯、消灯を指定しています。
created by Rinker
¥3,717 (2023/05/09 21:36:24時点 楽天市場調べ-詳細)