DCF77: Bagaimana cara kerja sistem sinyal waktu?

Halo Habr.

Mungkin banyak orang yang membeli jam tangan atau stasiun cuaca pernah melihat logo Radio Controlled Clock atau bahkan Atomic Clock pada kemasannya. Ini sangat nyaman, karena Anda hanya perlu meletakkan jam di atas meja, dan setelah beberapa saat jam akan otomatis menyesuaikan dengan waktu yang tepat.
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Mari kita cari tahu cara kerjanya dan menulis decoder dengan Python.

Ada sistem sinkronisasi waktu yang berbeda. Yang paling populer di Eropa adalah sistem Jerman DCF-77, Jepang memiliki sistemnya sendiri JJY, di Amerika ada sistemnya WWVB, dan seterusnya. Selanjutnya, ceritanya akan tentang DCF77, sebagai yang paling relevan dan mudah diakses untuk diterima di beberapa tempat di bagian Eropa Rusia dan negara-negara tetangga (penduduk di Timur Jauh mungkin memiliki pendapat sebaliknya, namun mereka, pada gilirannya, dapat menerima dan menganalisis sinyal Jepang;).

Semua yang tertulis di bawah ini adalah tentang DCF77.

Penerimaan sinyal

DCF77 adalah stasiun gelombang panjang yang beroperasi pada frekuensi 77.5 kHz dan mentransmisikan sinyal dalam modulasi amplitudo. Stasiun 50KW terletak 25 km dari Frankfurt, mulai beroperasi pada tahun 1959, dan pada tahun 1973 informasi tanggal ditambahkan ke waktu yang tepat. Panjang gelombang pada frekuensi 77 KHz sangat panjang, sehingga dimensi bidang antena juga cukup baik (foto dari Wikipedia):
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Dengan antena dan input daya seperti itu, area penerimaan mencakup hampir seluruh Eropa, Belarusia, Ukraina, dan sebagian Rusia.

DCF77: Bagaimana cara kerja sistem sinyal waktu?

Siapa pun dapat merekam sinyal. Untuk melakukan ini, cukup buka receiver online http://websdr.ewi.utwente.nl:8901/, pilih frekuensi 76.5KHz dan modulasi USB di sana. Sebuah gambar akan terbuka yang terlihat seperti ini:

DCF77: Bagaimana cara kerja sistem sinyal waktu?

Di sana kami menekan tombol unduh dan merekam sebuah fragmen berdurasi beberapa menit. Tentu saja, jika Anda mempunyai receiver “nyata” yang mampu merekam frekuensi 77.5KHz, Anda dapat menggunakannya.

Tentu saja, dengan menerima sinyal waktu radio melalui Internet, kita tidak akan menerima waktu yang benar-benar akurat - sinyal dikirimkan dengan penundaan. Namun tujuan kami hanyalah memahami struktur sinyal; untuk ini, rekaman Internet sudah lebih dari cukup. Dalam kehidupan nyata, tentu saja, perangkat khusus digunakan untuk menerima dan mendekode; hal tersebut akan dibahas di bawah.

Jadi rekamannya sudah kita terima, mari kita mulai mengolahnya.

Penguraian Sinyal

Mari muat file menggunakan Python dan lihat strukturnya:

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()

Kami melihat modulasi amplitudo yang khas:
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Untuk menyederhanakan decoding, mari kita ambil amplop sinyal menggunakan transformasi Hilbert:

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

Hasil yang diperbesar:
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Mari kita menghaluskan emisi kebisingan menggunakan filter low-pass, dan pada saat yang sama menghitung nilai rata-rata, yang nantinya akan berguna untuk penguraian.

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

Hasil (garis kuning): sinyal gelombang hampir persegi yang cukup mudah untuk dianalisis.
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Alasannya

Pertama, Anda perlu mendapatkan urutan bit. Struktur sinyalnya sendiri sangat sederhana.
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Denyut nadi dibagi menjadi interval kedua. Jika jarak antar pulsa adalah 0.1s (yaitu panjang pulsa itu sendiri adalah 0.9s), tambahkan “0” ke urutan bit; jika jaraknya 0.2s (yaitu panjangnya 0.8s), tambahkan “1”. Akhir setiap menit ditandai dengan pulsa “panjang”, sepanjang 2 detik, urutan bit diatur ulang ke nol, dan pengisian dimulai lagi.

Di atas mudah untuk ditulis dengan 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

Hasilnya, kita mendapatkan urutan bit, dalam contoh kita selama dua detik terlihat seperti ini:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Menariknya, sinyal tersebut juga memiliki data “lapisan kedua”. Urutan bit juga dikodekan menggunakan modulasi fase. Secara teori, ini akan memberikan decoding yang lebih kuat bahkan dalam kasus sinyal yang melemah.

