電波時計とパソコンで時報の信号を解読してみる

時計

電波時計について興味がわいてきたので購入しました。あわよくばパソコンのタイムサーバにならないかなぁ、などという下心もありますが何せソフトについては弱いしぃ…

近所のジョーシン電機でマルマンの目覚ましをGET、さらに1週間後に同店でCASIOの目覚まし(DQD-101)をGETしました。値札は同一でしたが、マルマンのを買ったときは店全体が5%引きのキャンペーンをしており、CASIOのを買ったときはキャンペーン時期を過ぎていたのでその差がつきました。

さて盆休み前に購入した時計ですが、いよいよ分解の日です。分解するのはCASIOと決めていました。その理由はマルマンの方が単三電池×1で動作するのに対し、CASIOの方は単四電池×2だという点です。フツーに使う分には単三×1の方が得な気分ですし、他の物と接続する場合はむしろ信号レベルも3V程度あったほうが都合良さそうですよね。
後ろから見た時計(電池入れのふたははずしてある)
実際にケースを外そうとするとCASIOのは後一息というところでケースが壊れそうな感じになって外れにくい。そこでマルマンのを試してみるといとも簡単にパックリ開いて楽チンでした。
マルマン製の構造はベークライト製のような1枚の片面基板がネジ2本とツメでとまっていてシンプルでした。でも、受信用ICとLSIは裸チップを基板に取り付けてから配線して樹脂で保護するCOBという実装方法になっていました。(えぇっ?ベーク基板でCOB? …… 茶色の片面基板なのでその類だと思うんだけど…)

マルマンのケースを外してみるとCASIOのケースのはずし方も見えてきて、壊れそうな気がするところをあとひと押しして無事外すことができました。
CASIOの時計のカバーを開けたところ
ガラスエポキシと思われる基板が数枚現れてきました。それぞれがネジでしっかり止められており(それが必要かどうかは別にして)贅沢な作りです。

<次の写真は時計の中身がパックリ開いたところです。左上の水色っぽいのがブザーを止めるボタン、その右がケースの裏ぶたで電池ケースがついています。その下が文字板のあるケースの表側で、右側にあるのはケースの裏ぶたにはめる電池カバーです。
中の様子
何かしたい人にとってラッキーなことは、ラジオの部分が他の部分ときっちり分かれた基板になっていることです。
ラジオ基板を裏返した

クローズアップ
ラジオ基板(と呼ぶことにします)には4つの端子があり、その意味は次表のようになっています。
端子の意味


VCC 電源 +3V
VSS 電源  0V
POO 'H'でラジオ動作 'L'でラジオOFF
TOC 動作時、'H'/'L'のパルス出力 'H'状態になって停止
ま、実際に端子名が書いてあるのはラジオ基板でなく相手となるLCDマイコンの付いた基板側ですが。POOやTOCの機能については、強制的に受信させるボタンを押したり、その後10数分放置したりして(電池消耗を押さえるために普段は一日2回1時間ごとにしか受信しない)確認しました。

電波時計で利用する信号電波はどのようなものか


日本では40kHzの長波が用いられているそうです。搬送波自体に強弱をつけたもののようです(電波形式はA1B)。強(←多分)の時間の長短で'1'か'0'か区切り記号かを表していて、その記号は通常1秒ごとに1つずつである、電波は福島県から発射されている、といったことが、標準電波の出し方通常時のタイムコード毎時15分と45分のタイムコードとして独立行政法人 情報通信研究機構 日本標準時プロジェクトのサイトに載っています。

さらに時計の説明書によれば、ほぼ全国で受信できますが、沖縄などはサービスエリア外(というかCASIOの時計の感度では受信が保証できないということでしょう)になっているようです。いずれ九州にも送信所が開設されればOKですが。(前記は過去の話で、今では佐賀県から送信されている60kHzの長波がOKとのことです。)もちろん地下や電気ノイズの多いところでも使用できないことになっています。ラジオと時刻補正処理のない分、電池の持ちも普通のクオーツ時計の方が良いということでしょう。ラジオの出力するパルスの時間幅を計測処理するのはマイコン側の役割です。


