はじめに
我が家は鉄筋コンクリート造のため、窓から離れた場所だと電波時計の時刻が自動で合いません。
電波時計って、頻繁に時刻合わせをする事が前提なのか、放っておくと時刻のズレ方が他の時計よりも大きい気がします。
せっかくの電波時計なのに、頻繁に時刻合わせをするのが地味にストレスです。
「だったら、自分で電波を出せばいいじゃないか!」
そう思った瞬間から、今回の工作が始まりました。
JJYの電波って?
まずは、電波時計の時刻合わせに使われるJJYの電波について調べました。
電波時計に使われるJJYの電波は、東日本では福島県から40kHz、西日本では九州から60kHzの標準電波が出ています。
JJYは、1秒ごとに40kHzまたは60kHzの搬送波を使って、1ビットずつ情報を送っている信号です。
1分間で送られるのはちょうど60ビット。つまり、1ビット=1秒のペース。
各ビットの意味はシンプルで、
- 秒の情報(1〜59秒)
- 分・時・日・曜日・うるう年
- パリティビット
- 将来拡張用の空きビット
などが含まれています。
ビットの種類は3種類:
ビット種別 | パルス長(無変調時間) | 意味 |
---|---|---|
0ビット | 約0.8秒 | 論理0 |
1ビット | 約0.5秒 | 論理1 |
マーカー | 約0.2秒 | 区切り |
60秒のうち、毎分0秒はマーカー になっていて、
59秒もポジションマーカーになっているので、マーカーが2回連続すると、
それが時刻(分)の先頭の印になります。
詳細は、国立研究開発法人 情報通信研究機構(NICT)の日本標準時グループのサイトを見てください。
信号パターンについては、ここに記載されています。
最初の実験:ESP32 DevKit+即席コイル
まずは原理が本当にうまくいくのかを試すため、机の引き出しからESP32 DevKitを取り出し、手元にあったポリウレタン線をぐるぐる巻きにしました。
- 直径約5cmの型に数十回巻く
- テープでぐるっとまとめる
- GPIOからPWMで40kHzの搬送波を出力
- 表示はなし(シリアルのログだけ)
- Wi-Fi接続先はソースコードにベタ書き
見た目は小学生の自由研究みたいですが、時計を数十センチ(実用的には30cm以内)に近づけたところ、
電波時計のアンテナマークが点灯して、数分後に「ピッピッ!」っと音がして時刻が合いました。
─その瞬間、「これはイケる」と確信しました。
初回のテストでは、変な日時に設定されましたが、それはすぐに修正。
基板化への決断
原理が確認できたら、次は日常で使える形にしたくなります。
そこでKiCadを立ち上げて基板設計開始。ここでアンテナをどうするかが悩みどころでした。
-
フェライトバーアンテナ
Aitendoにいろんなサイズがあって効率も期待できる。
ただしコストがかかり、サイズも大きくなる。 -
PCBアンテナ
基板上にパターンで形成でき、部品代ゼロでコンパクト。
ただし効率は未知数。
悩んだ末、今回は手軽さとコンパクトさを優先してPCBアンテナを採用しました。
PCB版の構成
- MCU:ESP32-C3(Arduino)
-
機能:
- Wi-Fi経由でNTPから時刻取得
- PWMで40/60 kHz JJYパターン生成
- OLEDに現在時刻を表示
- 電源/書き込み:USB Type-C
- アンテナ:基板裏の螺旋パターン
- 設計:KiCad(回路・基板)、Fusion360(ケース)
- 発注:JLCPCB(基板&3Dプリント)
主なピン
機能 | GPIO | 備考 |
---|---|---|
JJY PWM出力 | 10 | 変調された信号を出力 |
CONFIGスイッチ | 9 | Wi-Fi設定用(BOOTピンと兼用) |
WiFi LED | 5 | 動作中LED |
Wave LED | 0 | 状態表示用LED |
OLED Reset | 2 | OLEDモジュールリセット |
OLED SDA | 7 | OLED I2C データ |
OLED SCL | 6 | OLED I2C クロック |
初版はOLED配線ミス→ジャンパーで救済。次ロットで修正。
修正済みの完成基板
PCBアンテナの事情と限界
このアンテナ、RF設計的にはかなり大雑把です。
マッチング回路なんて無いも同然で、専門家に見せたら確実に突っ込まれるレベル。
正直「電波が出ているだけでも奇跡」と思っています。
- 実用距離:30cm以内
目覚まし時計の横に置いて数分放置すれば同期しますが、それ以上離すと厳しいです。 - 理由:JJYは40kHz/60kHzという低周波数帯で波長が非常に長く、物理的に小さいアンテナはどうしても効率が落ちます。
それでも、コンパクトで部品追加なしというメリットは大きく、今回は割り切りました。
改良の余地
RFに詳しい方なら、以下のような改良で効率を上げられます。
- 外付けフェライトバーアンテナ化
- LC共振回路の追加
- アンテナパターンの巻き数・寸法調整
- 出力段の駆動方式見直し(Hブリッジ化など)
「もっと飛ぶようになるよ!」というアドバイスがあれば、ぜひコメントで教えてください。
自分でも試してみたいです。
ケース
Fusion360で設計→JLCPCBで3Dプリント。
OLEDがあるので、透明樹脂で作成しました。
初版はRESET/CONFIG穴の位置がずれて押せず…
図面修正版をGitHubに置いています。
ソフト概要
主な機能
- Wi-Fi設定:起動後5秒以内にCONFIG押下→APモード→ブラウザでSSID/Key保存
- 時刻同期:NTP取得→内部タイマでランニング
-
信号生成:
ledcWrite()
で40/60 kHz、1秒単位で断続 - 表示:OLEDに時刻などの情報を表示
実際のJJYでは、毎時15分などは特別なフォーマットになっているのですが、
今回は時刻合わせが目的なので、すべてが同じフォーマットで送信しています。
開発環境
- Arduino IDE 2.3.6
- 追加ボードマネージャ
- https://dl.espressif.com/dl/package_esp32_index.json
- ボード : ESP32C3 Dev Module
- 使用ライブラリ
- ThingPulse / ESP8266_and_ESP32_OLED_driver : v 2.0.17
https://github.com/ThingPulse/esp8266-oled-ssd1306 - tzapu / WiFiManager : v 4.6.0
https://github.com/tzapu/WiFiManager
- ThingPulse / ESP8266_and_ESP32_OLED_driver : v 2.0.17
実用メモ
- 置き方:時計の横に置いて数分で同期(30cm以内)
- 注意点:金属筐体やノイズ源の近くでは感度低下
- 用途:家庭内の時計合わせ、受信機テスト、教育用途
室内・微弱運用を前提としています。関係法令・規格に沿って使用してください。
リポジトリ
- Arduinoスケッチ(ESP32-C3)
- KiCad設計データ
- 3Dケース(STEP)
👉 https://github.com/shachi-lab/jjy_sim_esp32_c3
まとめ
- 即席コイルでの原理検証からスタート
- 基板化で日常使い可能な形に
- PCBアンテナは効率低いが近距離なら十分
- 改良余地は多いので、アイデア募集
関連情報
この記事は、しゃちらぼブログ Vol.033 をベースに、Qiita向けに再構成・補足したものです。
基板の入手方法などは、運営ブログ「しゃちらぼ」に掲載していますので、
良かったら、こちらの方ものぞいてみてください。