ArduinoとGPSモジュールを使ったLCD時計の製作(3):利用中の衛星数の表示

Arduinoと秋月電子通商のGPSモジュール【K-13850】と【M-12905】を使ったLCD時計用に、利用中の衛星数を表示するスケッチを作った際のメモです。

目次

GPSモジュールを使ったLCD時計の製作

GPSモジュール【K-13850】を使ったLCD時計の製作記事です。

あわせて読みたい
ArduinoとGPSモジュールを使ったLCD時計の製作 ArduinoとGPSモジュールとして秋月電子通商の「GNSS [GPS(アメリカ)、GLONASS(ロシア)、みちびき (日本)]受信機キット」を使ってLCD時計を組み立てました。GPS衛星からU...

アンテナ一体型の【M-12905】を使ったLCD時計の記事です。

あわせて読みたい
ArduinoとGPSモジュールを使ったLCD時計の製作(2):GPSモジュール変更 秋月電子通商のGPSモジュール【K-13850】に替えて、みちびき3機受信に対応したアンテナ一体型の【M-12905】を使ってLCD時計を作りました。 GPSモジュールの端子(5V、...

今回、空きエリアだったLCD画面の右下に衛星数(s=xx)を表示しています。
上がGPSモジュール【K-13850】、下が【K-13850】を使っています。同じスケッチで動作します。

ArduinoとGPSモジュールを使ったLCD時計に衛星数を表示
ArduinoとGPSモジュールを使ったLCD時計に衛星数を表示

スケッチ:利用中の衛星数をLCDに表示(2022/12/6 スケッチ更新)

ライブラリには、GitHub:mikalhart/TinyGPSPlusサイトの TinyGPSPlus-master.zip を利用させていただきました。gps.satellites.value()で衛星数を取得できます。

The TinyGPS++ Object Model
The main TinyGPS++ object contains several core sub-objects:

satellites – the number of visible, participating satellites

Each provides methods to examine its current value, sometimes in multiple formats and units. Here’s a complete list:

Serial.println(gps.satellites.value()); // Number of satellites in use (u32)

http://arduiniana.org/libraries/tinygpsplus/

GPS衛星からUTC(協定世界時)を受信して adjustTime でJST(日本標準時、9時間進めた時刻UTC+9)に変換してLCDモジュールに日時表示するスケッチ「GPS_clock_LCD.ino」に、衛星数表示を加えたスケッチ「GPS_clock_LCD_sates.ino」を作りました。

GPSで取得した時刻を1秒毎にsetTimeするルーチン内ではgps.satellites.value()から衛星数をうまく取得できなかったので、衛星数を取得するロジックとGPSで取得した時刻をsetTimeするロジックを分けています。1秒毎のsetTimeによる内部時計の更新は止めて、分・時・日・月・年が変わったらGPSからの取得データで更新しています。

スケッチを実行した(電源を入れた)直後から衛星の補足が完了するまでは、衛星数は非表示(s=- -)です。数十秒から数分後、1ppsのLEDが点滅し始めると、s= 8のように衛星数の表示が出ます。

液晶モジュールのI2Cアドレスは0xa0。液晶モジュール用のI2Cライブラリは「構想100年」サイトの LcdCore_20120528.zip と LCD_ACM1602NI_20120528.zip を利用させていただきました。

曜日はツェラー(Zeller)の公式で算出しています。

GPS_clock_LCD_sates.ino
※ここをクリックするとコード表示を開閉できます。
#include <Arduino.h>
#include <Wire.h>            // Arduino IDE のI2Cライブラリ
#include <TinyGPSPlus.h>     // https://github.com/mikalhart/TinyGPSPlus
#include <SoftwareSerial.h>
#include <TimeLib.h>
#include <LcdCore.h>         // LCDコアライブラリ
#include <LCD_ACM1602NI.h>   // 秋月I2C液晶用のI/Oライブラリ

#define time_offset 32400    // UTC+9時間(60*60*9 秒)
TinyGPSPlus gps;
SoftwareSerial ss(10, 11);   // RXPin = 10, TXPin = 11
LCD_ACM1602NI lcd(0xa0);     // 0xa0は液晶モジュールのI2Cアドレス

int jst_year;
int jst_month;
int jst_day;
int jst_hour;
int jst_minute;
int jst_second;
int day_week;
char DayWeekData[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"} ;

void setup()
{
Serial.begin(9600);
ss.begin(9600);
Wire.begin();       // I2C初期化
lcd.begin(16, 2);   // ディスプレイの行数(16)と桁数(2)
}

void loop()
{
// GPSデータ取得
while (ss.available())
  gps.encode(ss.read());

// 利用中の衛星数の取得、表示
lcd.setCursor(10, 1);
lcd.print("s=");
if (gps.satellites.isValid())
{
lcd.setCursor(12, 1);
lcdzeroSup(gps.satellites.value());  // Number of satellites in use (u32)
} else {
lcd.setCursor(12, 1);
lcd.print("--");
}
// 分、時、日、月、年が変わったらGPS取得データで更新
if(jst_minute != gps.time.minute() || 
   jst_hour   != gps.time.hour()   || 
   jst_day    != gps.date.day()    || 
   jst_month  != gps.date.month()  || 
   jst_year   != gps.date.year() )
{
jst_day    =gps.date.day();
jst_month  =gps.date.month();
jst_year   =gps.date.year();
jst_hour   =gps.time.hour();
jst_minute =gps.time.minute();
jst_second =gps.time.second();
setTime(jst_hour, jst_minute, jst_second, jst_day, jst_month, jst_year);
// JST変換
adjustTime(time_offset);
}
// JSTの日付、曜日、時刻の表示
lcd.setCursor(0, 0);
lcd.print(year());
lcd.setCursor(4, 0);
lcd.print("/");
lcd.setCursor(5, 0);
lcdzeroSup(month());
lcd.setCursor(7, 0);
lcd.print("/");
lcd.setCursor(8, 0);
lcdzeroSup(day());
lcd.setCursor(11, 0);
lcd.print("(");
day_week = getDayWeek(year(), month(), day()); // 曜日の計算
lcd.print(DayWeekData[day_week]) ;
lcd.print(")");
lcd.setCursor(0, 1);
lcdzeroSup(hour());
lcd.setCursor(2, 1);
lcd.print(":");
lcd.setCursor(3, 1);
lcdzeroSup(minute());
lcd.setCursor(5, 1);
lcd.print(":");
lcd.setCursor(6, 1);
lcdzeroSup(second());
}

// 曜日の計算(ツェラー(Zeller)の公式)
int getDayWeek(int year,int month,int day)
{
int w ;
if(month < 3) 
{
year = year - 1;
month = month + 12 ;
}
w = (year + (year/4) - (year/100) + (year/400) + (13*month+8)/5 + day ) % 7;
return w;
}

// 値が0~9の場合、1桁目を 空白 もしくは 0 に置換
void lcdzeroSup(int digit)
{
if(digit < 10)
lcd.print(' ');   // 現在「空白」
lcd.print(digit);
}

TinyGPS++ のサンプルスケッチ「FullExample.ino」で衛星数を確認

Arduino IDEのファイル → スケッチ例 → TinyGPS++ のサンプルスケッチ「FullExample.ino」と今回作成したスケッチ「GPS_clock_LCD_sates.ino」で表示される衛星数を比較しました。

当サイトのGPSモジュールのアンテナ部分はマンションの窓からベランダに出しています。アンテナ部分の設置場所・向き、天候など好条件が揃うと衛星数は12程度です。
今回の測定時の衛星数は両スケッチともに 8 程度でした。

サンプルスケッチ「FullExample.ino」に表示された衛星数
サンプルスケッチ「FullExample.ino」に表示された衛星数(赤点線枠)

GNSS GUIツールで補足した衛星を確認

秋月電子通商のGPSモジュール【K-13850】にはGNSS GUIツール[Mini GPS]や衛星モニタ[Power GPS]が提供されており、補足した衛星を確認できます。

購入当時(2021年12月9日)の測定結果ですが、[Mini GPS]を使ってキット付属の外付けアンテナで12個の衛星を補足できました。

Windows PCとGPSモジュールは、USBシリアル変換モジュール(FT234【M-08461】)を介してUSB接続しました。結線や通信設定は、取扱説明書の「外部機器との接続方法(PCとUSB接続する場合)」に記載があります。

GPSモジュール【K-13850】には「アップデートツール(みちびき受信不具合対策版)」が提供されています。

GNSS GUIツール [Mini GPS]
GNSS GUIツール [Mini GPS] の実行結果(位置情報は写真加工アプリで削除しています)。

秋月電子通商のGPSモジュール【M-12905】にもWindows版GNSS評価ソフトウェアu-centerが提供されています。

よかったらシェアしてね!
  • URLをコピーしました!
目次