次の写真はTOCの波形をオシロスコープで観測したものです。
家のオシロはアナログでストレージ機能が無いため、ゆっくりした波形や繰り返しでない波形の観測は不得手です。
信号波形
オシロスコープ写真の横軸は時間軸で一目盛が上の写真は0.1秒、下の写真は0.05秒です。縦軸は共に一目盛1Vです。それにしてもパルス幅は上下とも0.2sよりずっと狭いようです。と言うことはここで観測したものは共にノイズ?? オシロの残光性が少ないので波形を捉えたと思ってシャッターを切ったら概ねこうなってしまうのでしょう。本来の信号が弱いのか、少なくとも関西に設置した場合に雑音を拾う確率は決して低くないと考えるべきでしょう。

なお、電波時計も通常はクオーツ時計として動作しており、本機の場合は一日に2回24回受信してずれを修正しますが、電波伝播の状態が悪いときもあり毎回正しく受信できるとは限らず、正しく受信できるまではクオーツ時計に過ぎません。また、送信所では例外時を除き、1分間で年月日、時分秒の情報を送出しますが、電波時計の時刻合わせは10分程度かかる仕様になっています。受信誤りを前提として何らかの多数決を行っているのか、マイコンの動作速度が遅い(パソコンのCPUとはクロック周波数が4桁程度違うし、バス幅も違う)ために1分では少ししか処理できないのか、素人の私にはわかりません。でも、上の波形を考えると多数決的な処理も行っていると考える方が自然でしょうね。
パソコンのタイムサーバーには面倒そうですね。FMラジオで時報を受信して時刻合わせをするというようなHOW-TOを見たことがありますが、少し寂しい気がしていました。しかし、ノイズによる誤りを訂正するなどと考えるとFMラジオ利用の方が現実的な気がしてきます。

ところでCQ出版社のトランジスタ技術2000年1月号でタイムコード受信用ICのLA1650に関する記事があったらしいということがわかり、会社で目を通してみると、三洋のLA1650のデータシート(このページの型名検索で、「LA1650」と入力すればPDFファイルは無料で入手できる)と上述の周波数標準課の内容を実に要領良くまとめたものでした。
久々に三洋のページを見てみるといきなり型名検索できるように進歩していました。そしてLA1650は保守品種になっていました。2004.10.24追記

CASIOの時計に入っているICは配線の出方が異なるので他のメーカーのICでしょう。プリント基板の印刷からすると型名はT4225Bですから東芝製でしょうか。(うっ!違った!!今はアトメルになったTEMIC社の製品でした。search a part-number:のところにT4225Bと入力すればPDFファイルが得られるページに飛びます。2000.9.23追記 う〜む、検索結果が出てきませんねぇ。廃品種になったのでしょうか。2004.10.24追記)しかし40kHzの水晶を2個用いるところから、ディテールについてはそれぞれ工夫があるとは思いますが、技術の本質はあまり変わらないといえるでしょう。三洋のデータシートを見ると水晶を2個使用しているものの、水晶フィルタが2段になっているわけではなく増幅回路全体が差動回路で組んであることがわかります。想像するに周波数変換せず、ストレート増幅を行う際増幅された信号が前段に飛び込むトラブルを防止する効果があるのではないでしょうか。平衡出力ならば飛び込む前に出力同士が打ち消し合うので都合が良いのでしょう。あと、三洋もTEMICも検波出力信号名はTCO(Time-code output)となっていますが、なぜかCASIOの基板ではTOCになっています。ここでは呼び名を(意味不明ですが)CASIO基板のTOCに合わせておきましょう。
あと、相違点といえばCASIOの回路ではAGC(利得自動調節)回路に電解コンデンサを2個も使用したりしていないようです。
CASIOの時計本体に関する話題はこのくらいかな。

