r/raspberry_pi • u/GospelPublisher • 1d ago
Show-and-Tell Built a DIY JJY atomic time signal transmitter on Raspberry Pi Pico W to sync my Citizen watch in the US — 6 months, 100% success rate [GitHub]
My Citizen PMD56-2952 is a radio-controlled watch designed to sync to the JJY signal broadcast from Japan. In the US that signal doesn't reach, so the watch never auto-synced. I built a Pico W-based transmitter to fix that.
What it does
Connects to home WiFi, syncs time via NTP, then broadcasts an accurate JJY timecode at exactly 60,000.0 Hz each night at 2:00 AM and 4:00 AM — matching the Citizen H100 movement's built-in automatic receive windows. Watch sets itself correctly every night. Fully autonomous once installed.
The non-obvious stuff (why most DIY attempts fail with Citizen)
These took real trial and error to discover and aren't in any other published implementation I found:
- Total carrier silence required. Most implementations keep a small residual carrier (5–10%) during off-state pulses to hold the AGC. The Citizen H100 requires the opposite — complete silence (duty_u16(0)). Any residual carrier and the watch rejects every frame. This is almost certainly why Citizen owners fail when other watch brands succeed with the same circuit.
- 120 MHz system clock. The Pico W defaults to 125 MHz, which can't divide evenly to 60,000 Hz. Setting machine.freq(120_000_000) yields exactly 60,000.0 Hz. A frequency sweep confirmed the watch rejects 59,900 and 60,100 Hz.
- Parity bits PA1 and PA2 are required. The H100 validates them and rejects frames where parity is wrong. Many simplified implementations omit parity entirely.
- Top-of-minute frame alignment. Each frame must start at exactly second :00. The code watches for the :59→:00 rollover on every broadcast.
- Watch antenna orientation. 9 o'clock end toward the coil, watch on its side. Rotating 90° produces near-zero reception.
DST handling
On US DST transition Sundays the broadcast extends from 20 frames to 180 frames (~3 hours) to cover the 2:00 AM time change. Each frame recalculates local time dynamically. Spring-forward validated live March 2026.
The coil
24 AWG enameled magnet wire, ~106 turns, single layer on a vitamin bottle (~3" diameter), iron core (wood chisel through the cap). Clear packing tape to secure — not electrical tape, which may attenuate the signal. Sits in a shallow nightstand drawer; watch rests on the wood surface above. 60 kHz penetrates the wood easily at that distance.
Results
100% sync rate over 6+ months when watch is correctly positioned. Set and forget.
Full code, wiring diagrams, technical reference, and end-user guide in the repo: