Arduino NanoでDS3231 RTCをGPSと同期 ─ 高精度タイムキーピング
概要
DS3231 RTCモジュールの時刻を、GPS(NEO-6M)から取得したUTC時刻で自動補正するシステムを構築。コンパイル時刻依存の不正確さを解消し、ボタン一つで高精度同期を実現します。I2C LCDで現在時刻を常時表示。
必要な部品
- Arduino Nano R3 ×1
- DS3231 RTCモジュール ×1
- NEO-6M GPSモジュール ×1
- 双方向レベルシフター(5V⇔3.3V) ×1
- 16×2 I2C LCD(アドレス0x3Fまたは0x27) ×1
- タクトスイッチ ×1(同期実行用)
- 各種ピンヘッダー、ストリップボード、抵抗等
配線
| モジュール | 接続先 |
|---|---|
| LCD I2C | SDA→A4, SCL→A5, VCC→5V, GND→GND |
| DS3231 | SDA→A4, SCL→A5, VCC→5V, GND→GND |
| レベルシフター | HV→5V, LV→3.3V, GND共通, HV1↔D3, HV2↔D4 |
| NEO-6M | VCC→3.3V(LV側), GND→GND, TXD→LV1, RXD→LV2 |
| タクトスイッチ | D9とGND間 |
使用ライブラリ
Adafruit_GPS(v1.0.3)RTClibby Adafruit(v1.2.0)LiquidCrystal_I2C(NewLiquidCrystal派生)
動作手順
- 電源投入 → LCDにDS3231の現在時刻表示
- GPSが衛星捕捉まで待機(屋内では10分以上かかる場合あり)
- GPSモジュールの赤LED点滅開始後、タクトスイッチ押下
- DS3231がGPS時刻に更新、LCDに新時刻表示
重要な注意点
- GPSロック前のボタン押下は厳禁 → DS3231が2000年1月1日 0:0:0 にリセットされる
- DS3231のバックアップ電池(CR2032)が消耗していると、初回同期後に時計が進まない。充電に時間を要する
- NEO-6M基板上のレギュレータ(4A2D)は電源ラインのみ降圧。通信ラインはレベルシフター必須
- I2C LCDのアドレスが
0x3Fの個体あり。表示されない場合は0x27も試す - RTClibは曜日レジスタを設定せず、日付から計算で求める仕様(うるう年自動対応)
- UTC→ローカルタイム変換は未実装。必要ならコード追加を
コード抜粋(核心部分)
#include
#include
#include
#include
#include
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
SoftwareSerial gpsSerial(3, 2); // RX, TX (レベルシフター経由)
Adafruit_GPS GPS(&gpsSerial);
const int syncBtn = 9;
void setup() {
Serial.begin(115200);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
useInterrupt(true); // 1ms割り込みでGPSデータ取得
lcd.begin(16, 2); lcd.backlight();
pinMode(syncBtn, INPUT_PULLUP);
}
SIGNAL(TIMER0_COMPA_vect) { // 1ms割り込み
char c = GPS.read();
#ifdef GPSECHO
if (c) UDR0 = c;
#endif
}
void loop() {
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA())) return;
}
// 現在時刻表示
DateTime now = rtc.now();
lcd.setCursor(4, 0);
lcd.print(now.year()); lcd.print('/');
lcd.print(now.month()); lcd.print('/'); lcd.print(now.day());
lcd.setCursor(4, 1);
lcd.print(now.hour()); lcd.print(':');
lcd.print(now.minute()); lcd.print(':'); lcd.print(now.second());
// 同期ボタン押下でGPS時刻をRTCへ書き込み
if (!digitalRead(syncBtn)) {
rtc.adjust(DateTime(GPS.year, GPS.month, GPS.day,
GPS.hour, GPS.minute, GPS.seconds));
lcd.clear(); lcd.print("Pressed set");
delay(5000); lcd.clear();
}
}
GPSの癖と対策
- 屋内では衛星捕捉に時間がかかる、または捕捉不可 → LCD搭載で屋外持ち出し可能に
- アンテナ内蔵タイプでも感度にバラつきあり。外付けアンテナ推奨
- コールドスタート時は数分〜数十分要する
まとめ
GPS同期により、ネットワーク不要で世界標準時(UTC)にトレーサブルな高精度時計が実現できます。フィールドワーク、データロガー、天文観測等のタイムスタンプ用途に最適です。
製造プロセス
- 永続する遺産を残す:より良い未来のための本物のリーダーシップ
- SMRP、メンテナンス・信頼性プロフェッショナル向け標準化KPIセットを発表
- 平面研削:精密加工のための伝統的技術
- ボックスウェイCNC旋盤が精度と性能で最適な選択である理由
- パンチセット完全ガイド:種類・用途・選び方を徹底解説
- リニアガイド搭載CNC旋盤:高速・高精度・軽切削生産の最適解
- メカニックツールセット選びの完全ガイド:用途別おすすめと選び方のポイント
- ベン図の理解:集合関係の可視化
- セットスクリュー(頭なしネジ)完全ガイド:設計、違い、用途
- 三角定規(セットスクエア)の種類、使い方、製図での役割
- Java 10開発環境構築ガイド:ビルド、コンパイル、実行