picojjy
Raspberry Pi Pico W で電波時計を合わせる JJY シミュレータ
JJY time-signal simulator for Raspberry Pi Pico W / Pico 2 W
picojjy は、Raspberry Pi Pico W / Raspberry Pi Pico 2 W で動作する JJY(電波時計用標準電波)のシミュレータです。Wi-Fi 経由で NTP サーバー(デフォルトは ntp.nict.jp)から正確な時刻を取得し、GPIO ピンから 40kHz / 60kHz の JJY タイムコード信号を出力します。
ピンに抵抗を介して接続した簡易アンテナを電波時計の近くに置くことで、電波の届きにくい室内でも電波時計を合わせられます。MicroPython で実装しており、main.py と config.py の 2 ファイルを Pico に書き込めば、あとは USB 電源につなぐだけで常時稼働の JJY 送信機として動作します。
実際の JJY は、おおたかどや山(福島県・40kHz、主に東日本向け)とはがね山(佐賀県・60kHz、主に西日本向け)の 2 局から送信されています。お使いの時計が受信する周波数に合わせて設定してください。なお本プログラムは、到達距離が数 cm〜数十 cm 程度の「微弱無線局」の範囲での使用を想定しています。アンプなどで信号を増幅して送信範囲を広げる行為は電波法違反となるおそれがあるため、必ず時計のすぐ近くに置いて使用し、増幅は行わないでください。
特徴
- Pico W / Pico 2 W 両対応。MicroPython で実装され、どちらも同じファイルで動作します
- NTP 同期でミリ秒精度の時刻を取得し、毎正秒のエッジを正確に出力します
- 40kHz / 60kHz の切り替えは
config.pyの設定 1 行(デフォルト 60kHz) - 定期再同期(デフォルト 60 分ごと)で水晶発振子のドリフトを補正。再同期はキャリア OFF 区間内で完結し、送信信号は途切れません
- Wi-Fi 切断時の再接続と致命的エラー時の自動リセット。ハードウェアウォッチドッグ(
WATCHDOG)も有効化できます - 初回同期後は Wi-Fi を省電力モードへ自動切替(平均 30〜50mA)。電池運用向けの省エネモード(
POWER_SAVE)も用意しています - オンボード LED が送信中のシンボル(0.2s / 0.5s / 0.8s)に同期して点滅し、動作確認が容易です
- フレーム生成・ウィンドウ計算・NTP 時刻計算の回帰テストを PC 上で実行できます(
python3 -m unittest discover tests)
対応環境と入手方法
Raspberry Pi Pico W / Pico 2 W(MicroPython)。2.4GHz の Wi-Fi 環境と USB 電源が必要です。GitHub リリースは用意していません。リポジトリから main.py と config.py の 2 ファイルを取得し、Pico に書き込みます。
git clone https://github.com/shunnag/picojjy.git
- MicroPython 公式サイトからお使いのボード用の UF2 ファイルをダウンロードし、BOOTSEL ボタンを押しながら USB 接続した Pico のドライブにコピーします。Pico W と Pico 2 W でファイルが異なるので注意してください。
config.pyを編集します。最低限WIFI_SSID、WIFI_PASSWORD、JJY_FREQUENCY_KHZ(40 または 60)の 3 つを環境に合わせてください。Pico の Wi-Fi は 2.4GHz のみ対応です。- Thonny(GUI)または mpremote(コマンドライン)で 2 ファイルを転送します。
# mpremote のインストール(初回のみ)
pip install mpremote
# リポジトリのディレクトリで実行(config.py は編集済みであること)
mpremote cp main.py config.py :
# 再起動して実行開始
mpremote reset
ハードウェアは、GP15(ANTENNA_PIN で変更可)から 330Ω〜1kΩ の抵抗を介して 20〜50cm のアンテナ線をつなぐだけで、はんだ付けなしのブレッドボード構成でも動作します。詳しくは ハードウェア準備ガイド と インストールガイド を参照してください。