DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์•ˆ๋…• ํ•˜๋ธŒ๋ฅด.

์•„๋งˆ๋„ ์‹œ๊ณ„๋‚˜ ๊ธฐ์ƒ ๊ด€์ธก์†Œ๋ฅผ ๊ตฌ์ž…ํ•˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํฌ์žฅ์—์„œ ๋ฌด์„  ์ œ์–ด ์‹œ๊ณ„๋‚˜ ์‹ฌ์ง€์–ด ์›์ž ์‹œ๊ณ„ ๋กœ๊ณ ๋ฅผ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๊ณ„๋ฅผ ํ…Œ์ด๋ธ” ์œ„์— ์˜ฌ๋ ค๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ์ž ์‹œ ํ›„ ์ž๋™์œผ๋กœ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์— ๋งž์ถฐ ์กฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ  Python์œผ๋กœ ๋””์ฝ”๋”๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‹œ๊ฐ„ ๋™๊ธฐํ™” ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ๋Ÿฝ์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์‹œ์Šคํ…œ์€ ๋…์ผ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. DCF-77, ์ผ๋ณธ์—๋Š” ์ž์ฒด ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค JJY, ๋ฏธ๊ตญ์—๋Š” ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค WWVB, ๋“ฑ๋“ฑ. ๋‹ค์Œ์œผ๋กœ ์ด์•ผ๊ธฐ๋Š” DCF77์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋Ÿฌ์‹œ์•„์˜ ์œ ๋Ÿฝ ์ง€์—ญ ๋ฐ ์ฃผ๋ณ€ ๊ตญ๊ฐ€์˜ ์ผ๋ถ€ ์žฅ์†Œ์—์„œ ์ˆ˜์‹ ์— ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(๊ทน๋™ ๊ฑฐ์ฃผ์ž๋Š” ๋ฐ˜๋Œ€ ์˜๊ฒฌ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฐจ๋ก€๋กœ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Œ). ์ผ๋ณธ ์‹ ํ˜ธ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.)

์•„๋ž˜์— ์“ฐ์—ฌ์ง„ ๋ชจ๋“  ๋‚ด์šฉ์€ DCF77์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ ํ˜ธ ์ˆ˜์‹ 

DCF77์€ 77.5kHz์˜ ์ฃผํŒŒ์ˆ˜์—์„œ ์ž‘๋™ํ•˜๊ณ  ์ง„ํญ ๋ณ€์กฐ๋กœ ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๋Š” ์žฅํŒŒ ๋ฐฉ์†ก๊ตญ์ž…๋‹ˆ๋‹ค. 50KW ์—ญ์€ ํ”„๋ž‘ํฌํ‘ธ๋ฅดํŠธ์—์„œ 25km ๋–จ์–ด์ง„ ๊ณณ์— ์œ„์น˜ํ•ด ์žˆ์œผ๋ฉฐ, 1959๋…„์— ์šด์˜์„ ์‹œ์ž‘ํ–ˆ๊ณ , 1973๋…„์— ์ •ํ™•ํ•œ ์‹œ๊ฐ„์— ๋‚ ์งœ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 77KHz ์ฃผํŒŒ์ˆ˜์˜ ํŒŒ์žฅ์€ ๋งค์šฐ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆํ…Œ๋‚˜ ํ•„๋“œ์˜ ํฌ๊ธฐ๋„ ๊ฝค ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค(์‚ฌ์ง„: Wikipedia).
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์ด๋Ÿฌํ•œ ์•ˆํ…Œ๋‚˜ ๋ฐ ์ „์› ์ž…๋ ฅ์„ ํ†ตํ•ด ์ˆ˜์‹  ์˜์—ญ์€ ๊ฑฐ์˜ ๋ชจ๋“  ์œ ๋Ÿฝ, ๋ฒจ๋กœ๋ฃจ์‹œ, ์šฐํฌ๋ผ์ด๋‚˜ ๋ฐ ๋Ÿฌ์‹œ์•„ ์ผ๋ถ€๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค.

DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

๋ˆ„๊ตฌ๋‚˜ ์‹ ํ˜ธ๋ฅผ ๋…น์Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์˜จ๋ผ์ธ ์ˆ˜์‹ ๊ธฐ๋กœ ์ด๋™ํ•˜์„ธ์š”. http://websdr.ewi.utwente.nl:8901/, ๊ฑฐ๊ธฐ์—์„œ ์ฃผํŒŒ์ˆ˜ 76.5KHz ๋ฐ USB ๋ณ€์กฐ๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

