«

 Raspberry Piを使用した電波時計リピーター

2019. 4. 13 (土)

ラズパイを使用した電波時計リピーターです。
実際に受信した電波をあらためて送信し直すのではく、ラズパイの日時情報から生成したタイムコードを送信するものですので、正確にはリピーターではなくシミュレータですが、この手の既存製品もリピーターと呼ばれていることも多いので、ここでもリピーターと呼びます。

回路について

主に
・ラズパイからのタイムコード受け取り部
・キャリア信号発振部
・信号加工部
・スイッチング、送信部
からなります。

5Vの電源は基板側へACアダプタを接続し、コネクタを通してラズパイへも供給されます。
同じ配線のままラズパイから基板へ5Vを供給するという流れもできてしまいますが、ラズパイから外部への電力供給は1ポートあたり16mAまで、総合で50mAまでという制限があるので、基板側からラズパイへ送るようにしたほうが無難です。
間違って接続してしまわないか不安な場合は、ラズパイから基板側へ流れる電流を制限するような保護回路も付けたほうが良いでしょう。

キャリア信号の生成は40kHzまたは60kHzの水晶振動子を使っています。
両方使いたい場合はスイッチで切り替えるようにしても良いと思いますが、私は2ピンソケットで差し替えるようにしました。
ラズパイの別のポートを使って切替制御することも可能かと思いますが、稼働させ始めたらそれほど頻繁に切り替えるようなものでもないので、今回は見送り。

信号加工はCD4011というNANDゲートのICを使用しています。
水晶振動子を使った発振回路用のXORゲート、ラズパイからのタイムコートパルスと発振回路のキャリア信号のNANDゲート、それをさらに反転させるためのXORゲートとして使っています。

スイッチングにはパワーMOSFETを使用。
送信は自作のフェライトバーアンテナと、外部アンテナとして適当なリード線を使用。
使ったフェライトバーは昔ラジオから取り出して温存しておいた、断面が6x12mm、長さ70mmの角型のもの。
それに0.29mmのポリウレタンワイヤーを、1次側10m、2次側5mほど巻きました。
電波到達距離はフェライトバーアンテナのみで50cmほど、リード線を付けて部屋の中いっぱいくらいでした。
このアンテナ次第で電波の飛びが大きく変わったりしますが、この辺あまり詳しくないので詳細は省きます…
あまり強くしすぎると電波法にも引っかかってくるのでご注意。

回路図とパーツ配置例
 
