公開日:2025/06/28
title.png

35th Season


#35-4 衛星電波時計

 M5StickC PlusGPSモジュール(NEO-6M)を組み合わせて、衛星電波時計を作って見たいと思います。

GPSから日時を取得

 GPSモジュール(下図)は位置情報を取得するため、GPS衛星からの電波を捉えて動作します。この時、衛星から受信する電波から現在の日時を知ることができます。

a34a_gpsneo6m.jpg

 今回の衛星電波時計アプリケーションでは、衛星から受信した日時で時刻合わせを実行します。

  空さえ見えれば正確な時間を刻むことのできる、衛星電波時計

です。

JJY

 一般的に電波時計というと、日本ではNICTが発信する電波(JJY)によって現在時刻を知ることが可能です

  「#5-9 JJYのエミュレーション

 上の記事でも言及したのですが、筆者宅ではJJYの電波を受信できません……。
 弱い電波なので、窓の向きや付近の干渉する電波状況などが原因だろうと推測していますが、原因は不明です。筆者宅の様に周囲の状況起因で、JJYを受信できない環境の方も一定数居るのではないでしょうか?

 止むを得ず、PCなどネットワーク機器のNTPに頼って正確な時間を知っているのですが、目覚まし時計などネットワークに繋がっていない時計は手動で時刻合わせが必要な状態です。

  「#11-5 WiFi電波時計

 今回の応用は、JJY/WiFiに代わる第3の電波としてGPS衛星からの電波を利用する、衛星電波時計と、なります。

UTC

 GPSモジュールが送信してくる日時は、協定世界時(UTC)です。
 UTC以外のタイムゾーンで使用するには、UTCからのオフセットを計算する必要があります。日本のタイムゾーンは日本標準時(JST)です。

  JST=UTC+9時間

 プログラムとしては他のタイムゾーンへも対応可能な様に、UTCからの時差を<時>と<分>で指定可能な様にしておきたいと思います。

  タイムゾーン目標仕様:

 夏時間🍉に関しては、切り替えタイミングの課題が残ります。1年で春と秋の2回、夏時間⇔通常時間の切り替えが発生します。その切り替えタイミングは、地域によって様々な規則があるため、自動切り替えに対応するのは困難なのです。
 今回のプログラムでは、M5StickC Plusのスイッチによる、手動切り替えに対応します。

RTC

 GPSモジュールから取得した日時は、定期的にM5StickC Plusの内蔵RTC(BM8563)と同期します。内蔵RTCの制御関数については、拙作M5cp-PSライブラリを使います。
 一度M5StickC Plusの内蔵RTCと同期出来たら、その後、地下や建物の内部など衛星からの電波が遮蔽される場所に移動したとしても、RTCによって時刻を刻み続けることができるのです。その後も空さえ見えれば、衛星から最新の時刻を取得できるので、RTCの時刻は定期的に正確な時刻へ調整されます。
 以下の定数で、GPSモジュールから取得した時刻と内蔵RTC間で同期する周期を指定できます。

  const int rtc_min_sync_itvl=50;  // rtc: sync interval (<60)[min]

 単位は[分]で、1〜59の範囲です。範囲外の値を設定すると、定期的な同期を行いません。

U/I設計

 本節ではユーザインターフェイス(U/I)の目標仕様を策定して行きます。

 まず、TFTディスプレイには、現在時刻(RTC)と、GPSから取得した日時や状態などを表示します(下図)。

a354_uigpsclk.png

 上半分は現在の内蔵RTCが刻む時刻、下半分はGPSモジュールから受信した時刻です。
 状態(Status:)は、衛星フィックス状況のA/Vと、RTCとの同期状況S(synchronized)/N(Not-)の2桁で表示します(詳細は以下例を参照)。

  例)状態(Status:)

 GPSから取得した時刻と同期した場合、状態表示は「AS」または「VS」のはずです。GPS時刻と同期していない状態(?N)でも、M5StickC Plus内蔵RTCの時刻を表示するので、時計として機能します。

 その他、M5StickC Plusのスイッチに、以下の動作を割り当てます。

  スイッチの動作割り当て:

 夏時間の設定を変更した場合、内蔵RTCに反映されるのは、次にGPSモジュール時刻との同期が実行されるタイミングです。

※日本には夏時間制度が無いので、誤って設定してしまって気付かないと、丁度1時間ずれた時間が読めてしまうので、ご注意ください。

プログラム

 以下に、完成したプログラムをリンクします。

  完成プログラム:gps_clock.ino

※コンパイルには、M5cp-PSライブラリが必要となります。リンクを辿ってインストールしておいてください。

 コンパイルしてM5StickC Plusに書き込むと、シリアルモニタから、こちらのコマンドを受け付ける様になっています。すべてデバッグ用のコマンドなので、シリアルモニタ無しで自立するプログラムとなっています。

空の下で実験

 M5StickC PlusとGPSモジュールを以下表に従って接続してください。

M5StickC Plus 接続 GPSモジュール
3V3 VCC
GND GND
G36/G25(RXD) TX
  × RX

 後は、上の装置を衛星からの電波を受信可能な場所に設置して、TFTディスプレイに表示された時刻に注目してください。以下、実験中の様子です。

a354_expr.jpg

 「Status:」表示が「VS」または「AS」となったら、GPS衛星からの日時と、内蔵RTCが同期できました。PCなどを使ってNTPサーバ時間と比較してみてください。例えば、NICTの時計表示ページ等がお勧めです。

  NICTのJST表示ページを検索(別ウインドウが開きます)

 どうでしたか?恐らく、+1s未満の誤差が観測されたのではないか?と推測します。ミリ秒オーダで「ピッタリ」同じ時刻が表示される、様な状態では無いはずです。ですが、ミリ秒オーダで合わずとも、誤差1s未満なら日常生活での不都合は無いので、充分な合わせ精度だと考えられます。

合わせ精度

 以下の様な要因で、衛星から日時を受信後、マイコンのRTCへ時刻セットするまでの処理時間が誤差となるため、時刻合わせの精度については、あまり期待できません。

 全て、実際の時刻より遅れる側に働く事象なので、実際の時刻より進む事は、まず、ありません。M5StickC Plus @240MHzの実力なら、最大でも+1s未満の誤差で収まるのではないでしょうか?

 ひっくり返すと、上に挙げた原因を叩いて行けば、時刻合わせ精度を向上する事が可能です。興味のある方は挑戦してみてください。


 今回の実験で、平屋一戸建て住戸内で試す機会があったのですが、住戸の中央付近でも、見つけた衛星数約7個で、バッチリ測位できました。集合住宅の場合は、上層階の構造物で衛星からの電波が遮蔽されるため、装置の設置場所に制約が生じます。


btn_arduino.png

btn_prev.png btn_next.png

home