Rabbit Note

技術的な事柄をメモしていきます.

Raspberry Pi で作る Wi-Fi 式電波時計用リピータ

電波時計が電波を受信しにくい場所でも時刻合わせを可能にする装置を Raspberry Pi を使って作る方法を紹介します.

はじめに

電波時計は 40kHz または 60kHz の電波を使って送られてくる時刻情報に基づいて時間を補正しています.NTP で時刻を正確に合わせた Raspberry Pi から電波を発生させることで,今まで電波時計の恩恵にあずかれなかった時計も時刻を正確にすることができます.

Raspberry Pi 3 や Zero W は無線 LAN に対応していますので,使い勝手としては,Wi-Fi式電波時計用リピータ (P18-NTPWR)と同等のものを実現できます.

回路

作る回路はこんな感じです.LTC1799 を使って 40kHz の信号を発生させておき,その信号と Raspberru Pi の GPOP4 の信号の AND をとって,アンテナをドライブします.

日経 Linux の『ラズパイで電波を送り電波時計を合わせよう』という記事のように Raspberry Pi のみで 40kHz を生成することもできますが,必要以上に消費電力が増加してしまうため,実用性を考えると 40kHz はこのように外部で生成した方がおすすめです.

必要な部品

必要な部品はこんな感じ.

秋月電子 で入手するもの

1kHz~30MHz オシレータ LTC1799 モジュール

電波時計で使われる 40kHz の出力を発生させる発信器です.


多回転半固定ボリューム たて型

上記のモジュールと接続して周波数を調整するのに使用します.


4回路2入力 NAND ゲート

2入力の NAND ゲートが 4 個入った IC です.Raspberry Pi が駆動する IO と発信器の出力を AND するために使用します.
使う周波数が低い(40kHz)なので,3.3V に対応していれば,どれでも良いです.


NchパワーMOSFET

アンテナをドライブするのに使用します.


2種ポリウレタン銅線

アンテナ用の線です.巻きやすくて切れにくいのでおすすめです.


eBay で入手するもの

Ferrite Rod Bar Loopstick

アンテナ用のフェライトバーです.
もし,リンク先の商品が無い場合は「Ferrite Rod Bar」で検索すると同様のものが見つかると思います.


アンテナの作成

フェライトバーにポリウレタン銅線を巻き付けてアンテナを作ります.
一重ではなく二重に巻く必要があります.一重のままだと電波の出力が弱かったり電流が流れすぎて発熱したりしますので,頑張って二重に巻きましょう.

巻き終わったら,瞬間接着剤を垂らして固定すれば完成.

基板実装

回路図に従って素子を配線します.

完成したら可変抵抗が 21.7kΩ になるように調整します.これでほぼ 40kHz が出力されるようになるはずです.オシロが手元にあれば,LTC1799 の OUT 端子の出力が 40kHz になることを確認しておくと良いです.

写真では,5V ラインにヒューズを追加していますが,これは 5V ラインがショートしたときの安全対策なので無くても OK です.

ソフト

下記のようなコードを書きます.

NICT が公開している『標準電波の出し方について』というページと照らし合わせていただくと,やっていることは理解できると思います.

Raspberry Pi の GPIO4 端子を回路図の GPOI4 という端子に接続してやれば標準電波を出力するようになります.
GPIO4 以外の端子を使う場合は,GPIP_PORT の部分を適宜修正します.

組み立て

基板むき出しのままだと見た目がわるいので,適当なケースに収納します.

私の場合,IKEA の DRAGAN を使用しました.

電源ケーブルを通すための穴を開け,ケーブルホルダでアンテナを固定してやればこんな感じにわりと
綺麗に収まります.

2週間ほど運用してますが,今のところ快調です.Raspberry Pi Zero W とか使えば5千円もあれば十分できますので,電波時計が合わずに困っている方にはおすすめです.

補足

箱の温度が少し上がっていたので,サーモグラフィーで調べててみました.

アンテナ自体も発熱していますが Raspberry Pi の本体よりは低く,温度上昇としては10℃程度にとどまり問題なさそうです.

LINEで送る
Pocket

,