電波時計とパソコンのインタフェース試作基板
とりあえず電波時計とパソコンのインタフェース基板を試作してみました。 ラジオ基板からは検波出力が現れるだけです。これをパソコンに送り込むというわけですが、H/L信号をそのままダラダラとシリアル回線でパソコンに送り込みたいのです。検波出力をパソコンのCOMxにそのまま送りつけるわけに行かないので、スタートビットとストップビットを発生させ、その他の期間は検波出力を垂れ流すことにしました。回線速度は慌てず騒がずの300baudという低速にしました。1スタートビット、1ストップビット、8ビットデータ、ノーパリティにしました。これでも1秒間に240ビットのデータがあるわけですから、解読するのに十分なデータ量といえるでしょう。配線図を次に示します。実物は動作しているけどこの図面が実物通りか、イマイチ自信ないです。
I/F schematicsインターフェース回路の電源電圧は現在のところ時計からもらう3Vです。これではRS232Cシリアル回線の規格を満たしませんが、アマチュア工作ということでパソコン側のマージンに期待しました。受信側は3V以上を"H"レベル、0V以下を"L"レベルと判定することになっています。したがってその境目はその間にあるはずです。したがって3V前後の電源電圧でフルスイングするCMOS出力であれば2〜3m程度のケーブルであれば普通伝送できるはずです。ノイズで伝送できないとすれば、ノイズで標準電波も受信できないことでしょう。
パソコンのRxD端子は9ピンのコネクタの第2ピンです。あと、インターフェース基板のVssを9ピンコネクタの5ピンと接続します。あと、エラーを出さないように9ピンコネクタの第1ピンと第6ピンにVccをつなぎました。Vccとつなぐより9ピンコネクタの第4ピンと接続した方が良かったかも知れません。とりあえず評価には耐えています。
配線図の下の方に青色でパルス波形が書いてあります。28.7msはラジオの検波信号をパソコン側に垂れ流して良いタイミング、6.6msはストップビット+スタートビットの期間、3.3msはストップビットの期間をそれぞれ設定するものです。これらのパルス幅は74HC123とそれにつながる抵抗およびコンデンサで決まります。普通74HC123のパルス幅T=R×Cとされているかも知れませんが、本機の部品ではT=0.95RCが良い近似となりました。3.3msと6.6msは多少の誤差があっても通信に支障をきたしませんが、26.7msの精度は重要です。1.6ms以上の誤差があれば動かなくて当り前状態です。スタートビットが出始めてから9.5bit分のところでストップビットのレベルになっていれば良いので約5%の誤差が限界となるわけです。しかし実際のデータ受信側(パソコン側)はスタートビットのはじまりを厳密に測定しているわけでなく、1bitを16等分した刻みでチェックしています。さらに正確な300baudのタイミングでなく0.何%かずれがあります。また送信側もアナログ回路ですから経時変化をはじめとするいろいろな誤差要因が考えられますから,誤差2〜3%以内に調整しておくべきでしょう。
26.7ms+6.6ms(設計値)の1周期が実測で32.5〜34.1msに入るように30kΩの抵抗を調整する必要があります。私は0.068uFのコンデンサと51k、100kの抵抗に5%誤差のものを用いました。0.33uFのコンデンサや68kの抵抗は30kの半固定抵抗で調整するので精度はあまり必要ありません。ただし、このコンデンサには温度特性の悪いセラミックコンデンサを避け、フィルムコンデンサなどを使用すべきです。さもないと調整しても温度が変わると狂ってしまいますから。私はオシロを見ながらタイミングを調整しました。このときはラジオのTOC出力はつながず、VccやVssをつないで基板のRxD行き信号を観測すれば楽です。オシロなんてないよ!という方は残念ながら・・・というのは工夫不足ですね。パソコン側から300baudの信号を出して調整する(シリアルコネクタのTxD信号は第2ピンから出ます。第8ピンをVccと接続する必要があるかもしれません。)などの方法が考えられます。内容のデータは00Hか0FFHにすれば300Hzの信号が出ますから、I/F基板の出力とうなりが生じるようにして周波数を合わせこめるはずです。ただし、クリスタルイヤホン等で聞く場合、パソコン側出力は+9V〜-9Vに振れる非常に大きい振幅、I/F基板側出力も0〜3Vと決して小さくない振幅ですから適当に減衰させる手段を講じるべきでしょう。パソコンのスピーカから300Hzの音を出す手もあるはずですね。
ということで実際に組み立てた基板の写真を下に載せておきます。なお、レギュレータは外部電源を用いるつもりで搭載しましたが、現在は使用していません。あ、写真は裏面でなく、上面から撮ったものです。(分かるよね!)
試作基板写真
次に、調整した後のオシロで見るタイミング波形の写真を載せます。I/F基板のTOC入力をVssに接続したのでRxD出力(上側の波形)はスタートビットの所だけが"H"レベルです。スタートビットの始まりから次のスタートビットの始まりまでが約33msであることがわかります。下側の波形は配線図の6.6msの信号です。
調整後のタイミング観測波形
回線の無駄使いと言われればそれまでですが、I/F基板のTOC入力をVccと接続したときの波形を次に示します。RxD信号(上側の波形)はストップビットだけがへこんでいます。下側の波形は先程と同じく配線図の6.6msの信号です。それにしてもトレースローテーションを合わせていないと見栄えが悪いなぁ。
ストップビットが目立つオシロ波形
次回はいよいよインタフェース基板にラジオ出力と、パソコンを接続します。待っててネ。

