4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32-C3で作るJJYシミュレーター【Arduino】

Posted at

はじめに

我が家は鉄筋コンクリート造のため、窓から離れた場所だと電波時計の時刻が自動で合いません。
電波時計って、頻繁に時刻合わせをする事が前提なのか、放っておくと時刻のズレ方が他の時計よりも大きい気がします。
せっかくの電波時計なのに、頻繁に時刻合わせをするのが地味にストレスです。
「だったら、自分で電波を出せばいいじゃないか!」
そう思った瞬間から、今回の工作が始まりました。


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プリント)

回路図(クリックでPDF)
JJYシミュレーター回路図

主なピン

機能 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配線ミス→ジャンパーで救済。次ロットで修正。

修正済みの完成基板

jjy_sim_present_w400.jpg


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分などは特別なフォーマットになっているのですが、
今回は時刻合わせが目的なので、すべてが同じフォーマットで送信しています。

開発環境


実用メモ

  • 置き方:時計の横に置いて数分で同期(30cm以内)
  • 注意点:金属筐体やノイズ源の近くでは感度低下
  • 用途:家庭内の時計合わせ、受信機テスト、教育用途

室内・微弱運用を前提としています。関係法令・規格に沿って使用してください。


リポジトリ

  • Arduinoスケッチ(ESP32-C3)
  • KiCad設計データ
  • 3Dケース(STEP)

👉 https://github.com/shachi-lab/jjy_sim_esp32_c3


まとめ

  • 即席コイルでの原理検証からスタート
  • 基板化で日常使い可能な形に
  • PCBアンテナは効率低いが近距離なら十分
  • 改良余地は多いので、アイデア募集

関連情報

この記事は、しゃちらぼブログ Vol.033 をベースに、Qiita向けに再構成・補足したものです。
基板の入手方法などは、運営ブログ「しゃちらぼ」に掲載していますので、
良かったら、こちらの方ものぞいてみてください。

📎関連リンク


4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?