ハムフェア2017でドイツの電波時計のジャンクが100円で売っていて、そのままは使えないけど、おそらく電波受信モジュールのチップはC-MAXなどが使われているのではと思い、部品取りとして買ってきてみた。
ハードオフなどでも電波時計のジャンクは物色しているのだが、なかなかお目にかからないです。
前に持っていた人もなにか試したみたいで、ねじが無くて配線もすべて切断されていた。基板には2004-8-2とシルクプリントがあった。
とりあえず電池へのケーブルだけつないだ所、時計としては機能するようだ。ただちょっと液晶が薄くなっている部分がある。
電波受信のモジュールはやはりC-MAXと思われる。とりあえず外してJJY向けにそのうち改造しようと思う。
で残った、時計だが、一応動くし捨てるのはもったいなので、手動で設定して使う事も出来るが、もっと良い利用法がないか考えてみた。時計のチップはドイツの標準電波のDCF77を受信するようになっているのでJJYで使うのは不可能である。であればDCF77を作ればいいのではないと考え、ネットでいろいろ探してみた。
ちなみにDCF77は77.5KHzでパターンが2つで、変調が900ms(0)と800ms(1)となっているようです。また59秒は全変調となっているようです。数値はBCDですがJJYとは位置が違っています。
JJY同様にArudinoのエンコーダーやデコードして発振するサンプルはいくつかあった。あたりまえですが、ほとんどの情報がドイツ語で探すの結構大変でした。
たまたま見つけたのが、ATTiny11を使ったこのページだ。
手持ちの部品で作れそうだ。
ATTiny13用にいじれば使えるかもと思い、ちょっといじってみた。Atemelに「AVR092: Replacing ATtiny11/12 by ATtiny13」というドキュメントもあった。このコードはAVR Studioのasmでビルドしているようでavr-asではそのままでは通らない。いろいろ試してみて、とりあえずsedなどで前処理をしてavr-asで通るようにしてみた。ここまでは1日でできたのだが、こっからいろいろはまった。
このプログラムはシリアルの入力をPIN6から拾って、DCF77の60秒分の信号をPIN5から送り出すようになっているようだ。ステータスのLEDはPIN7に接続されている。
まずATiny13にはCLKOがなくて、ジェネレートしたClockをCLKI(2)から入れなければならない。最初知らなくてATTiny11同様にクロックが接続できるのかと思って、作ったら外部クロックでFUSEを焼くとアクセス不能になり、データシートを見たらCLKOがありませんでした。
ブレッドボードで作ったら、発振回路が安定しなくて、何かの基板からはがしたSOPな74HCU04を使ってハンダ付けして組み立てた。
74HCU04は裏に貼り付いています。
とりあえず安定したのだが、ステータスのLEDがおかしい。よくよく見ると回路図ではGNDにつながっているが写真ではVCCにつながっている。
クロックが倍になっているようで、とりあえず半分にした所、シリアルからの入力が正しく入るようになった。このコードのシリアルはハードウエアサポートがないので、HIからLOの割り込みを拾って、タイマーを10回動かして、10Bit(Start:1,Data:8,Stop:1)を拾いだしている。
とりあえずDCFが出力されるようになったので、これをArdunoのDCF77のライブラリで受信してみた所処理されない。これはArduinoのライブラリはちゃんと更新されたデータが入ってこないとだめで、ATTiny11のコードは毎分同じデータを送っていた。仕方が無いのでとりあえず分のインクリメントをするアセンブラコードを書いてみた。手抜きで0分から9分をぐるぐるするコードになってます。
これでArduinoでは正常に認識されるようになったので、3.3Vで駆動して、反転してない、そのままの信号を時計につないだ所ちゃんと読み取ってくれた。DCF77は変調している方が長いのですが、このモジュールではおそらくDCF77では変調が長いので消費電力を減らすために反転した方を使っていると思われます。
DCF77には日付と曜日が入っているが、この時計はそのまま使っているのではなく、チェックして正しくないと信号を破棄するようになっているようだ。
めでたしめでたし。
後日追記
上記でマイコンでコントロールする事ができることがわかったので、ESP8266を使って、ntpで時間を取得してDCF77を出力するプログラムを作って、上記の時計につないでみた。
PONをコンデンサーをはさんでRESETに接続して、5分出力の後はDEEPSLEEPして、PONがLOで再起動するようにしてみた。消費電力はこんな感じ。
マルチメータのロギングでは拾えてない瞬間的な突入電流もオシロスコープで見てみた。
電源に3.3Ωの抵抗を入れて両端の電圧をみてみたが、1Vくらい下がっているのでV = IRより0.3A(300mA)くらいの電流になるみたいだ。
この時計のDCF77のポリングは以下のようなタイミングでした。
12:02 -> 22:20 -> 23:33 -> 01:02 -> 02:02 -> 03:02 -> 04:02 -> 12:02
5分間でPONがHIになり止まります。
C-MAXのモジュールに60KHzの水晶と60KHzに同調したバーアンテナをつないだところ、JJYが無事受信できました。
一つで二度美味しいジャンクです。
ATTiny85を使ったデコーダーに通してみたのですが、エラーが多くてntpdのソースにするのは無理でした。40kHzの方ためしてみたら結構エラー多めで現在動いてるモジュールは安定させるためにCR回路やバッファなど入れてあって、素のままではちょっと厳しいのを思い出しました。。。
40KHzの水晶が手に入ったので、水晶とバーアンテナを交換してArduinoでチェック用のプログラムを作ってみました。最初5VなArduinoで試したところ安定せず、CR(10K+1uF)遅延回路を入れて、電池駆動にしたところ、どうにか信号が拾えるようになってプログラムでノイズのワークアラウンドを入れて3.3VのArduinoで試してみたところ、安定しました。
駆動時の電流は550uAくらいのようです。
CME6005のデータシートには110uAとあるのですが、ちょっと大きいですね。なんでだろう。CME6005ではないのかもしれません。
結局アンプとフォトカプラーとLEDを付けたので点灯したときには2mAくらになってしまいました。
aitendoのモジュールが紫の線でこのモジュールを改造した物が赤の線になります。このモジュールの方が安定しているのですが、朝6時くらいの近所のIH炊飯器と思われるノイズに反応してしまっています。
aitendoモジュールが初号機で、こちらが弐号機になります。ドイツから来た物なので、ちょうどいいですね。