パソコンに取り込まれたデータ
パソコンに取り込まれ、ちょっと加工されたデータがこれで、2000年10月1日13時1分頃からの受信データを加工したものです。 まず、検波出力TOCの"H"レベルをRxDの"H"レベルとして、TOCの"L"レベルをRxDの"L"レベルとして送出しています。RxD信号は、"H"レベルが"1"、"L"レベルが"0"を表していますから、パソコン側ではTOCの"H"レベルを"0"、"L"レベルを"1"と認識します。パソコン側ソフトでは1語(8ビット分)のデータを受け取った後、この8ビット中"1"が立っていたビット数を1語ごとに表示しカンマを打つ、30語ごとにカンマの変わりに復帰改行をいれるという加工を行っています。 う〜む。雑音混じりで読めている、というのが正直なところです。でも、実際このような受信を行った時計は確かに時刻補正が正常に行われたので、この程度の雑音はソフトで何とかなるはずです。ええっ?インタフェース基板や取り込みソフトがOKだったかってですかぁ?これはOKのはずです。ラジオ出力の代わりにVccやVssを入力としたときのRxD波形は前ページで御覧頂いたわけですが、これをパソコンで受信して加工したデータがそれぞれVcc入力→0.txtVss入力→8.txtです。また、"1"の立っている個数のカウントは、適当なテキストファイルを読み込ませて簡単にチェックしました。
で、前出のデータを本当に解読するとどうなるかというと、それは次のページのお楽しみ。(そんなに引っ張ってどうするつもり?)
その前にストリップショーをやっておきます。
最初に述べた通り、ソフトは苦手なのです。C言語で作った恥ずかしい入力プログラムですが、入力ファイルとしてAUXを指定しても受信準備を行ってくれませんでした。申し遅れましたが、テストプログラムは基本的にはMS-DOS用のものです。コマンドラインの引数のとり方がMS-DOSとUNIXで異なるとどこかで読んだ気がします。結局、TERATERMでシリアル入力を行い、ログに出力させたものを喰わせて変換結果を吐き出させたのが先程のテキストファイルだったというわけです。恥ずかしい入力プログラム(実際は恥ずかしい変換プログラム)はc:\tmp> levelck test.log 100 > test.txt のようにして用います。

次回こそラジオから読み込んだデータの詳細だ!

ラジオから読み込んだデータ詳細
まず"0"(2進の"0"が8個並んだデータ=TOC出力が連続"H")と"8"(2進の"1"が8個並んだデータ=TOC出力が連続"L")のどちらが入力電波の大振幅状態でどちらが小振幅状態かということの見極めが必要です。TEMICの説明資料ではわたしには、はっきりとわかりません。データを解析しますが、1バイトの内容を受けるたびに1桁の数字を出力して30回数字出力するたびに改行させた意図は、1行で約1秒分のデータを表すことにあります。ところでJJYのタイムコードは各1秒の始まりがいつも大振幅になっています。その後0.2秒、あるいは0.5秒、あるいはまた0.8秒後に小振幅に変わります。そして次の1秒の始まりで再び大振幅になります。(毎時15分からと45分からの各1分間を除く。)
したがって、"8"が大振幅の連続、"0"が小振幅の連続を表すことがわかります。1個の数字は約1/30秒分のデータですが30個の数字データでぴったり1秒にならないわけは通信が正確な300baudになっていないためです。オシロでタイミング調整したインタフェース基板の信号にしてはむしろ良い出来といえるのではないでしょうか。
0.2秒は数字約6個、0.5秒は数字約15個、0.8秒は数字約24個になります。
秒の始まりから0.8秒間大振幅が続くとタイムコードで2進の"0"
秒の始まりから0.5秒間だけ大振幅が続くとタイムコードで2進の"1"
秒の始まりから0.2秒間だけ大振幅が続くとタイムコードでマーカ(M)あるいはポジションマーカ(P0〜P5)
になります。
あとはフォーマットを考慮し、雑音成分に目をつぶって人間デコードして行きます。
このあたりの参考資料は何といっても前出のJJY送信方法ですね。
解釈を付けると1行が長くなり折り返すと見にくいので、ここでは数字間のカンマを削除しました。

