Raspberry Pi Pico W / Raspberry Pi Pico 2 W で動作する JJY(電波時計用標準電波)シミュレータです。
Wi-Fi 経由で NTP サーバー(デフォルト: ntp.nict.jp)から正確な時刻を取得し、GPIO ピンから
40kHz / 60kHz の JJY タイムコード信号を出力します。ピンに接続した簡易アンテナを電波時計の
近くに置くことで、電波の届きにくい室内でも電波時計を合わせられます。
- Pico W / Pico 2 W 両対応 — MicroPython で実装、どちらも同じファイルで動作
- NTP 同期 — ミリ秒精度で時刻を取得し、毎正秒のエッジを正確に出力
- 40kHz / 60kHz 切り替え —
config.pyの設定 1 行で変更(デフォルト 60kHz) - 定期再同期 — 水晶発振子のドリフトを NTP 再同期(デフォルト 60 分ごと)で補正。 再同期はキャリア OFF 区間内で完結するノンブロッキング方式で、送信信号は一切途切れない
- 自動復帰 — Wi-Fi 切断時の再接続、致命的エラー時の自動リセット
- 省電力・長期安定動作 — 初回同期後は Wi-Fi を省電力モードへ自動切替(平均 30〜50mA)。 秒エッジ直前の待機ループはヒープ確保ゼロ、GC はキャリア OFF 区間に予約実行され、 送信タイミングに影響しない設計
- オンボード LED — 送信中のシンボル(0.2s / 0.5s / 0.8s)に同期して点滅し、動作確認が容易
- Raspberry Pi Pico W または Raspberry Pi Pico 2 W
- 抵抗 1 本(330Ω〜1kΩ)とアンテナ用の電線(詳細は ハードウェア準備)
- 2.4GHz Wi-Fi 環境と USB 電源
- ハードウェア準備ガイド に従ってアンテナを接続する
- インストールガイド に従って MicroPython と本プログラムを書き込む
config.pyを編集して Wi-Fi 情報などを設定する
| 設定名 | デフォルト | 説明 |
|---|---|---|
WIFI_SSID / WIFI_PASSWORD |
— | 接続先 Wi-Fi の SSID とパスワード(2.4GHz のみ) |
WIFI_TIMEOUT_S |
30 |
Wi-Fi 接続のタイムアウト(秒) |
NTP_SERVER |
"ntp.nict.jp" |
NTP サーバー名 |
NTP_RESYNC_MINUTES |
60 |
NTP 再同期の間隔(分) |
NTP_TIMEOUT_S / NTP_RETRIES |
5 / 3 |
NTP 問い合わせのタイムアウトとリトライ回数 |
JJY_FREQUENCY_KHZ |
60 |
JJY 周波数。40(おおたかどや山・東日本)または 60(はがね山・西日本) |
ANTENNA_PIN |
15 |
アンテナを接続する GPIO 番号 |
CARRIER_DUTY |
0.5 |
キャリア ON 時の PWM デューティ(下げると放射強度が下がる) |
TIME_OFFSET_HOURS |
9 |
UTC からのオフセット。JJY は JST なので通常 9 のまま |
STATUS_LED |
True |
オンボード LED を送信シンボルに同期して点滅させる |
RESET_ON_ERROR |
True |
回復不能なエラー時に 10 秒後に自動リセットする |
WATCHDOG |
False |
ハードウェアウォッチドッグ(8 秒)を有効化。例外にならないハングからも自動復帰する。開発中は False 推奨(詳細は INSTALL.md) |
POWER_SAVE |
False |
省エネモード。送信ウィンドウ以外は Wi-Fi を切って lightsleep で待機(電池運用向け)。WATCHDOG とは併用不可 |
POWER_SAVE_STARTUP_MINUTES |
20 |
電源投入直後に連続送信する時間(分)。時計の設置・強制受信用 |
POWER_SAVE_WINDOWS |
("11:45-12:15", "23:45-00:15") |
毎日の送信ウィンドウ(ローカル時刻、日跨ぎ可) |
POWER_SAVE_CPU_MHZ |
48 |
省エネモードの送信中に Wi-Fi を切った上で CPU をこの周波数(MHz)に下げる。0 でクロック変更なし |
実際の JJY は 2 局から送信されています。
- 40kHz — おおたかどや山標準電波送信所(福島県)。主に東日本向け
- 60kHz — はがね山標準電波送信所(佐賀県)。主に西日本向け
お使いの電波時計が受信する周波数に合わせてください。40/60kHz 自動選択の時計はどちらでも
受信できます。海外の時計(WWVB 60kHz など)は本プログラムの対象外ですが、TIME_OFFSET_HOURS
を変えることで実験は可能です。
本プログラムは GPIO 出力(3.3V)に抵抗を介して短いアンテナ線を接続する前提で作られており、 到達距離は数 cm〜数十 cm 程度の「微弱無線局」の範囲での使用を想定しています。 アンプなどで信号を増幅して送信範囲を広げる行為は電波法違反となるおそれがあります。 必ず時計のすぐ近くに置いて使用し、増幅は行わないでください。
日本国外で日本の電波時計を使いたいユーザー向けに、日本の電波法の適用を受けない 環境を前提とした増幅方法を docs/HARDWARE.md の英語セクション "Boosting the signal for users outside Japan" に記載しています。 この増幅回路を日本国内で使用することは違法です。絶対に使用しないでください。 また国外でも、各国の電波規制(米国 FCC Part 15 など)の順守は使用者の責任です。
main.py プログラム本体(コメントは英語)
config.py 設定ファイル
docs/INSTALL.md インストール手順(日本語)
docs/HARDWARE.md ハードウェア準備ガイド(日本語)
tests/ PC 上で実行する回帰テスト(Pico へのコピーは不要)
開発時は python3 -m unittest discover tests で、フレーム生成・
ウィンドウ計算・NTP 時刻計算の回帰テストを PC 上で実行できます。