電波時計の時刻を合わせたい… 助けてChatGPT!

8月12日から4日間取得した有給休暇とを合わせて、8月9日から9日間の大型連休となったわけですが、実家への帰省や墓参りといった行事があったり、普段、後回しにしていた雑用を片付けたり、録り溜めていたテレビ番組を一気に見たりと、気が付けば休みも残り数日。

怠惰な生活を送っていたわけでは無いものの、ブログに書くようなテーマも無いので、これはダメだ、と、ちょっと時間を作って、趣味と実益を兼ねた(といっても、お金になるような話では無く、高価な機材を買わなくて済むかも、という…)ツール作成をやってみました。

電波の届かない電波時計

数年前から脱衣室に置時計を置いているんですが、これが電波時計なんです。

朝の忙しい時間に洗面台で身支度を整えながら時刻を確認することが多いので時計は欲しかったんですが、気が付けば遅れてるんですよね。この時計が。

この1台しか時計が無いわけではないので、「(最近は)何十秒遅れてる」とか、「1分30秒遅れてる」とか、頭で引き算(補正)しながら時計を見るので、結構な面倒さです。

マンションの浴室は通路(玄関)側からもベランダ(リビング)側からも離れた真ん中にあるので、補正用の電波は全く入りません。

なら、電波時計をやめて遅れにくい普通の時計に変えれば?という話ではあるんですが、何とかならないか、とすがったのがChatGPTです。なんだそれ。。

GPT-5に相談

ChatGPTは、2年半前からいろいろと活用していて、いくつか記事を書いてます。

この頃から比べると、今の精度は非常に高く、大抵のことは何とかなりそう、という気になります。

もちろん、万能ではないので妄信はNGですが、物ごとの解決の「入口」には十分すぎるほどの回答を与えてくれます。

そんなわけで、電波時計の時刻を合わせる方法が無いかと尋ねてみた結果、いくつかのまじめな(真っ当な)回答の他に、ちょっと面白い解決方法があったので、それを深堀してみたんです。

それが、「室内向けJJY送信器をラズパイ+ソフトで作る」というものでした。

注意

以下、紹介する内容は「屋内での検証用」を想定しており、電波法に抵触しない範囲での実験を前提としています。

万一、法令違反や第三者への電波干渉等が発生した場合でも、責任を負いかねますので、あくまで自己責任でお願いします。

そもそも電波時計って…

電波時計とは、標準電波局(JJY)から送信される時刻情報を受信して、自動的に正確な時刻に合わせる時計ですから、電波が届かなければ、ただの時計です。

日本には福島県のおおたかどや山局(40kHz)と、佐賀県のはがね山局(60kHz)の2ヶ所の送信所があって、それが日本全国の電波時計を補正しています。日本国内にたったの2ヶ所です。いかに出力が大きいか、ということですよね。

どういう電波が送信されているのか、というと、60秒で1フレームとなるフォーマットで、年月日や時刻の情報が送られるのだそうです。

1秒ごとにパルスが送られるのですが、200msOFF→800msONでビット0、500msOFF→500msONでビット1という具合だそう。

区切り用マーカー(800msOFF→200msON)などもあるので、60個のパルス全てがデータではないですが、1秒間に1bitの通信、つまりは1bpsという、これまでのシステム開発では経験したことのない「遅い通信」です。

この通信速度で、60秒かけて、

  • 分・時・日付・曜日
  • うるう秒予告
  • 夏時間情報
  • 誤り検出のためのパリティビット

といった情報が送信されるそうです。

Raspberry Pi Pico W を使う

ChatGPTが提案した通り、用意するのは Raspberry Pi Pico W と、アンテナとして使用するケーブル、抵抗くらいです。

2年前の夏に Raspberry Pi Pico を使用してLEDを点灯させたり、PWM制御をしたりして遊びましたが、今回は、末尾にWのついたものを使用します。

Wの付いた Raspberry Pi Pico W は、Wi-Fiの付いたバージョンです。時刻情報をNTPから取得するためにWi-Fiがあった方がやりやすい、ということですね。

実は、2年前に購入していたのですが、使用せずに置いたままになっていたものを持ち出してきました。

まずは、ヘッダーピンを取り付けます。

前回同様、ブレッドボードにヘッダーピンを取り付けてから Raspberry Pi Pico W を載せ、はんだ付け。

こうすると、2本のヘッダーピン間の距離がちょうどブレッドボードの間隔になりますので、ヘッダーピンが傾いてブレッドボードに入らない、というような悲劇は無くなります。

アンテナの作成

自作アンテナなんて作ったことが無いので、これで合ってるかどうかは判りませんが、エナメル線を150cmほど使用して、直径10cmほどのループ型にしてみました。

それぞれの端をGP15とGNDにつないでいますが、GP15とアンテナの間に、GPIO保護のために抵抗を挟んだ方が良いかと思います。

ハードの準備はこれだけです。

ソフトの書き込みと動作検証

Python開発環境の「Thonny」を起動した後、「BOOTSEL」の白いボタンを押しながらUSBケーブルをPCに接続します。