888888888888888888888888500000 ;行の先頭付近が秒の始まり。タイムコードで2進の"0"
388888888888888888888888500001 ;同上
888888700000000000003810048888 ;タイムコードでマーカかポジションマーカ。最後に雑音
888888888888888888888888100000 ;タイムコードで2進の"0"
688888888888888888888888100004 ;同上
888888888888888888888888200000 ;同上
888888888888888888888888100005 ;同上
888888888888888888888888100003 ;同上
888888888888888888888888000001 ;同上
888888888888888888888885000000 ;同上
888888888888888888888880000006 ;同上、最後に次の秒の始まりがかかっている
888888888888888888888882000005;同上、最後に次の秒の始まりがかかっている。以降も同じ
888888600000000000000000000078 ;マーカあるいはポジションマーカ
888888800000068800388700000088 ;マーカ。上のはP0だったことになる。雑音が混じっている
888888888888888888888883000038;"0"×40分+
888888888888888888888883000028 ;"0"×20分+
888888888888888888888880000058;"0"×10分+
888888888888888888888870000028 ;"0"
888888888888888888888840000088;"0"×8分+
888888888888888888888870000088 ;"0"×4分+
888888888888840000000000000078;"1"×2分+
888888888888888888888800000048 ;"0"×1分=2分
888860000000000000888888820188 ;P1、雑音混じり
888888888888888888888830000188 ;"0"
888888888888888888888800000488;"0"
888888888888888888888800000088 ;"0"×20時+
888888888888800000000058880888;"1"×10時+
888888888888888888888800000888 ;"0"
888888888888888888888600000688;"0"×8時+
888888888888888888888500000888 ;"0"×4時+
888888888888500000000000000888;"1"×2時+
888888888888500000000000000888;"1"×1時=13時
888800000883000000038885006888 ;P2、雑音混じり
888888888888888888888300000888 ;"0"
888888888888888888888000004888;"0"
888888888888000000058810007888;"1"×200日+
888888888888888888888000006888;"0"×100日+
888888888888888888888000004888 ;"0"
888888888888888888887000005888;"0"×80日+
888888888887000000000488840788;"1"(雑音混じり)×40日+
888888888888000000000088558888;"1"(厳しい雑音)×20日+
888888888883000000000000008888;"1"(雑音混じり)×10日+
887000008888882048888884058888 ;P3、厳しい雑音
888888888888888888883000008888;"0"×8日+
888888888881000000000000088888 ;"1"×4日+
888888888888888888882000058888 ;"0"×2日+
888888888881000000000003888888;"1"×1日=275日=10月1日(閏年)
888888888888888888880000088888 ;"0"
888888888888888888870000078888;"0"
888888888880000000000000188888 ;"1"(PA1)→13時を表すデータが含む"1"は奇数個だからOK
888888888800000000000000788888 ;"1"(PA2)→2分を表すデータが含む"1"は偶数奇数個だからOK
888888888888888888810000288888 ;"0"(SU1)
880000000000000000288888888888 ;P4、雑音混じり
888888888888888888700000288888 ;"0"(SU2)
888888888888888888800000088888;"0"×80年+
888888888888888888800000078888 ;"0"×40年+
888888888888888888830000688888;"0"×20年+
888888888888888888800000688888 ;"0"×10年+
888888888888888888500000788888;"0"×8年+
888888888888888888400000888888 ;"0"×4年+
888888888888888888300000788888;"0"×2年+
888888888888888888100000888888 ;"0"×1年='00年
800000000000000078800488888888 ;P5、雑音混じり
888888888888888888300004888888 ;"0"×4+
888888888888888888000000288888;"0"×2+
888888888888888884000003888888 ;"0"×1=0→日曜日
888888888888888888000000888888;"0"(LS1)
888888888888888888000004888888 ;"0"(LS2)
888888888888888886000008888888;"0"
888888888888888888000008888888 ;"0"
888888888888888883000028888888;"0"
888888888888888881000007888888 ;"0"
000000000000000788888888888888 ;P0、雑音混じり
500000000000078888800088888888;M、雑音混じり
888888888888888880000038888888;"0"×40分+
888888888888888870000068888888 ;"0"×20分+
888888888888888840000048888888;"0"×10分+
888888888888888870000038888888 ;"0"
888888888888888820000088888888;"0"×8分+
888888888888888840000038888888;"0"×4分+
888888830000000000000288888888 ;"1"×2分+
888888850000000000000488888880 ;"1"×1分=3分
000000000000000000288888888888 ;P1
888888888888888820000018888888 ;"0"
888888888888888700000088888888;"0"
888888888888888800000088888888 ;"0"×20時+
888888800000000000003888888888 ;"1"×10時+
888888888888888600000488888888 ;"0"
888888888888888600001888888888;"0"×8時+
888888888888888400000288888888;"0"×4時+
888888800000000000788888888888 ;"1"×2時+
888888800000000000005888888810 ;"1"×1時=13時
000000058888200000008888888888 ;P2、雑音混じり
888888888888883000000888888888 ;"0"
888888888888888000002888888888;"0"
888888000000000000008888888888 ;"1"×200日+
888888888888884000002888888888;"0"×100日+
888888888888888000000888888888 ;"0"
888888888888886000008888888888;"0"×80日+
888886000000000000008888888888;"1"×40日+
888885000000000000048888888888;"1"×20日+
888882000000000000018888888000 ;"1"×10日+
000000688000680000188888888888 ;P3、雑音混じり
888888888888880000048888888888;"0"×8日+
888880000000000000088888888888 ;"1"×4日+
888888888888850000058888888888;"0"×2日+
888880000000000000088888888888 ;"1"×1日=275日=10月1日(閏年)
888888888888880000068888888888 ;"0"
888888888888850000018888888888;"0"
888860000000000000588888888888 ;"1"(PA1)→13時を表すデータが含む"1"は奇数個だからOK
888888888888860000088888888888;"0"(PA2)→3分を表すデータが含む"1"は偶数個だからOK
888888888888800000068888880000 ;"0"(SU1)
007888800000008883488888888888 ;P4、雑音混じり
888888888888850000068888888888 ;"0"(SU2)
888888888888800000288888888888;"0"×80年+
888888888888800000688888888888 ;"0"×40年+
888888888888810000288888888888;"0"×20年+
888888888888800000588888888888 ;"0"×10年+
888888888888800000888888888888;"0"×8年+
888888888888600000888888888888 ;"0"×4年+
888888888888600003888888888888;"0"×2年+
888888888888300002888888000000 ;"0"×1年='00年
000004884000000856888888888888 ;P5、雑音混じり
888888888887000002888888888888 ;"0"×4+
888888888887000006888888888888;"0"×2+
888888888888000002888888888888 ;"0"×1=0→日曜日
888888888888100001888888888888;"0"(LS1)
888888888885000008888888888888 ;"0"(LS2)
888888888884000018888888888888;"0"
888888888886000028888888888888 ;"0"
888888888880000005888888888888;"0"
888888888881000058888888000000 ;"0"
000000000088888028888884000000 ;P0、雑音混じり
000018880028200088888888888888;M、雑音混じり
888888888870000018888888888888;"0"×40分+
888888888860000078888888888888 ;"0"×20分+
888888888850000008888888888888;"0"×10分+
888888888860000088888888888888 ;"0"
888888888830000088888888888888;"0"×8分+
881000000000028888888888888888 ;"1"×4分+
888888888840000068888888888888;"0"×2分+
888888888810000068888880000000 ;"0"×1分=4分
000188800068200788888888888888 ;P1、雑音混じり
888888888800000088888888888888 ;"0"
888888888800000788888888888888;"0"
888888888800000288888888888888;"0"×20時+
700000000000386588888888888888 ;"1"×10時+
888888888600004888888888888888 ;"0"
888888888700000588888888888888;"0"×8時+
888888888300000688888888888888;"0"×4時+
100000000000007888888888888888;"1"×2時+
500000000000007888888600000000 ;"1"×1時=13時
000088830000888888888888888888 ;P2、雑音混じり
888888888200003888888888888888 ;"0"
888888888000001888888888888888;"0"
000000000000038888888888888888 ;"1"×200日+
888888883000001888888888888888;"0"×100日+
888888887000002888888888888888 ;"0"
888888882000018888888888888883;"0"×80日+
000000000005888888888888888885;"1"×40日+
000000088841888888888888888885;"1"×20日+
000000002886068888887000000000 ;"1"×10日+
288830000000888888888888888888 ;P3、雑音混じり
888888882000028888888888888880;"0"×8日+
000000000000088888888888888888 ;"1"×4日+
888888850000088888888888888880;"0"×2日+
000000000000078888888888888888 ;"1"×1日=275日=10月1日(閏年)
888888882000088888888888888888 ;"0"
888888850000058888888888888860;"0"
000000000005888888888888888800;"1"(PA1)→13時を表すデータが含む"1"は奇数個だからOK
000000000008888888888888888888 ;"1"(PA2)→4分を表すデータが含む"1"は奇数個だからOK
888888850000088888860000000000 ;"0"(SU1)
388888888800688888888888888888 ;P4、雑音混じり
888888820000688888888888888888 ;"0"(SU2)
888888200000088888888888888888;"0"×80年+
888888810000588888888888888888 ;"0"×40年+
888888600000088888888888888888;"0"×20年+
888888400000388888888888888888 ;"0"×10年+
888888200000888888888888888888;"0"×8年+
888888800000888888888888888888 ;"0"×4年+
888888300000888888888888888888;"0"×2年+
888888200001888888500000000000 ;"0"×1年='00年
000000028818888888888888888888 ;P5、雑音混じり
888888300003888888888888888888 ;"0"×4+
888886000002888888888888888888;"0"×2+
888883000008888888888888888888 ;"0"×1=0→日曜日
888888000001888888888888888888;"0"(LS1)
888886000002888888888888888888 ;"0"(LS2)
888887000008888888888888888888;"0"
888884000018888888888888888888 ;"0"
888881000038888888888888888888;"0"
888881000068888887000000000000 ;"0"
000284078888888888500000000000 ;P0、少し雑音
000488870188888888888888888888 ;M、少し雑音
888881000018888888888888888888;"0"×40分+
888881000188888888888888888888 ;"0"×20分+
888881000088888888888888888888;"0"×10分+
888840000188888888888888888888 ;"0"
888810000068888888888888820000;"0"×8分+
000000000288888888888888888888;"1"×4分+
888830000388888888888888800000;"0"×2分+
000000000888888883000000000000 ;"1"×1分=5分
006850885788888888888888888888 ;P1、雑音混じり
888800000688888888888888888888;"0"
888810000000000000000000000000  ;"0"、以後受信停止

