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
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
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
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
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
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, hack fiainana ho an'ireo izay namaky hatramin'izao. Na dia tsy misy mpampita famantarana radio iray aza ao anatin'ny roa arivo km manaraka, dia tsy sarotra ny mamorona famantarana toy izany. Misy programa ao amin'ny Google Play antsoina hoe "DCF77 Emulator" izay mamoaka ny famantarana amin'ny Γ©couteur. Araka ny filazan'ny mpanoratra, raha mamatotra ny tariby amin'ny Γ©couteur manodidina ny famantaranandro ianao, dia haka ny famantarana izy ireo (mahaliana ny fomba, satria ny headphone tsotra dia tsy hamokatra famantarana 77KHz, fa ny fandraisana dia mety noho ny harmonics). Ao amin'ny Android 9 dia tsy niasa tamiko mihitsy ilay programa - tsy nisy feo tsotra izao (na angamba tsy nandre izany aho - 77KHz izany, na izany aza :), fa angamba hisy olona hahazo vintana tsara kokoa. Ny sasany anefa dia manao ny tenany ho mpamokatra famantarana DCF feno, izay mora atao amin'ny Arduino na ESP32 ihany:
(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