[Spresense] GNSS 衛星から情報を取得して RTC (Real-Time Clock) に日時を設定するスケッチ
前書き
衛星から取得した日時を Spresense に実装されている RTC (Real-Time Clock) に設定するスケッチを書いた。
RTC に日時を設定した後は衛星通信用のモジュール (GNSS モジュール) を停止させて電力消費を抑え、10 秒に 1 回 RTC 日時を表示させるようにした。
先日の記事と同様、ハードウェア的には Spresense メインボード + LTE 拡張ボード (LM1) + HDR カメラボードである。
コード
#include <GNSS.h> #include <RTC.h> static SpGnss Gnss; bool rtcInitialized = false; unsigned long lastProgressUpdate = 0; void setup() { Serial.begin(115200); Serial.println("GNSS RTC 同期プログラムを開始します。"); // RTC の初期化 RTC.begin(); // GNSS の初期化(RTC が未初期化の場合のみ) if (!isRtcInitialized()) { if (Gnss.begin() != 0) { Serial.println("Gnss 初期化エラー"); while (1); } Gnss.select(GPS); Gnss.select(QZ_L1CA); Gnss.select(QZ_L1S); if (Gnss.start(COLD_START) != 0) { Serial.println("Gnss 開始エラー"); while (1); } Serial.println("GNSS 信号を取得中です。これには数分かかる場合があります。"); } } void loop() { if (!rtcInitialized) { if (syncRtcWithGnss()) { rtcInitialized = true; // GNSS の使用を停止 Gnss.stop(); Gnss.end(); Serial.println("GNSS モジュールを停止しました。"); } else { // 進捗表示 unsigned long currentTime = millis(); if (currentTime - lastProgressUpdate >= 5000) { // 5秒ごとに進捗を表示 Serial.print("."); lastProgressUpdate = currentTime; } } } else { // RTC の時刻を表示 printCurrentTime(); delay(10000); // 1秒ごとに時刻を表示 } } bool syncRtcWithGnss() { if (Gnss.waitUpdate(1000)) { // 1000ミリ秒待機 SpNavData navData; Gnss.getNavData(&navData); if (navData.time.year >= 2000) { Serial.println("\nGNSS から有効な時刻を取得しました。"); RtcTime rtc_time( navData.time.year, navData.time.month, navData.time.day, navData.time.hour, navData.time.minute, navData.time.sec ); RTC.setTime(rtc_time); Serial.println("RTC の時刻を更新しました。"); printCurrentTime(); return true; } } return false; } void printCurrentTime() { RtcTime now = RTC.getTime(); char buf[64]; snprintf(buf, sizeof(buf), "現在時刻 (RTC): %04d/%02d/%02d %02d:%02d:%02d UTC", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second()); Serial.println(buf); } bool isRtcInitialized() { RtcTime now = RTC.getTime(); return (now.year() >= 2000); // 2000年以降の日付があれば初期化済みとみなす }
コードを動かした時のコンソール表示
Arduino IDE でプログラムが動いている時の様子。
衛星から時刻を取得し、RTC に時刻を設定した後は GNSS モジュール (衛星と通信するモジュール) を停止させています。
そのあと、10 秒に 1 回、RTC の時刻を表示させ続けるプログラムになっています。