回路設計については素人同然ですので詳しい方から見ればツッコミどころも多々あるかと思いますが、目を瞑っていただければ(^^;

作成した基板と、ラズパイZeroを挿した様子
  
離れた位置にも水晶振動子が一個挿さってますが、単に使っていないほうを無くさないための置き場所です。
水晶振動子は小さい上に足も細く抜き差しして使うにはあまり向いていないので、ピンソケットをハンダ付けして使っています。

水晶振動子を使った発振回路部分は、部品個体差などの影響が出やすい箇所かと思います。
当初、C1とC2それぞれ15pFで仮組みしてみましたが、発振周波数を見てみると40kHzの振動子で80kHz、60kHzの振動子で120kHz出たり、触るとふらついて更に増減したりと不安定でしたが、最終的にC1側に15pFを1個、C2側に15pFを2個並列で30pF(回路図では30pFを1個として書いています)とすることで、40kHz、60kHzどちらの振動子でも安定して目的の周波数で発振してくれるようになりました。
実は今回の製作中でいちばん手こずった部分でもありますが、いちばん楽しかった部分でもあります。

この辺りの試行錯誤は、こちらのページの情報が大変参考になりました。
水晶発振回路の豆知識/なひたふ新聞

調整しているうち、40kHzの振動子では正しく発振するのに60kHzの振動子ではおかしい(あるいは逆)という状態になることもあるかもしれませんが、どうしても両方で正しく発振するよう調整しきれなければどちらか一方で手を打つか、CD4011のNANDゲートの空き1個も使って40kHz用と60kHz用それぞれ別に発振周りの回路を作り、スイッチかジャンパで選択するようにしてしまうのも手かもしれません。
あるいは水晶振動子ではなく、LTC1799のようなオシレータを使うのも有りかと思います。
(LTC1799を使ったこともありますが、これはこれで半固定ボリュームでの微妙な調整が難しかったです)

マルチメーターで簡易的に発振周波数を確認している様子

稼働中の様子

発熱に関しては、既に数日稼働させていますがCPUの裏あたりを触るとほんのり温かく感じる程度なので、とくに心配することもなさそうです。
(ずっと可動させている状態で、室温25℃の時に vcgencmd measure_temp で確認したCPU温度は36℃程でした)

稼働状態の消費電力も監視してみましたが、基板とラズパイZeroを接続した状態でラズパイ起動時には最大200mA程、起動完了後しばらくして安定し始めたらだいたい平均100mA前後でしたので、ほとんどラズパイZero単独で稼働させた時と同じでした。
とはいえ、回路の作り方によっても変わってくるかと思いますので(特にフェライトバーアンテナ次第で大きく変わると思います)、やはりラズパイから基板への電力供給は避け、基板からラズパイへ電力を送るか、あるいは配線が多くなりますが基板とラズパイ個別で電源を取るようにしたほうが無難でしょう。

スクリプト

■ JJYシミュレータ(jjy.py)

シミュレータ本体。
Pythonで書かれています。
JJYのタイムコードをシミュレートしてラズパイのGPIOポートに出力します。

設置パス例
/home/pi/prog/jjy.py
設置したファイル jjy.py のパーミッションを0744にしておきます。

後述の送出タイムコード日時変更ユーティリティを使用する場合は、
/home/pi/prog/ に jjy_adjust.txt という空ファイルを作成してそのファイルのパーミッションを0666にしておきます。

> /home/pi/prog/jjy.py
でフォアグラウンドプロセスとして(通常の状態として)実行できます。
実行中はCtrl+Cで中断できます。

バックグラウンドプロセスとして実行する場合は

> /home/pi/prog/jjy.py > /dev/null &
(末尾に「&」を付けるとバックグラウンド実行になります。「> /dev/null」はそのプロセスの画面表示を非表示にするためのものです)
バックグラウンドプロセスはCtrl+Cでは中断できません。
> ps -A
で実行中のプロセスIDを検索して
> kill プロセスID
とするか、
> pkill ^jjy\.py$
で中断できます。

起動時に自動でバックグラウンド実行させたい場合は、

> sudo nano /etc/rc.local
として /etc/rc.local を開いて
末尾のexit 0という行より手前に
/home/pi/prog/jjy.py > /dev/null &
を追記して保存します。
再起動後より自動実行が有効になります。

自動実行させる方法は /etc/rc.local への追記以外にもいくつかありますが、ここでは割愛。

ラズパイ内部の時計を正確に保つため、ntpdでnictのNTPサーバへ同期するよう設定しておくのもいいと思います。
最新のRaspbianではntpdが入っていないという話も聞きますので、「ラズパイ ntpd インストール」で検索すれば、私がここで説明するよりずっと分かりやすく解説されている記事がたくさん見つかると思います。

実際のJJYの標準電波には毎時15分と45分の40秒台の9秒間、モールス信号でのJJYコールサインがありますが、電波時計にとってそれは必要無いというかむしろノイズでしかないので、本シミュレータでは実装していません。
コールサインもお聞きになりたいのであれば、聴感上の再現を主としてJavascriptで作成したこちらをどうぞ。

■ JJYシミュレータ用 送出タイムコード日時変更ユーティリティ(index.php)

リピーターが送信するタイムコードの時刻設定を他のPCやスマホのWEBブラウザから変更するためのスクリプトですが、こちらは設置しなくてもリピーターは動作します。
PHPで書かれています。
ラズパイ上でApache2等のwebサーバを稼働させている必要があり、PHPのインストールも必要です。

設置パス例
/var/www/html/pi/jjy/index.php

同一ネットワーク上のブラウザから
http://raspberrypi/pi/jjy/
http://raspberrypi.local/pi/jjy/
http://[192.168.0.xxx等、ラズパイのローカルネットワーク上でのIPアドレス]/pi/jjy/
等のURLでアクセスできます。
設定や環境によって変わる場合もありますので、その場合は適宜調べてください。
インターネット経由での外部からのアクセスは不可。あくまで同一LAN上からのアクセスに限ります。
インターネット経由でアクセスできるようにする方法もありますが、シミュレータの時刻補正に外部からのアクセスは不要ですのでここでは触れません。

実行すると、jjy.plが送出するタイムコードを実際の日時に対して進めたり遅らせたりするための更新画面が表示されます。
ここで設定されるものはあくまで「どれだけずらすか」という情報のみですので、ラズパイ自身の時刻設定そのものが変更されることはありません。

日時設定変更ユーティリティの操作感の確認用サンプル

jjy.pyを別のPCからSSH経由でフォアグラウンドプロセスとして実行させ、ブラウザからタイムコードの送出日時設定変更を行ない、変更した設定が反映される様子

使用した主な部品リスト

ピンソケット 2×20
ラズパイとの接続用

水晶振動子 40kHz
標準電波のキャリア信号発生用

水晶振動子 60kHz
標準電波のキャリア信号発生用
必要なほうどちらか片方だけでも大丈夫です。

積層セラミックコンデンサ 15pF
当初15pFで設計しましたが、発振周波数が2倍、3倍となったりして不安定だったので並列に増減しながら様子を見て、C1側15pF、C2側並列2個で30pFで落ち着きました。

抵抗 10MΩ

抵抗 220kΩ

CD4011BE 4回路NANDゲートIC
手持ちがあったのでこれを使いましたが、SN74HC00N等でも構いません。
回路図でのピン番号の違いは適宜読み替えて下さい。

ICソケット 14pin
無くても大丈夫。
ハンダ付けの熱でICを壊さないか心配な場合はあったほうが安心。

2SK2232 パワーMOSFET

■ 適当なフェライトバーアンテナ

■ 外部アンテナ
付けなくてもフェライトバーアンテナのすぐ近くであれば届きますが、私はたまたま手元に余らせていた3.5mmミニプラグのオーディオケーブルをアンテナとして使ってます。
既存ケーブルを流用する場合は、芯線だと物によってはシールドされている場合もあって電波が飛ばないので、ケーブルのGND側に結線。

3.5mmミニジャック
3.5mmオーディオケーブルを外部アンテナとして流用する場合の接続用

■ LED
手元にあった1.8mm白色チップLED

■ LED保護及び輝度調整用の抵抗
抵抗値が低ければ明るく光りますが、低すぎたり抵抗を繋がなかったりするとLEDに電流が流れすぎてすぐ切れます。
逆に抵抗値が高ければ暗くなりますが、高すぎると電圧が足りず全く光らなくなります。
私は手元にあった24kΩのを使ってます。
24kΩだとかなり暗いですが、照明用途ではなくタイムコードのパルス確認用なので、明るすぎないのはむしろ好都合。

ユニバーサル基板
回路が収まれば何でもいいです。
せっかく小さなZeroを使うので、それに合わせた小さな基板にまとめてもいいかもしれません。

マイクロUSB端子
回路の電源供給用です。
電源自体は市販のUSB ACアダプター等を使ってください。

丸ピンソケット 1×12
いくつか切り離して水晶振動子差替え用のソケットにしました。

■ Raspberry Pi Zero WH
タイムコードシミュレート及びパルス制御させる本体。
他のラズパイでも大丈夫かと思いますが、常時稼働する前提なので消費電力の少ないZeroで、更にWi-Fiによる設定変更やNTPサーバとの同期、コネクタ接続も必須なのでWHが最適。
こんな小さなロジックボードひとつでサーバとしての機能がパワーはそこそこであれひと通り実現できてしかも安く入手できるのですから、いい時代になったものです。

«

Comments are closed.