家の時計の時刻合わせをどうにかしたい (第5話:時刻合わせソフト作成編)

今回は、RaspberryPi上で動作させる時刻合わせソフトについて書こうと思います。

ソフトについては、2種類用意しました。
・ 24H電波信号を出し続ける仕様
・ 15分間のみ電波信号を出して終了する仕様

【時刻合わせ電波送信ポリシー】
・時刻合わせの電波を24H常時出す事はしない。
現在所持している、シチズン、カシオの説明書に自動時刻合わせ時刻が書いている。
もう1台電波時計(メーカ不明)があるが、おそらくシチズンやカシオと同じ時刻であろう。
よって、2時,3時,6時,10時,14時,18時,22時 から15分間のみ電波発射を行う。

・余り考えたくないが、下手すると隣のお宅まで電波が届く可能性もある。 今回制作したアンテナや基板にて、どこまで電波が届いているか不明である為、 誤った時刻の電波信号を出さないようにする

【動作設計】
※ NICTの時刻合わせ電波(標準電波)仕様を見ると、
・時刻合わせ信号は、1分間で年月日・日時を出しています
・毎時、15分,45分に送信するパターン(仮にAとします)と15分,45分以外のパタン(仮にBとします)の2種類が存在し、Bパターンは年月日・日時のデータなのですが、Aパターンは年のデータ部分が呼び出し符号になっていたり、停波予告や停波期間のデータに置き換わっています。
以上の事を踏まえ、
1. 毎時15分,45分は時刻合わせ出来る信号では無い為、プログラム上は何も信号を送らない事にします。
2. うるう秒対策は行いません
という事で、
C言語があまり分からない私は、Endeavors Piecesさんのコンテンツに掲載されているソースを拝借し、上記1の仕様を追加。
また、15分でプログラムが終了するように改修しました。 Endeavors Piecesさんのサイトで、問題点として、長く動かし続けていると時間がずれてくると書かれてましたので、毎時 15分,45分で、時間の調整を行うようにしたつもりです。
※参考記事 HP「Endeavors Pieces」 RaspberryPiで電波時計の時間を合わせる http://green2.ddo.jp/RaspPi-jjy/index.html

私が所持しているカシオ、セイコーの電波時計の時刻合わせタイミングは、説明書では、
[セイコー] 02時 03時 6時 10時 14時 18時 22時 の16分間行われる。
[カシオ] 02:01 03:01 06:01 10:01 14:01 18:01 22:01 に行われる。
(何分まで行われるかは明記なし)
この事から、セイコーは私が勝手に毎時0分だろうと解釈しました。 そこで実行時間を15分間としました。

【電波信号を出すプログラム】
1. 常時実行版 (ソースはこちら jjy.c) Cのソースなので、以下のコマンドでコンパイルします。
# gcc -o jjy_send jjy.c -lwiringPi -lwiringPiDev

2. 実行15分制限版 (ソースはこちら jjy-cron.c) Cのソースなので、以下のコマンドでコンパイルします。
# gcc -o cron-jjy_send jjy-cron.c -lwiringPi -lwiringPiDev

【誤時刻の送信防止シェル】 私は、2の実行15分制限版で実行します。 Cが分かれば、Cのソース上で書いたほうがシンプルなのですが、私はCが書けません。 Perlは少々嗜んでいるので、なんとなくここをこうすれば良いのだろうレベルで改修しています。 そこで、時刻合わせを実行する為のシェルを書き、NTPが同期状態である際に電波信号を送信する事にしました。 NTPが同期状態にあるかどうかは、Nagiosという監視プログラムのプラグインで検査させ、同期している場合は、電波信号を送信するプログラムをキックし、同期していない場合(例え、OS上の時刻が合っていても)は、キックしない事にしました。
・ cron-jjy_send.sh (ソースはこちら cron-jjy_send.sh)

【私のファイル配置について】

/opt/jjy-send/     
 --- bin/       
 --- cron-jjy_send       
 --- cron-jjy_send.sh       
  --- jjy_send     
 --- log/       
 --- jjy_send-log.err      
 --- jjy_send.log -> /opt/jjy-send/log/jjy_send-log.20160104

【スケジュール実行にあたり】
crondにスケジュールさせて実行します。
ただ、プログラムは必ず0秒キッカリ開始されるとは限りません。
実行時間のリソース状況により、稀に1,2秒遅れる事も予想されます。
ここは、Endeavors Piecesさんのコンテンツに掲載されているソース内で次回の0秒まで待ち状態となるようコーディングされていましたので、スケジュール登録は以下の通り、1分前としました。
# crontab -l
59 1,2,5,9,13,17,21 * * * /opt/jjy-send/bin/cron-jjy_send.sh > /opt/jjy-send/log/jjy_send-log.err 2>&1

【使用条件と免責事項】
Cが満足に書けない私が改修していますので、いろいろ問題点・不具合が発生する可能性があります。
まあ、お約束なのですが・・・ ・このソースを、全てまたは一部をいかなる形式、いかなる手段によっても、再配布または転送しないでください。
・このソースは、不具合や機能の向上などにより将来予告なしに変更することがあります。
・このソースをダウンロードし、インストールすることによって生じるいかなる問題についても、当方はその責を負いません。 利用者の責任下において行われるものとします。
・このソースを利用した際に生じたあらゆる損害に対して、当方は一切の責任を負いません。

前へ

家の時計の時刻合わせをどうにかしたい (第4話:OS導入編)

次へ

家の時計の時刻合わせをどうにかしたい (第6話:ソフト動作テスト編)