๊ฑฐ๊ธฐ์„œ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ๋ช‡ ๋ถ„ ๊ธธ์ด์˜ ์กฐ๊ฐ์„ ๋…น์Œํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , 77.5KHz ์ฃผํŒŒ์ˆ˜๋ฅผ ๋…น์Œํ•  ์ˆ˜ ์žˆ๋Š” "์‹ค์ œ" ์ˆ˜์‹ ๊ธฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ „ํŒŒ ์‹œ๊ฐ„ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์‹ค์ œ๋กœ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ ํ˜ธ๊ฐ€ ์ง€์—ฐ๋˜์–ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์‹ ํ˜ธ์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋ฏ€๋กœ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐ๋„ท ๋…น์Œ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‹ค์ œ ์ƒํ™œ์—์„œ๋Š” ์ˆ˜์‹  ๋ฐ ๋””์ฝ”๋”ฉ์„ ์œ„ํ•ด ํŠน์ˆ˜ ์žฅ์น˜๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋…น์Œ์„ ๋ฐ›์•˜์œผ๋‹ˆ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹ ํ˜ธ ๋””์ฝ”๋”ฉ

Python์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

sample_rate, data = wavfile.read("dcf_websdr_2019-03-26T20_25_34Z_76.6kHz.wav")
plt.plot(data[:100000])
plt.show()

์ผ๋ฐ˜์ ์ธ ์ง„ํญ ๋ณ€์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

๋””์ฝ”๋”ฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํž๋ฒ ๋ฅดํŠธ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ํ˜ธ ํฌ๋ฝ์„ ์„ ์ทจํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

ํ™•๋Œ€๋œ ๊ฒฐ๊ณผ:
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์ €์—ญ ํ†ต๊ณผ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Œ ๋ฐฉ์ถœ์„ ํ‰ํ™œํ™”ํ•˜๋Š” ๋™์‹œ์— ํ‰๊ท ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‚˜์ค‘์— ๊ตฌ๋ฌธ ๋ถ„์„์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

b, a = signal.butter(2, 20.0/sample_rate)
zi = signal.lfilter_zi(b, a)
A, _ = signal.lfilter(b, a, A, zi=zi*A[0])
avg = (np.amax(A) + np.amin(A))/2

๊ฒฐ๊ณผ(๋…ธ๋ž€์ƒ‰ ์„ ): ๋ถ„์„ํ•˜๊ธฐ ๋งค์šฐ ์‰ฌ์šด ๊ตฌํ˜•ํŒŒ์— ๊ฐ€๊นŒ์šด ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

ํŒŒ์‹ฑ

๋จผ์ € ๋น„ํŠธ ์‹œํ€€์Šค๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ ํ˜ธ ๊ตฌ์กฐ ์ž์ฒด๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

ํŽ„์Šค๋Š” ๋‘ ๋ฒˆ์งธ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค. ํŽ„์Šค ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ 0.1์ดˆ(์ฆ‰, ํŽ„์Šค ์ž์ฒด์˜ ๊ธธ์ด๊ฐ€ 0.9์ดˆ)์ด๋ฉด ๋น„ํŠธ ์‹œํ€€์Šค์— "0"์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฑฐ๋ฆฌ๊ฐ€ 0.2์ดˆ(์ฆ‰, ๊ธธ์ด๊ฐ€ 0.8์ดˆ)์ด๋ฉด "1"์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋งค ๋ถ„์˜ ๋์€ 2์ดˆ ๊ธธ์ด์˜ "๊ธด" ํŽ„์Šค๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ๋น„ํŠธ ์‹œํ€€์Šค๋Š” XNUMX์œผ๋กœ ์žฌ์„ค์ •๋˜๊ณ  ์ฑ„์šฐ๊ธฐ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์€ Python์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos] < avg and A[pos+1] > avg:
        # Signal begin
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signal end
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff < 0.85*sample_rate:
            bits_str += "1"
        if diff > 0.85*sample_rate and diff < 1.25*sample_rate:
            bits_str += "0"
        if diff > 1.5*sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ผ๋ จ์˜ ๋น„ํŠธ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” XNUMX์ดˆ ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

