15ツッコミがあったのでおうちハックアドベントカレンダーの15日目として。2015なんですが、続き物ということでおうちハックにぶら下げます。日本標準時グループによって、福島県と佐賀県から送信されています。電波時計は、これらの電波を受信して現在時刻を知るわけです。自宅に電波時計があり、買ったときに住んでいた家では電波を受信していたのですが、何度か引越をするうちに電波を受信しなくなってしまったようです。何度手動で合わせても少しずつずれてしまう。電車やバスの時間に合わせて家を出ようと思うと、これが意外と辛い。窓際に置いて強制受信ボタンを押してみたりしたのですが、どうも受信しない。いうことで、ちょうど家にあったArduinoをネットに繋いでNTPから時刻情報を受信し、そこからJJYを発信してみました。必要なものArduinoネットシールド電源用USBケーブル通信用LANケーブル以下、2019年7月2日更新。肝心のスケッチなどですが、以前書いていたものは2015年当時のもので、だいぶ古くなっていたので書き直しました。コードを出すとメンテナンスが継続できなくなったり、継ぎはぎだといい加減だと言われるので非公開にします。Requestに応えられなければ同じ事なので。Timeライブラリは、新しくhttps://github.com/PaulStoffregen/Timeを参照するのが良いでしょう。以前は固定IPで運用していましたが、最近のEthernetライブラリにはDHCPクライアントの機能が付いたため、http://arms22.blog91.fc2.com/blog-entry-445.htmlのような実装でいけるかと思います。メインとなる変調部分はmillis()で比較していたのですが、50日でゼロに戻るという情報をいただいたので、古い情報も持っておいてリセットを検知したら引き算して・・・なんてことを考えたのですが、誤差が出てしまうため、もうすぐリセットされそうとなったところで発信をやめる方法にしました。以上、2019年7月2日更新。発信する電波は、40khz、ArduinoのPWM送信に対応している3番ピンを使います。わたしの場合は50cmのリード線を3周巻いています。アンテナとして機能するために、何周かのループになっている必要があります。時計のすぐそばに設置するなら、それほど電波強度も必要ないので、3周程度できっちりと巻いてなくても受信できました。時計の真裏でないと伝わりませんでした。時計側の性能にもよるので、もう少し長いリード線を使って、きっちりと巻いた方がいいかもしれません。AtermWR9500N)にUSBポートと、余っているLANポートがあったので、そこに繋いでいます。3:05JJYがどうしても届かない場所に電波時計を置きたかったので実際に作ってみての1週間程度運用してみての微妙な点を指摘させて頂きます。50日程度で0クリアされるため、0クリアが起きた場合の回避を記述していないので、最悪50日待ちとなります。(滅多に起きないでしょうが。)2.NTPの取得をサーバー側からの送信時間に頼り1回で時刻設定していますが、私の場合ちょうど10分程度ずれた(原因が通信遅延なのかNTPのデータ異常なのかは不明)ので、2回以上取得して、誤差が許容範囲ならば適用とかにしないと危険です。箇所が無限待ちとなる可能性がありそうです。最大4294967296を想定しなければいけないのに、それを65.536で割った値を引くと負数もしくはとんでもなく大きな正の数となるからです。計算式の正しさが今ひとつわからないのですが、最低限回避のコードを記述しないとハングした様な動きとなります。15:02検証ありがとうございます。コードは、あちこちから引っ張り寄せた物を継ぎはぎしたので、NTPDの仕様をきちんと理解した上で書かれたものでは無いのです。3:13えー...まがりなりにも情報発信するなら、自分で作成したプログラムを使うか、流用したものがあるなら参照元を記載するべきでしょう。処理内容も理解せず、動いてるからいいや、レベルで人に教えるのは危険というか、無責任で図々しいです。9:18とりあえず、参考にしないように注意を付けました。0:39前回と同じものですもう一点指摘させてください。前回の2の問題に関連しています。{とありますが、parsePacketは受け取れたデータサイズを示す様です。{としておかないと、受信データが途中で切れた上に、正常受信した場合に時計情報が出鱈目となります。元ネタという場所を知っていますが、色々考慮すべき事がありますね。(1)ブログ村にほんブログ。