16 thoughts on “Raspberry Pi で作る Wi-Fi 式電波時計用リピータ
  • Kadota より:

    こんにちは、興味津々で読ませてもらっています、プログラムも知らない私です、こんな私でも
    サイトを参考にして、見よう見まねで、作っても良いですか?(作れるかどうかも分からない)

  • Kadota より:

    使用しているICは、何でしょうか?

  • kimata より:

    本文に追記しました.NAND が入っているものであれば何でも良いと思います.

    • Kadota より:

      情報ありがとうございます。助かります。とりあえず、eBayでフィライト注文しました。

  • Takumi より:

    大変参考になりました。ありがとうございます。

    当方の腕時計、目覚まし時計は、受信している様子でしたが、
    最終的になぜか更新されないため、原因を探りました。
    そこで、年内通算日を以下のように修正したところ、
    無事に受信・更新されるようになりました。

    年内通算日は1月1日が「1」になりますので、
    46行目の「datetime.date(now.year, 1, 1)」は、
    「datetime.date(now.year – 1, 12, 31)」が正しいかと思います。

    カレンダーを自前で持っている時計は、
    おそらく日付と曜日の照合をしているためエラーとなりましたが、
    日付表示のない時計は異常が出ないかもしれませんね。

    • kimata より:

      コメントありがとうございます.
      その通りですね.

      本文の方は修正させていただきます.

  • ratha より:

    Nch FETは負荷のGND側につけるのが通例だと思います。

    この回路でも動作しますが、アンテナコイルにかかる電圧分GNDからFETのソース電位が浮きますので、ゲート・ソース電圧が3.3Vでは無く、(3.3-コイルにかかる電圧)Vとなってしまい、うまくONに成りきらない時間が存在します。
    (実際手元でこのページの通りの回路を組むと、アンテナ用の電源が5Vに対して実際の出力が3V程度(アンテナの代わりに390Mの抵抗をかませ、そこにかかる電圧)になっています。FETをGND側に入れれば問題なく5Vかかりました。)

    FETの位置を変更するだけで、プログラムに変更は必要ありません。

    参考までによろしくお願いします。

    • kimata より:

      > Nch FETは負荷のGND側につけるのが通例だと思います。

      そうですね.なんか理由あったけ?と考えてみましたが特になさそうなので,
      GND 側に付けるのが良さそうです.

      指摘ありがとうございます.

      > FETの位置を変更するだけで、プログラムに変更は必要ありません。

      アンテナの発熱が増すと思いますので,熱くなっていたら 150行目を次のようにして,
      送信間隔を2分おきにすると良いかもしれません.

      time.sleep(60*2 – (sec + usec/1000000.0))

      • ひろんた より:

        電波時計のリピターを検索していたらたどり着きました。

        # GPIO に H を出力する事で 40kHz パルスが停止する回路を想定しています.
        となっていますがANDをとっていてN-MOSなのでゲートがHI(3.3V)の時に電流が流れるので
        Hの時にパルス発生じゃないでしょうか?
        それかN-MOSでVgsが4VのFETですがちゃんと電流が流れたでしょうか?
        またソースをGND、ドレイン-5V間にコイルをつなげないと折角の5Vがつかえないともったいないいと思います。
        これらが解決したら製作したいと思います。

        • kimata より:

          ご指摘の通りです.

          上の方で別の方からも回路図の不備を指摘いただいており,何か辺だと思い直して調べてみたところ,実際に使っている回路と回路図が違っていました.

          回路図を修正しましたので,確認お願いします.

          >それかN-MOSでVgsが4VのFETですがちゃんと電流が流れたでしょうか?

          こちらは問題ないです.3.3V でも 10A 程度は流せるので,今回の目的では 3.3V ドライブでも
          目的は果たせます.

          • ひろんた より:

            さっそくの返信ありがとうございます。
            ラズパイも初めて触るので心配ですが
            トライしようと思います。
            40KHz Or 60KHzは74HC00がNAND4回路入りなので
            2回路でAND、もう残りでXTALで発信させようと思います。

  • Sora より:

    こんにちは。私も現在NTPリピーターを自作している最中で非常に参考にさせていただいています。アンテナ用のポリウレタン線の線径は何mmのものをお使いでしょうか?

  • kimata より:

    0.29mmの物を使っています。太いタイプも試しましたが、こちらの方が電波の飛びが良かったです。

  • Ikeda より:

    購入するのは高価なので、何とか自作を考えていましたら、こちらにたどり着きました。
    素晴らしい情報をありがとうございます。
    プログラミングは初心者でして、申し訳ありませんが、教えてください。
    下記のエラーが出てしまいます。
    何が原因でしょうか。
    お手数お掛けしますが、よろしくお願いします。

    Traceback (most recent call last):
    File “/home/pi/time.py”, line 152, in
    send_datetime(now + datetime.timedelta(minutes=1))
    File “/home/pi/time.py”, line 59, in send_datetime
    min_parity = send_bcd(minute/10, 3, min_parity)
    File “/home/pi/time.py”, line 37, in send_bcd
    bit = (num >> ((count-1) – i)) & 0x1
    TypeError: unsupported operand type(s) for >>: ‘float’ and ‘int’

    • kimata より:

      コードが Python 3.x に対応していなかったので修正しました.
      再度コードをコピペしてみてください.

      修正内容としては send_bcd 関数のなかで num を int(num) に変更しています.

      • Ikeda より:

        早々のご対応ありがとうございます。
        正常に動作しています。
        他の記事も参考にさせていただきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です