๊ทธ๋Ÿฐ๋ฐ ์‹ ํ˜ธ์— ๋ฐ์ดํ„ฐ์˜ "๋‘ ๋ฒˆ์งธ ๊ณ„์ธต"๋„ ์žˆ๋‹ค๋Š” ์ ์ด ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋น„ํŠธ ์‹œํ€€์Šค๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์œ„์ƒ ๋ณ€์กฐ. ์ด๋ก ์ ์œผ๋กœ ์ด๋Š” ์‹ ํ˜ธ๊ฐ€ ์•ฝํ•œ ๊ฒฝ์šฐ์—๋„ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ๋””์ฝ”๋”ฉ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„: ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋น„ํŠธ๋Š” ์ดˆ๋‹น ํ•œ ๋ฒˆ ์ „์†ก๋˜๋ฏ€๋กœ ์ด 59๋น„ํŠธ๊ฐ€ ๋˜๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ์ƒ๋‹นํžˆ ๋งŽ์€ ์ •๋ณด๊ฐ€ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

๋น„ํŠธ๋Š” ๋‹ค์Œ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ‚คํ”ผ๋””์•„, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๋งค์šฐ ํ˜ธ๊ธฐ์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ 15๋น„ํŠธ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ๊ฒฝ๊ณ  ์‹œ์Šคํ…œ๊ณผ ๋ฏผ๋ฐฉ์œ„์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„ํŠธ A1์€ ์‹œ๊ณ„๊ฐ€ ๋‹ค์Œ ์‹œ๊ฐ„์— ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„์ œ๋กœ ๋ณ€๊ฒฝ๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋น„ํŠธ A2๋Š” ์ถ”๊ฐ€ ํ•ญ๋ชฉ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์œค์ดˆ, ๋•Œ๋กœ๋Š” ์ง€๊ตฌ์˜ ์ž์ „์— ๋”ฐ๋ผ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋Š” ์‹œ, ๋ถ„, ์ดˆ ๋ฐ ๋‚ ์งœ๋ฅผ โ€‹โ€‹์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์Šค์Šค๋กœ ์‹คํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์€ ๋ถ„๋“ค์„ ์œ„ํ•ด ์Šคํฌ์ผ๋Ÿฌ ์•„๋ž˜์— ๋””์ฝ”๋”ฉ ์ฝ”๋“œ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
์†Œ์Šค ์ฝ”๋“œ

def decode(bits):
    if bits[0] != '0' or bits[20] != '1':
        return
    
    minutes, hours, day_of_month, weekday, month, year = map(convert_block,
                                                             (bits[21:28], bits[29:35], bits[36:42], bits[42:45],
                                                              bits[45:50], bits[50:58]))
    days = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
    print('{dow}, {dom:02}.{mon:02}.{y}, {h:02}:{m:02}'.format(h=hours, m=minutes, dow=days[weekday],
                                                               dom=day_of_month, mon=month, y=year))


def convert_ones(bits):
    return sum(2**i for i, bit in enumerate(bits) if bit == '1')


def convert_tens(bits):
    return 10*convert_ones(bits)


def right_parity(bits, parity_bit):
    num_of_ones = sum(int(bit) for bit in bits)
    return num_of_ones % 2 == int(parity_bit)


def convert_block(bits, parity=False):
    if parity and not right_parity(bits[:-1], bits[-1]):
        return -1
    
    ones = bits[:4]
    tens = bits[4:]
    return convert_tens(tens) + convert_ones(ones)

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42

์‚ฌ์‹ค ๊ทธ๊ฒŒ ์ „๋ถ€ ๋งˆ๋ฒ•์ด์—์š”. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์˜ ์žฅ์ ์€ ๋””์ฝ”๋”ฉ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ํŽ„์Šค์˜ ๊ธธ์ด๋ฅผ ์„ธ๊ณ  60๋น„ํŠธ๋ฅผ ์ถ•์ ํ•˜๋ฉฐ ๋งค ๋ถ„์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ๊ฐ„ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•(์˜ˆ: GPS ๋˜๋Š” ์ธํ„ฐ๋„ท ๊ธˆ์ง€)๊ณผ ๋น„๊ตํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๋ฌด์„  ๋™๊ธฐํ™”์—๋Š” ์‚ฌ์‹ค์ƒ ์ „๊ธฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜ ๊ฐ€์ •์šฉ ๊ธฐ์ƒ ๊ด€์ธก์†Œ๋Š” AA ๋ฐฐํ„ฐ๋ฆฌ 2๊ฐœ๋กœ ์•ฝ XNUMX๋…„ ๋™์•ˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒฝ์‹œ๊ณ„๋‚˜ ๊ฑฐ๋ฆฌ ๊ด€์ธก์†Œ ์‹œ๊ณ„๋Š” ๋ฌผ๋ก  ์†๋ชฉ์‹œ๊ณ„๋„ ๋ฌด์„  ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์œผ๋กœ ์ œ์ž‘๋ฉ๋‹ˆ๋‹ค.