この辺りは、基本、Wなしと同じですので、

を見て頂ければよいかと思います。

違うのは、機種選択の部分で、

「Raspberry Pi・Pico W / Pico WH」と、W付きを選ぶ、ということくらいです。

インストール後、念のために、こんなことを試してみました。いずれもChatGPTの提案です。

ちゃんと、Pico Wとして動いていることが確認できました。

W付きは初めてなので、こんなサンプルプログラムも動かしてみました。

こんなに簡単にWi-Fiにつなげられるんですね。

きちんとIPアドレスが取得できていました。

室内向けJJY送信器プログラム

で、いよいよ本題です。

Pythonのソースコードは、提示したいところではありますが、下手すると法規に抵触する恐れがあるので、控えさせてください。

ただ、ChatGPTにお願いすれば、ソースコードは簡単に提供してもらえます。法令に触れる恐れがあるのでコードの提供はできない、と返される可能性もありますが、電波の空間放射では無く近接結合(磁界カップリング)で行うことを指示すれば大丈夫です。

その中に、

WIFI_SSID = "YOUR_SSID"
WIFI_PASS = "YOUR_PASS"

のようなコードが出てきますので、Wi-FiルータのSSIDとパスワードを設定します。これもChatGPTに教えれば完全なソースコードが提供されるのかもしれませんが、そこは…ですね。

恐らく出力端子は、GP15が指定されると思いますが、他の端子が指定されたらアンテナの接続先を変えるか、端子の変更をお願いするかしてください。

いざ実行

Raspberry Pi Pico Wに Thonny から実行します。

さすがはChatGPTですね。

2倍速再生(音声はありません)

時計表示で10:27:50あたりで受信アンテナ表示が出始め、10秒ごとにアンテナ表示本数が増えて来ます。

3本表示になったので、そのまま時刻同期完了、さすがはChatGPT、となるかと思いきや…。

時計表示で10:28:40を越えたあたりでアンテナ表示が消えてしまいます。もちろん同期は完了しません。

さきほどから「時計表示で」という表現を使っていますが、これは、この時計の時刻が数十秒ズレているからです。

ですので、実際には、NTPで同期した時刻に合わせて毎分00秒から新フレームの送信が行われますので、10:28:00から通信のフレームが始まり、恐らくは電波のキャリア検出でアンテナ表示が出始めたのかな、と。

そのあとは、どのデータを受信したから1本追加、という感じでは無く、順調に受信できれば10秒間隔でアンテナ本数が増えているようです。

で、10:29:00でアンテナ表示が消えてしまう、と。

実際には、10:28:59のフレーム末尾のマーカーでのパリティチェックでエラーになってしまっているのかな、と思います。

じゃぁ、送信データがおかしいんじゃないの?と思うのが自然なところ。

で、ChatGPTと情報交換しながら訂正を進めて行ったんですが、なかなか改善せず。

フレーム切り替え時の処理を変更したり、デューティー比を微調整したり。

結局、20回目の提案ソースコードでここまで来ました。

実際に、Raspberry Pi Pico Wにソフトを書き込み、全く電波が入らない脱衣室で確認をしています。

時計表示で11:42:09あたりから受信アンテナが立ち始め、安定して3本表示に到達します。

そのまま1分後に同期が完了するのかと思いきや、しばらく3本表示が続きます。ですので動画は11:42:42あたりから、8倍速表示にしています。

で、3本表示となったフレーム受信完了からさらに2分経過した11:44:44、ついに時刻同期が完了しました。(撮影のため、意図的に時刻をずらせてました)

切り替わった(同期された)時刻が 12:50:56。

結局、最初のキャリア受信から3分弱ですので、3回分のフレーム受信で一致判定しているんでしょうかね。

ともかく、無事に時刻同期が出来ることを確認できました。

念のために

動画は撮っていませんが、同期中(アンテナ3本表示中)に、アンテナとRaspberry Pi Pico W本体を、時計から遠ざけてみました。

10cmほど離すと受信アンテナがゼロに。

電波強度はそんなものです。

3 mで500 µV/m以下なら無線局の免許が不要という施行規則第6条の微弱無線に収まる無線局に当たる、と考えています。

もちろん、常時設置、常時送信は考えていません。あくまでも今回の実験のためだけです。時計の時刻がズレてきたら、毎回「実験」と称して作動させるかもしれませんけどね。

運用は、写真の通り、モバイルバッテリーです。PCを持ち込まなくていいので便利ですね。

ちなみに、Raspberry Pi Pico Wなので、Wi-Fiを使って電波時計と同期する?と思った方もいらっしゃるかもしれませんが、あくまでもRaspberry Piの時計をNTPで合わせるためだけ、ですので、Wなし版でも、PCから時刻を同期できれば使えるのかな、と思います。

というわけで、手持ちの機材だけで電波時計を自動設定できる環境を作ることが出来ました。

これでなんとか今夏の自由研究が完了しました。夏休みの宿題が終わった感じです(笑)