ここから下は電波時計のパワーコントロールで受信が打ち切られたらしく、ずっと"0"行進でした。
データ取得後PON信号線を調べるとVccレベルになっていてパワーダウンモードに入っていることは確認できましたが、このタイミングというのはおそらく間違いないだろうという憶測です。TEMICのICの資料にも、パワーダウン中は"H"レベルが出るとの記述がありました。
以上で2000年10月1日13時1分の終り頃から記録したと信じている数分間のデータ詳細の説明を終えます。 (55秒、)56秒、57秒、58秒、と続く"0"信号と
59秒、0秒のポジションマーカP0、マーカM
が分かりやすい区切りになっているので、これを見つけ出して解読していくことになるでしょう。電波時計の話題は当面これで終了かと思います。いつかパソコンで解読できるようにしたり、さらにタイムサーバーとして動かすことまでできれば、また追加されることがあるかもしれません。

パソコンで解読できるようになってきました。


パソコンに取り込んだ加工データのデコード
パソコンに取り込まれた前掲の加工データをデコードした結果がこれです。
要約したものが下記になります。
sec=08 dat=0 ?? minute(s)
sec=08 dat=0 02 minute(s)
sec=18 dat=1 13 o'clock
sec=33 dat=1 275 days since Jan. 1.
sec=36 dat=1 hour data parity check passed
sec=37 dat=1 minutes data parity check passed
sec=48 dat=0 '00 year
sec=52 dat=0 SUN
sec=54 dat=0 no leap seconnd in a month
sec=59 dat=MKR YY=00 MM=10 DD=01 SUN HR=13 MIN=02
sec=08 dat=1 03 minute(s)
sec=18 dat=1 13 o'clock
sec=33 dat=1 275 days since Jan. 1.
sec=36 dat=1 hour data parity check passed
sec=37 dat=0 minutes data parity check passed
sec=48 dat=0 '00 year
sec=52 dat=0 SUN
sec=54 dat=0 no leap seconnd in a month
sec=59 dat=MKR YY=00 MM=10 DD=01 SUN HR=13 MIN=03
sec=08 dat=0 04 minute(s)
sec=18 dat=1 13 o'clock
sec=33 dat=1 275 days since Jan. 1.
sec=36 dat=1 hour data parity check passed
sec=37 dat=1 minutes data parity check passed
sec=48 dat=0 '00 year
sec=52 dat=0 SUN
sec=54 dat=0 no leap seconnd in a month
sec=59 dat=MKR YY=00 MM=10 DD=01 SUN HR=13 MIN=04
sec=08 dat=1 05 minute(s)1行目の??minute(s)は正分検出前なのでsec=08が実はウソであり、どうしようもありません(BOW環境ではsec=-1となってsecデータが不確定であることが明確だったのですが…)。sec=59の年月日・曜日・時分は01秒から52秒までの主要データをまとめて表示しただけのものです。実用的には1分進めた表示の方が実際の時刻にずっと近いはずです(59秒遅れの表示というよりは59.8秒以上遅れた表示になっていますから本当にずっと近いのです)。 やはりC言語で作成したプログラムで処理しました。
・ノイズ除去1(各文字が3以下であれば'L'、4以上であれば'H'と解釈するだけ)
・ノイズ除去2(ノイズ除去1処理済みデータを扱い'L'は1個でもあれば'L'として解釈し、'H'は5回以下しか連続しない場合遡って'L'が連続していたと解釈する)
・マーカ(正分の区切り=毎分0秒)の検出(ノイズ除去2処理済みデータを扱い55秒〜0秒の"0", "0", "0", "0", P0, M信号を検出)
・"1"/"0"/(ポジション)マーカの弁別(ノイズ除去2処理済みデータを扱う。正分の区切り検出より判定を緩めにした-厳しくしてもエラー処理でたいして変わったことができないため)
・時刻情報の解読