DCF์˜ ํŽธ๋ฆฌํ•จ๊ณผ ๋‹จ์ˆœํ•จ๋„ DIY ๋งˆ๋‹ˆ์•„๋“ค์„ ๋งค๋ฃŒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋‹จ 10~20๋‹ฌ๋Ÿฌ์— Arduino ๋˜๋Š” ๊ธฐํƒ€ ์ปจํŠธ๋กค๋Ÿฌ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์„ฑ ์ˆ˜์‹ ๊ธฐ ๋ฐ TTL ์ถœ๋ ฅ์ด ํฌํ•จ๋œ ๊ธฐ์„ฑ ์•ˆํ…Œ๋‚˜ ๋ชจ๋“ˆ์„ ๊ตฌ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์ด๋ฏธ Arduino์šฉ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋œ ๋„์„œ๊ด€. ๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฌด์—‡์„ ํ•˜๋“  ๊ฒฐ๊ตญ ์‹œ๊ณ„๋‚˜ ๊ธฐ์ƒ ๊ด€์ธก์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ท€ํ•˜๊ฐ€ ๋ฆฌ์…‰์…˜ ๊ตฌ์—ญ์— ์žˆ๋‹ค๋ฉด ๋ง์ด์ฃ . ๊ธ€์Ž„, ์‹œ๊ณ„์— "์›์ž ์‹œ๊ณ„"๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ๊ฑธ๊ณ  ๋™์‹œ์— ์žฅ์น˜๊ฐ€ ์‹ค์ œ๋กœ ์›์ž ์‹œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ฌด์„  ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ค์น˜ํ•˜์—ฌ ์˜ค๋ž˜๋œ ํ• ๋จธ๋‹ˆ์˜ ์‹œ๊ณ„๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

eBay์—์„œ "Radio Controlled Movement"๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์œผ์‹  ๋ถ„๋“ค์„ ์œ„ํ•œ ์ธ์ƒ ๊ฟ€ํŒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ช‡ ์ฒœ ํ‚ฌ๋กœ๋ฏธํ„ฐ ๋™์•ˆ ๋‹จ์ผ ๋ฌด์„  ์‹ ํ˜ธ ์†ก์‹ ๊ธฐ๊ฐ€ ์—†๋”๋ผ๋„ ๊ทธ๋Ÿฌํ•œ ์‹ ํ˜ธ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Google Play์—๋Š” ์‹ ํ˜ธ๋ฅผ ํ—ค๋“œํฐ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” "DCF77 Emulator"๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์ž์— ๋”ฐ๋ฅด๋ฉด ์‹œ๊ณ„ ์ฃผ์œ„์— ํ—ค๋“œํฐ ์™€์ด์–ด๋ฅผ ๊ฐ์œผ๋ฉด ์‹ ํ˜ธ๊ฐ€ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜ ํ—ค๋“œํฐ์€ 77KHz ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์ง€๋งŒ ์ˆ˜์‹ ์€ ์•„๋งˆ๋„ ๊ณ ์กฐํŒŒ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ๋กœ์šด ์ ์ž…๋‹ˆ๋‹ค). Android 9์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š์•˜์ง€๋งŒ (๋˜๋Š” ๋“ฃ์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ 77KHz์ž…๋‹ˆ๋‹ค :) ์–ด์ฉŒ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋” ๋‚˜์€ ํ–‰์šด์„ ๋ˆ„๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€๋Š” ๋™์ผํ•œ Arduino ๋˜๋Š” ESP32์—์„œ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์™„์ „ํ•œ DCF ์‹ ํ˜ธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

DCF77: ์‹œ๋ณด ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?
(์ถœ์ฒ˜ sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio- Controlled-watch-without-access)

๊ฒฐ๋ก 

DCF ์‹œ์Šคํ…œ์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ์ €๋ ดํ•œ ์ˆ˜์‹ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜์‹  ๊ตฌ์—ญ์€ ๋ฌผ๋ก  ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด‘๋ฒ”์œ„ํ•œ ๋””์ง€ํ„ธํ™”์™€ ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์€ ์˜ค๋žซ๋™์•ˆ ์ˆ˜์š”๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€