Salama Habr.
Maro amin'ireo mividy famantaranandro na tobim-pandrefesana toetr'andro no nahita ny famantaranandron'ny Radio Controlled na ny famantarana famantarana famantarana atomika eo amin'ny fonosana. Tena mety izany, satria mila mametraka ny famantaranandro eo amin'ny latabatra fotsiny ianao, ary rehefa afaka kelikely dia hiova ho azy amin'ny fotoana marina izany.

Andeha hojerentsika ny fomba fiasany ary manoratra decoder amin'ny Python.
Misy rafitra synchronization fotoana samy hafa. Ny malaza indrindra any Eoropa dia ny rafitra alemana , manana rafitra manokana i Japana , any Etazonia misy rafitra , sy ny sisa. Manaraka, ny tantara dia momba ny DCF77, satria ny tena manan-danja sy azo idirana amin'ny fandraisana any amin'ny toerana sasany any amin'ny faritra Eoropeana ao Rosia sy ny firenena manodidina (ny mponina any amin'ny Far East dia mety manana hevitra mifanohitra, na izany aza, izy ireo kosa dia afaka mahazo. ary diniho ny famantarana japoney;).
Ny zavatra rehetra voasoratra etsy ambany dia momba ny DCF77.
Fandraisana famantarana
DCF77 dia onjam-peo lava miasa amin'ny fatran'ny 77.5 kHz ary mandefa famantarana amin'ny amplitude modulation. Ny gara 50KW dia 25 km miala an'i Frankfurt, nanomboka niasa tamin'ny 1959, ary tamin'ny 1973 dia nampiana ny fotoana marina ny vaovao momba ny daty. Ny halavan'ny onjam amin'ny fatran'ny 77 KHz dia lava be, noho izany dia mendrika ihany koa ny refin'ny sahan'ny antenne (sary avy amin'ny Wikipedia):

Miaraka amin'ny antena toy izany sy ny fampidirana herinaratra, ny faritra fandraisana dia saika manerana an'i Eoropa, Belarosia, Okraina ary ampahany amin'i Rosia.

Afaka mirakitra famantarana ny olona rehetra. Mba hanaovana izany, mandehana fotsiny any amin'ny mpandray an-tserasera , safidio ny frequence 76.5KHz sy USB modulation ao. Tokony hisokatra ny sary iray izay toa izao:

Ao no manindry ny bokotra fampidinana ary mirakitra sombiny iray minitra maromaro. Mazava ho azy fa raha manana mpandray "tena" ianao afaka mirakitra ny fatran'ny 77.5KHz dia azonao ampiasaina izany.
Mazava ho azy, amin'ny fandraisana famantarana amin'ny radio amin'ny alΓ lan'ny Internet, dia tsy hahazo fotoana tena marina isika - alefa miaraka amin'ny fahatarana ny famantarana. Saingy ny tanjonay dia ny hahatakatra ny firafitry ny famantarana ihany; noho izany, ny firaketana amin'ny Internet dia mihoatra ny ampy. Amin'ny tena fiainana, mazava ho azy, ny fitaovana manokana dia ampiasaina amin'ny fandraisana sy decoding, horesahina etsy ambany.
Noho izany, voaray ny fandraisam-peo, andao hanomboka ny fanodinana azy.
Famaritana famantarana
Andao hampiditra ny rakitra mampiasa Python ary jereo ny rafitra:
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()
Hitantsika ny modulation amplitude mahazatra:

Mba hanatsorana ny decoding, andeha horaisintsika ny valopy famantarana amin'ny fampiasana ny fanovana Hilbert:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Vokatra lehibe kokoa:

Andao hanalefaka ny fivoahan'ny tabataba amin'ny alΓ lan'ny sivana ambany-pass, ary kajy ny sandan'ny salan'isa, izay ilaina amin'ny famafazana.
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
Vokany (tsipika mavo): mari-pamantarana onjam-peo saika efa-joro izay mora ny fakafakaina.

Famakafakana
Voalohany dia mila mahazo ny filaharan'ny bit ianao. Ny rafitra famantarana mihitsy dia tena tsotra.

Mizara roa ny pulses. Raha 0.1s ny elanelan'ny pulses (izany hoe 0.9s ny halavan'ny pulses), ampio ny "0" amin'ny filaharana bit; raha 0.2s ny elanelana (izany hoe 0.8s ny halavany), ampio ny "1". Ny fiafaran'ny minitra tsirairay dia aseho amin'ny alΓ lan'ny pulse "lava", 2s ny halavany, averina amin'ny zero ny filaharana bit, ary manomboka indray ny famenoana.
Ity ambony ity dia mora soratana amin'ny 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
Vokatr'izany dia mahazo filaharan'ny bits isika, amin'ny ohatra asehontsika mandritra ny roa segondra dia toa izao:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Amin'ny lafiny iray, mahaliana fa ny famantarana koa dia manana angon-drakitra "sosona faharoa". Ny filaharan'ny bit dia ampiasaina ihany koa . Raha ny teoria dia tokony hanome decoding matanjaka kokoa izany na dia amin'ny tranganΓ famantarana malemy aza.
Ny dingana farany ataontsika: maka ny tena angona. Ampitaina indray mandeha isan-tsegondra ny bits, noho izany dia manana totalin'ny 59 bit isika, izay misy fampahalalana be dia be voarakitra:

Ny bits dia voalaza ao , ary tena mahaliana azy ireo. Ny bitika 15 voalohany dia tsy ampiasaina, na dia nisy aza ny fikasana hampiasa azy ireo ho an'ny rafitra fampitandremana sy fiarovana sivily. Bit A1 dia manondro fa ny famantaranandro dia hiova ho ora antoandro amin'ny ora manaraka. Bit A2 dia manondro fa fanampiny , izay ampiasaina indraindray mba hanitsiana ny fotoana araka ny fihodinanβny tany. Ny bits sisa dia manisa ora, minitra, segondra ary daty.

Ho an'ireo izay te hanandrana samirery dia omena eo ambanin'ny mpandroba ny code decoding.
Source
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)
Rehefa mihazakazaka ny programa isika dia hahita vokatra mitovy amin'ity:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Raha ny marina, izany no majika rehetra. Ny tombony amin'ny rafitra toy izany dia ny decoding dia tena tsotra ary azo atao amin'ny rehetra, na dia ny microcontroller tsotra indrindra. Manisa fotsiny ny halavan'ny pulses isika, manangona 60 bit, ary amin'ny faran'ny minitra tsirairay dia mahazo ny fotoana marina. Raha ampitahaina amin'ny fomba hafa amin'ny fampifanarahana ny fotoana (GPS, ohatra, na mandrara an'Andriamanitra, ny Internet :)), ny fampifanarahana amin'ny onjam-peo toy izany dia tsy mitaky herinaratra - ohatra, ny tobim-pitaterana toetr'andro ao an-trano dia mandeha mandritra ny herintaona amin'ny batterie 2 AA. Noho izany, na ny wristwatches aza dia vita amin'ny radio synchronization, tsy lazaina intsony, mazava ho azy, ny famantaranandro rindrina na famantaranandro eny an-dalambe.
Ny fanamorana sy ny fahatsoran'ny DCF dia mahasarika mpankafy DIY ihany koa. Ho an'ny $ 10-20 fotsiny dia azonao atao ny mividy mody antena efa vita miaraka amin'ny mpandray efa vonona sy ny famoahana TTL, izay azo ampifandraisina amin'ny Arduino na mpanara-maso hafa.

Efa nosoratana ho an'ny Arduino . Na izany aza, efa fantatra fa na inona na inona ataonao amin'ny microcontroller dia miafara amin'ny famantaranandro na famantaranandro. Miaraka amin'ny fitaovana toy izany, ny fahazoana ny fotoana marina dia tena mora, raha toa ka, mazava ho azy, fa ao amin'ny faritra fandraisana ianao. Eny ary, azonao atao ny manantona ny soratra hoe "Clock Atomic" amin'ny famantaranandro, ary manazava amin'ny olona rehetra fa tena ampiarahina amin'ny famantaranandro atomika ilay fitaovana.
Ireo izay maniry dia afaka manavao ny famantaranandron'ny renibeny taloha amin'ny fametrahana mekanika vaovao miaraka amin'ny fampifanarahana amin'ny radio:

Azonao atao ny mahita iray amin'ny ebay amin'ny fampiasana ny teny fanalahidy hoe "Radio Controlled Movement".
Ary farany, tetika kely ho an'ireo izay efa namaky hatreto. Na dia tsy misy mpandefa radio tokana aza ao anatin'ny kilaometatra vitsivitsy, dia mora ny mamorona iray samirery. Misy fampiharana ao amin'ny Google Play antsoina hoe "DCF77 Emulator" izay mamoaka famantarana mankany amin'ny Γ©couteur. Milaza ny mpanoratra fa raha afatotrao amin'ny famantaranandro ny tariby Γ©couteur, dia horaisiny ny famantarana (manontany tena aho hoe ahoana, satria ny Γ©couteur mahazatra dia tsy mamoaka famantarana 77 kHz, fa angamba noho ny harmonics). Amin'ny famantaranandroko... Android Tsy nandeha mihitsy ny fandaharana 9βtsy nisy feo mihitsy (na angamba tsy reko fotsinyβ77 kHz ilay izy, raha ny marina. :)), fa angamba hisy olon-kafa ho tsara vintana kokoa. Misy olona sasany anefa manamboatra ny mpamokatra famantarana DCF feno azy manokana, izay mora atao amin'ny fampiasana Arduino na ESP32:

(loharano iray )
famaranana
Ny rafitra DCF dia nivadika ho tena tsotra sy mety. Miaraka amin'ny fanampian'ny mpandray tsotra sy mora, dia afaka manana ny fotoana marina foana sy na aiza na aiza, mazava ho azy ao amin'ny faritra fandraisana. Toa na dia eo aza ny digitalization miely patrana sy ny Internet of Things, ny vahaolana tsotra toy izany dia hitakiana mandritra ny fotoana maharitra.
Source: www.habr.com
