ESP32でにせJJY その(1) 電波時計を合わせろ
(2021年10月頃のはなし) 職場の居室の電波時計が狂った。いくら『時刻合わせ』ボタンを押しても時刻が合わない。んで、マイコンでにせJJYを作った……ら、どんどんエスカレートしたはなし。
ソースコードはこちら:
にせJJY
ご存知のように、いや知ってるかどうか知らないけど、日本の電波時計は福島と福岡の2箇所にあるJJYという電波局から送出された信号で時刻を合わせている。
わたしは子供の頃にはJJYを聴いて、いや電波時計の電波が聴こえるデンパくんだったわけじゃなく、当時は「つー つー」という1000Hzの音声信号を放送していたのだが、これを聴きながら受験勉強するというJJYまにあだった (やっぱりちょっと変態だ)。
まあそれに関する熱い想いはまた別の機会に。
ここ横浜では北向きで福島の電波を拾うはずだが、壁が邪魔をしているのか東向きの部屋で合わない。
んで、電波時計を強制的に合わせてみようと思った。
マイコンでフォーマット通りの信号を作り、40KHzに変調すれば、電波時計はJJYだと思い込むはずだ。アナログ回路は苦手だが、まあFMトランスミッターくらいは作ったことがある。似たような回路を参考にすれば、できるであろう。
ん? 40KHz?
ESP32っていうマイコンは、まあちょろっと使ったことはあるのだが、とにかく速い。
どのくらい速いかというと……1990年代に使っていたPICとかAVRとか (その後Arduinoで使ったATmegaとか) はたかだか16MHzとか。それだって1970年代のマイコン (8080とかZ80とか) に比べたらかなり速いのだが、ESP32は240MHz。PICを時速16kmの自転車とすれば、時速240kmの新幹線くらい、速い。Z80は時速4kmとか時速2.5kmの徒歩である。
あとついでに安い。中華通販でまとめ買いしたESP32は、4つで2800円くらいだった。中学生の財力でZ80 (たしか数千円だった気がする) を買うのに比べたら、おとなが給料で700円のESP32を買うのは、ただ同然である。
いやはなしを元に戻すと。
40KHzってのは、音声信号にちょっと毛が生えたくらいの周波数である。なんでこんな長波になっているかというと、山などを回り込んで長距離届くかららしい。GPS以前の時代は、船舶のLoRaNなんてものもあったと思うが、それも長波だった。
ESP32のタイマ割り込みは80MHzを分周して得られる。いや、あまりに割り込みすぎると処理そのものが終わらないうちに次の割り込みということになってしまうが……240MHzのクロックってことは (何クロックで1命令実行できるのか知らないが)、40KHzの電波の山谷つまり1/80000秒間に数千個の命令が実行できてしまう。
電波の波形を反転させて出力して、個数を数えて、然るべき時間が経ったら次の信号を用意して、飯食って酒飲んで鼻くそほじって一眠りしても、まだお釣りが来るくらいの実行速度である。
これ、いわゆる『ハードウェアラジオ』ってやつであるが、電波時計の信号フォーマットはものすごい低速で0/1を変調しているだけのAMなので、めちゃくちゃ簡単なハードウェアラジオである。
微弱電波の出力と製作した回路(文)
ところで、JJYを再放送して地下などで受信できる装置ってのはあるにはあるようだが、JJYと同じ周波数の電波を出して違法じゃないのか?
まあ「同じ部屋にいるやつの電波時計を狂わせてやるぜいっひっひ」といった極悪デバイスを目指しているわけではなく、電波時計にアンテナワイヤをくっつけて時刻がとりあえず合えばいいや、という程度の装置なので、法に触れない程度の『微弱電波』がつくれればよい。
詳しい法規と出力の計算は省略するが (ってか記録したのがどっか行っちゃった)、ESP32の3.3VのGPIOに330Ωの抵抗をつないで30cm長さのワイヤでループアンテナを作れば (→GNDに落とす)、33mWの出力になるはずだ。とソースコードに書いてある。
あまりに簡単なので回路図は省略ね。
で、試しに信号を作ってみたら……見事時刻が合うではないか。
※ この時点……2021年10月には、なんとESP32でWiFiであっさりNTPが使えるとか知らず(笑)、そのくせBlueToothターミナルとかでコマンド送って遊んだりしていたので、BTで合わせたい時刻をESP32に送信する (その後ローカルクロックで時間は刻むが) という糞仕様になってました。
世界の電波時計
まあこれで当初の目的は達したわけだが (ここまで3日くらいでできた)、JJYはふたつある。西の福岡局は60KHzなのだ。
まあ日本の電波時計は、40KHz/60KHzのデュアルチャンネル受信になっているので、片方の電波が出れば目的達成なのだが、どうせなら60KHzも作ってみたいではないか。
これは、割り込み周期を変えてやるだけで簡単にできる。
いろいろ調べているうちに、世界のあちこちに似たような電波時計局がある (つか日本のJJYがアメリカのWWVBの二番煎じらしい) ということがわかった。
アメリカのWWVB (これも昔は音声で時刻を流していたと思う)、ドイツのDCF77というのも、はなしにきいたことがある。
どーせなら、それらの周波数で時計を合わせてみたいものである。
これらほとんどの局の仕様に関する記述は、Wikipediaないし誰かさんが作ってくれたwebページにある。
- JJY (Japan): https://ja.wikipedia.org/wiki/JJY
- WWVB (US): https://en.wikipedia.org/wiki/WWVB
- set UT for WWVB.
- DCF77 (Germany) : https://www.eecis.udel.edu/~mills/ntp/dcf77.html
- (HBG (Switzerland) discon: https://msys.ch/decoding-time-signal-stations )
- BSF (Taiwan): https://en.wikipedia.org/wiki/BSF_(time_service)
- MSF (UK): https://en.wikipedia.org/wiki/Time_from_NPL_(MSF)
- BPC (China): https://harmonyos.51cto.com/posts/1731
ところが、1bps (メガとかギガの書き間違いではない。1秒に1ビットずつ送るわけだよ) で送られるデジタルデータのフォーマットが違う。変調 (0/1をどういうAM信号で表わすか) の方式も違う。
これら全部に対応するために、いろいろプログラム書き直しましたさ。
変調やエンコードのちがい
JJYは、音声化すると (例えば受信した電波の有無でオシレータを励起してスピーカから出すと)、毎秒頭から送りたい0と1で、「つー」 (電波が出ている、変調部分) の長さが変化する、という感じである。
言葉で書くと0が「つー(ん)←休符」、1が「つ(っうん)」という感じだ。
びびったのは、その他世界の時報局の大半は、休符、つまり無変調期間が先に来ていることだ。
言葉で書くと、0が「(ん)つー」、1が「(うん)つ」という感じになる。
まあ人間が聴いてどうこう、というもんではないかもしれないが、直感的に「電波の出始めがx.000secね」というほうが直感的にしっくりくるのじゃないかなーと思う。
あと、JJYに限らずWWVBなど大半の局では、2進数ではなく2進化10進数 (BCD) で年月日時分秒などのデータを送っている。2進数だったのは中国くらいかな?
つまり、『42分』は2進数では『11010
分』となるが、BCDでは『100 0010
』分となる。これまた人間が読んで解釈するわけじゃないんで、別に4ビットごとに切れてて分かりやすいとかじゃなくてもいいと思うんだが、つかビットの無駄(笑)。
さて、ここでどの局の電波も出るようになった……はずであるが、デバッグができない。
日本仕様の電波時計は、職場の掛け時計だけではなく、家にもひとつある。
だが、アメリカやドイツの電波時計などは、大枚はたいて輸入しないといけないものか!?
調べてみたらまず、CITIZENなどで作っている『国際電波時計対応』という腕時計があるのがわかった。
これ……ちゃんとした時計なのな。当たり前だけど4万円とかする。
700円のESP32で作ったにせJJYのデバッグをするのに4万円はたいたら、割が合わない (そういう問題じゃない)。
さらに調べを進めると、日本のAmazonで『4カ国対応』という電波時計が売られていた。中華製の安物のデジタル置き時計 (トラベルクロック) で、2000円程度。これとて700円のJJYには (略)、ともかく許容範囲だ。
Amazon翌日配送で、件の時計がやってきた。
中華製の割には、対応しているのが日・米・英・独である。
いくつかのルーチンがバグっていたが、まあ基本的にはすぐ動いた。
※ 最初の写真と使っているESP32が違いますが、これ最初のバージョンは出力ピン数が多い (多分SWITCH SCIENCEの) 高級品で、どーせ1〜3ピンくらいしか使わないので後でAmazonで4枚2800円のに替えてますね(笑)。
あと本文で説明はないけど、余ってた圧電スピーカとLEDを接続して、音でモニタできるようにしてます。回路図はソース読んで想像してください(爆)。
平成の若者の時計離れ
ここまでで動作確認できていない局が3つほどある。
まずスイスだが、これはもう放送をやめてしまったらしく (ドイツのが入るからかな?)、対応してもしょうがない。というか、永遠にデバッグできる見込みがない。
それから台湾。
実は台湾人の嫁の弟が電波時計を日本から買ったりしたので知っていたが、福岡局は台湾でも条件が良ければ入るらしいのだ。ところが、台湾でも時刻の放送をはじめようとしている……らしいのだが、まだテスト電波の段階らしく、いろいろ (台湾の楽天みたいなところとか) 検索しても台湾局を受信できる台湾製の電波時計は、まだ市販されていないらしい。出てくるのは日本製・日本のJJY受信の電波時計ばっかりである。
さて中国は……どうやら放送されていて時計も市販されている (あまっさえ日本の腕時計でも中国局対応のがある) のだが、驚いたことにライセンス制らしい。つまり時計メーカが時報局にライセンス料を払わないと、電波時計を作って売れないらしいのだ。さすが国営(略)。
まあただし、フォーマットはどっかの中国のハッカーが解析していちおう、ネットで手に入った。上記のリンク、STM32で逆に時計側を作ろうとしている。
彼が無事ならよいのだが。
余談になるが、最後発の中国と台湾は、変調の方式を工夫して1秒に2ビット以上の情報を詰め込んでいる。
つまり他の国では、最短のケースでも最悪一回り1分経たないと現在時刻を知ることができないが (ベリファイなどのために数回り = 数分観測するようだ。そのため電波時計は合わせるのに数分〜数十分かかる)、中国では時刻合わせまでの時間が最短で最長30秒 (変な日本語だ) に短縮される。台湾では1分サイクルはそのままにして、残るビットに緊急防災情報などを詰め込もうとしているらしい。
さて、中華電波時計が手に入らなくてねえ、なんてはなしを研究室の学生としていると、ゼミ長女子が「わたしの時計、電波時計で確か中国対応だったはずですよ〜」という。針式時計だが文字盤がインジケータになっていて、確かに『JP』『CN』とある。日本製だが日本と中国の2カ国仕様になっている。
さっそく……中国のハッカーの仕様どおり電波を出しているか、デバッグしてみることにした。
ところが、合わない。
よくよくきいてみると、近頃自動ではうまく時刻が合わないらしい (手で合わせることはできる)。「修理しなきゃダメかな〜」とか言っている。確かに、日本のJJYフォーマットで電波を出してみても、変な時刻に合ってしまうので、原因は物理的な文字盤の針ズレのようだ。
中国フォーマットで合わないのが、にせJJYが悪いんだか、彼女の時計が故障しているのかわからないままになってしまった……。
ところでこのはなしをしているとき、えっと思うことがあった。
まさか日本製で中国局受信できる時計があるとは、さいしょにAmazon調べたときには思っていなかったので、その後彼女のと同じメーカの同じようなシリーズの時計を買おうかと思っていろいろ調べた。だが新品でも3〜6万、中古でも結構な値段がする。700円のESP32 (もういい) ……と彼女に言ったら「そりゃ高いですよぉ。就職祝いで親族から貰ったので、『一生モノの良い時計が欲しい』ということでこれになったんですよ」という (ちなみに就職は国家公務員だ。優秀なのだ)。
ええ? 一生モノの良い時計というと、おっさんの感覚では、こと機械式時計の分解組み立てが趣味なわしなんかにとっては、機械式の手巻き……とかになるんだが、電池で動くソーラー式の電波時計が?
まあ、さいきんの若者は携帯電話で時刻を確認するから「腕時計いらね」となるらしいから、それに比べたら1万倍くらい価値観が大人であるのは認める。
だけど……ソーラー電波時計ってやっぱり、ちょっとなんというか、高級時計ってよりは現代ガジェットって感じがするよね? (しない?)
Discussion