ArduinoとGPSモジュールを使ったLCD時計の製作(2):GPSモジュール変更

秋月電子通商のGPSモジュール【K-13850】が通販サイトで在庫切れになったので、代替としてみちびき3機受信に対応したアンテナ一体型の【M-12905】を使ってLCD時計を作りました。

GPSモジュールの端子(5V、GND、Rx、Tx)は互換性があったので、GPSモジュールの入れ替えのみで同じスケッチで動作します。

GPSモジュールを使ったLCD時計
GPSモジュールの5本の出力線にはジャンパーワイヤ端子を加工して取り付け
目次

準備したパーツ

GPSモジュールを「GNSSチップ:UBX-M8030-KT(u-blox)【M-12905】」に入れ替えたのみなので、使ったパーツは「GPSモジュール【K-13850】」で製作した時と同じです。

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

GPSモジュール【M-12905】の5本の出力線は、はんだメッキした線材むき出しなのでオスのジャンパーワイヤ端子を加工して取り付けています。

パーツ仕様個数備考
1Arduino Uno Rev3ATmega3281M-07385
※テスト時利用
ELEGOO
Nano互換ボード
CH340/ATmega328P
※3個入りパッケージ
※ピンのはんだ付けが必要
※ケース組込時
GPSモジュール1PPS出力 みちびき3機受信対応
アンテナセット付キット
GNSS モジュール :
GYSFFMANC(太陽誘電 )
K-13850
在庫切れ
取扱説明書
2GPSモジュール1PPS出力 みちびき3機受信対応
GT-902PMGG (Magnetic Mount)
GNSSチップ:
UBX-M8030-KT(u-blox)
※ピンのはんだ付けが必要
1M-12905
3スイッチング・
ダイオード
1N41481手持ち
4抵抗10kΩ 1/4W1手持ち
5LCDモジュール
I2C接続 16×2行
白色バックライト
ACM1602NI-FLW-FBW-M01
1P-05693
6半固定ボリューム10KΩ1P-03277
7ブレッドボードEIC-8011P-00315
8ジャンパーワイヤオス-オス 10cmセット適量C-05371
9ACアダプタ9V 1.3A 100~240V1M-00030

M-12905】GPSモジュールはアンテナとモジュール基板が一体型なので、【K-13850】のモジュール基板上にはあった1秒毎に点滅表示するLEDがありません。

LED表示で受信(追尾)状況を把握するためにGPSモジュールの1PPS線に下記のパーツを追加しました。1PPS出力は、C-MOSロジック(3V)レベル、パルス幅:100mS(アクティブHigh)です。GPSモジュールの追尾が完了するとLEDが点滅し始めます(電源を入れて数十秒~数分ほどかかります)。

パーツ仕様個数備考
10トランジスタ2SC1815 等1手持ち
11抵抗2.2kΩ 1/4W1手持ち
12LED取り外し品のため型式不明1手持ち
13抵抗LEDの電流制限抵抗
1kΩ、10kΩ 1/4Wでテスト
LEDの明るさを抵抗値で調整
1手持ち

Arduinoの開発環境「Arduino IDE」

Arduino IDEが未インストールの場合は、PC環境に合わせてArduinoの公式サイトからダウンロードしてセットアップします。

Software | Arduino

https://www.arduino.cc/en/software

Arduinoボードの開発環境となる「Arduino IDE」のインストール、各種センサや液晶ディスプレイといったモジュールとArduinoとの接続を容易にする「ライブラリ」を活用したスケッチ作成までの手順メモです。

あわせて読みたい
Arduinoの開発環境「Arduino IDE」のセットアップ手順 Arduinoボードの開発環境となる「Arduino IDE」のインストール、各種センサや液晶ディスプレイといったモジュールとArduinoとの接続を容易にする「ライブラリ」を活用し...

結線図

動作確認したArduino Uno Rev3とGPSモジュール【M-12905】を使ったLCD時計の結線図です。デジタルピンD10とD11をRx、Txに割り当てています。

GPSモジュールの電源電圧はDC3V~5.5Vですが、入出力信号レベルは3V(3.3Vデバイスで使用可)です。

GPSモジュールを使ったLCD時計
結線図

スケッチ:GPSから取得した日時をLCDに表示(2022/12/1 スケッチ見直し)

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

ライブラリには、GitHub:mikalhart/TinyGPSPlusサイトの TinyGPSPlus-master.zip を利用させていただきました。zipファイルをPCにダウンロードして保存(「Code」ボタンをクリックして「Download ZIP」)。Arduino IDEのメニューの「スケッチ」→「ライブラリをインクルード」→「.ZIP形式の ライブラリを インストール」で ダウンロードしたZIPファイルを追加します。

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

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

最大30720バイトのフラッシュメモリのうち、スケッチが10288バイト(33%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が834バイト(40%)を使っていて、ローカル変数で1214バイト使うことができます。

秒遅れや秒飛びが起こるため、delay(1000);に変わって、if(o_sec != gps.time.second()) で前回保存していた秒とGPSから取得した秒とを比較して変化があれば時刻を更新するようにスケッチを変更しました(2022/12/1 スケッチ見直し)。

GPS_clock_LCD.ino  ※ここをクリックするとコード表示を開閉できます。
#include <Arduino.h>
#include <Wire.h>            // Arduino IDE のI2Cライブラリ
#include <TinyGPS++.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時間(3600 * 9 秒)
static const int RXPin = 10, TXPin = 11;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;             // The TinyGPS++ object
SoftwareSerial ss(RXPin, TXPin); // The serial connection to the GPS device
LCD_ACM1602NI lcd(0xa0);         // 0xa0は液晶モジュールのI2Cアドレス
int o_sec;     // 古い秒の格納
int day_week;  // 曜日
char DayWeekData[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"} ;


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


void loop()
{
  while (ss.available() > 0)
  {
    if (gps.encode(ss.read()))
    {
      if(o_sec != gps.time.second())  //GPSから取得した秒が変わったら時刻を更新
      {
        o_sec = gps.time.second();
        setTime(gps.time.hour(), gps.time.minute(), gps.time.second(), gps.date.day(), gps.date.month(), gps.date.year());
        adjustTime(time_offset);   //JST変換
// JSTの日付、曜日、時刻の表示
day_week = getDayWeek(year(), month(), day());
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("(");
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);
}

Arduino Nano互換ボードで小型化(2022/11/3追加)

ケースに組み込むため、Arduino Uno Rev3をELEGOOのNano互換ボードと入れ替えました。NanoのI2Cは、SDA:A4ピン、SCL:A5ピンです。

ELEGOOのNano互換ボードで小型化
ELEGOOのNano互換ボードで小型化
よかったらシェアしてね!
  • URLをコピーしました!
目次