以上の手順で行いました。ノイズ除去2のアルゴリズムにした理由はラジオの受信特性からきています。回路定数から裏付けをとったわけではありませんが(チップコンデンサの容量などはラジオを壊すつもりでないと分からない)AGCの時定数が短くできているようです。数分間の受信データからすると、信号強のタイミングは確かにHレベルを示しているのに対し、信号弱のタイミングでは信号が弱くなってしばらくはLレベルを示しているものの、そのうち受信感度が上昇するのか雑音を拾うなどしてHレベルが出現しやすいようです。受信感度を自動調整することは時計の設置場所や電波伝播状態の変化に対応するために必要なことです。ただ、伝播状態がどれほど急激に変化するものか、私は調査していないので分かりませんが本ラジオのAGCの反応が0.8秒未満ですので、ノイズ除去や"1"/"0"/(ポジション)マーカの弁別に工夫が必要でした。工夫の結果、データは非常に正確に解読できました。ラジオの設計もデコードアルゴリズムとペアで行ったのでしょうし、現にこの時計は正常に機能しているので設計はおそらく総合的に適切に行われているのでしょう。
1"/"0"/(ポジション)マーカの弁別は、信号が強から弱への変化点をタイミングの基準として用いました。また、Lレベルも通常0.2秒程度以上は保たれることも期待しています。Lレベルが0.8秒も続く場合は途中でノイズが入ってHレベルが出、ノイズが消えて再びLレベルになることがありますがノイズ消滅のH→Lはタイミング基準から除外する必要がある、といった事に気をつけてコーディングしたつもりです。
そのプログラムがこれです。
各処理は加工データの1文字毎に行いました。なお問題点を列挙すると、
・現在のところ、マーカの検出にしても時刻情報の解読にしても15分、45分の情報には対応していないばかりか、5分、45分の解釈を回避するしかけも特に設けていない。
・ノイズ除去2のバッファサイズが不必要に大きい。おそらくhlnoの定義を減らすだけでOKと思いますが、このあたりは前世紀にコーディングしたので良くわかりません(減らして確かめれば終りなのですが)。
・BOW(BSD on Windows)でのコンパイル・実行結果とVine2.1(Linux)でのコンパイル・実行結果が異なる点が不安。正しい正分区切りを見つけた後は同じなのですが……。初期化かエラー処理に問題があるのかな?
・あと何よりも、例の加工データ以外でほとんど試していないので、特に時刻情報の解読に数多くのバグが潜んでいる可能性が大。1月1日からの日数を何月何日に変換する方法は3月から12月のうしろに1、2月を持ってきて整数演算を利用してエレガントに処理する方法があったと思ったのですが思い出せず、変な処理になってしまいました。シンプルな処理にもしなかった上、例の加工データ以外で検証していないので不安な部分の1つです。

などがあります。このプログラムはどの変数が何を表しているのかがちょっと分かりにくいので、本来はその説明もプログラム中のコメントとして必要なのでしょう。


JJY(長波)の受信確認証長波標準電波運用開始5周年記念のべリカードをいただきました。本当は2004年9月末までに受信した人にもらえるカードですが、2時間近く遅れて受信した私もいただくことができました。もらったカードのスキャン画像です。ちょうど往復はがきぐらいの大きさでした。

おもて側
表側

うら側
うら側

戻る
戻る