Langkah terakhir kami: mendapatkan data aktual. Bit ditransmisikan satu kali per detik, jadi kita mempunyai total 59 bit, yang di dalamnya cukup banyak informasi yang dikodekan:
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Bit-bitnya dijelaskan dalam Wikipedia, dan mereka cukup penasaran. 15 bit pertama tidak digunakan, meskipun ada rencana untuk menggunakannya untuk sistem peringatan dan pertahanan sipil. Bit A1 menunjukkan bahwa jam akan berubah ke waktu musim panas pada jam berikutnya. Bit A2 menunjukkan tambahan lompatan kedua, yang terkadang digunakan untuk mengatur waktu menurut rotasi bumi. Bit yang tersisa mengkodekan jam, menit, detik dan tanggal.

DCF77: Bagaimana cara kerja sistem sinyal waktu?

Bagi yang ingin bereksperimen sendiri, kode decoding diberikan di bawah spoiler.
Sumber

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)

Saat kita menjalankan programnya, kita akan melihat output seperti ini:

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

Sebenarnya, itulah keajaibannya. Keuntungan dari sistem seperti ini adalah decodingnya sangat sederhana dan dapat dilakukan pada mikrokontroler apa pun, bahkan mikrokontroler yang paling sederhana sekalipun. Kami cukup menghitung panjang pulsa, mengumpulkan 60 bit, dan pada akhir setiap menit kami mendapatkan waktu yang tepat. Dibandingkan dengan metode sinkronisasi waktu lainnya (GPS, misalnya, atau amit-amit, Internet :), sinkronisasi radio semacam itu hampir tidak memerlukan listrik - misalnya, stasiun cuaca rumah biasa beroperasi selama sekitar satu tahun dengan 2 baterai AA. Oleh karena itu, jam tangan pun dibuat dengan sinkronisasi radio, belum lagi jam tangan dinding atau jam stasiun jalanan.

Kenyamanan dan kesederhanaan DCF juga menarik para penggemar DIY. Hanya dengan $10-20 Anda dapat membeli modul antena siap pakai dengan receiver siap pakai dan output TTL, yang dapat dihubungkan ke Arduino atau pengontrol lainnya.
DCF77: Bagaimana cara kerja sistem sinyal waktu?

Sudah ditulis untuk Arduino perpustakaan yang sudah jadi. Namun, telah diketahui bahwa apa pun yang Anda lakukan pada mikrokontroler, Anda akan mendapatkan jam atau stasiun cuaca. Dengan alat seperti itu, mendapatkan waktu yang tepat menjadi sangat mudah, tentu saja asalkan Anda berada di area resepsionis. Nah, Anda bisa menggantungkan tulisan “Jam Atom” di jam tangan Anda, sekaligus menjelaskan kepada semua orang bahwa perangkat tersebut benar-benar disinkronkan menggunakan jam atom.

Mereka yang berkeinginan bahkan dapat mengupgrade jam tangan nenek lama mereka dengan memasang mekanisme baru dengan sinkronisasi radio:

DCF77: Bagaimana cara kerja sistem sinyal waktu?

Anda dapat menemukannya di ebay dengan menggunakan kata kunci “Radio Controlled Movement”.

Dan terakhir, peretasan kehidupan bagi mereka yang telah membaca sejauh ini. Sekalipun tidak ada satu pun pemancar sinyal radio dalam beberapa ribu km berikutnya, tidak sulit untuk menghasilkan sinyal seperti itu sendiri. Ada program di Google Play yang disebut “DCF77 Emulator” yang mengeluarkan sinyal ke headphone. Menurut penulis, jika Anda melilitkan kabel headphone di sekitar jam tangan, mereka akan menangkap sinyalnya (menarik bagaimana caranya, karena headphone biasa tidak akan menghasilkan sinyal 77KHz, tetapi penerimaannya mungkin karena harmonik). Di Android 9, program ini tidak berfungsi sama sekali untuk saya - tidak ada suara (atau mungkin saya tidak mendengarnya - lagipula 77KHz :), tapi mungkin seseorang akan lebih beruntung. Namun, beberapa membuat generator sinyal DCF lengkap, yang mudah dibuat dengan Arduino atau ESP32 yang sama:

DCF77: Bagaimana cara kerja sistem sinyal waktu?
(sumber sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio- controlled-watch-without-access)

Kesimpulan

Sistem DCF ternyata sangat sederhana dan nyaman. Dengan bantuan receiver yang sederhana dan murah, Anda dapat mengetahui waktu yang tepat kapan pun dan di mana pun, tentu saja di area resepsionis. Tampaknya meskipun digitalisasi meluas dan Internet of Things (IoT), solusi sederhana seperti itu akan tetap diminati dalam jangka waktu yang lama.

Sumber: www.habr.com

Tambah komentar