مرحباً هبر.
ربما رأى كثير من الناس الذين يشترون ساعة أو محطة طقس شعار ساعة راديو التحكم أو حتى ساعة ذرية على العبوة. هذا مريح للغاية ، لأنه يكفي لوضع الساعة على الطاولة ، وبعد فترة من الوقت سوف يتكيفون تلقائيًا مع الوقت المحدد.

دعونا نرى كيف يعمل وكتابة وحدة فك الترميز في بيثون.
هناك أنظمة مزامنة زمنية مختلفة. الأكثر شعبية في أوروبا هو نظام
DCF-77 الألماني ، واليابان لديها نظام
JJY الخاص بها ، والولايات المتحدة الأمريكية لديها نظام
WWVB ، وهلم جرا. علاوة على ذلك ، ستكون القصة حول DCF77 ، باعتبارها الأكثر صلة ومتاحة للاستقبال في بعض الأماكن في الجزء الأوروبي من روسيا والبلدان المجاورة (قد يكون لسكان الشرق الأقصى رأي معاكس ، لكنهم بدورهم يمكنهم قبول الإشارة اليابانية وتحليلها ؛).
كل شيء مكتوب أدناه سيكون حول DCF77.
استقبال إشارة
DCF77 هي محطة ذات موجة طويلة تعمل على تردد 77.5 كيلو هرتز ، وترسل إشارات في تعديل السعة. تقع المحطة بسعة 50 كيلوواط على بعد 25 كم من فرانكفورت ، وبدأت العمل مرة أخرى في عام 1959 ، في عام 1973 تم إضافة معلومات التاريخ إلى الوقت المحدد. الطول الموجي على تردد 77 كيلو هرتز كبير جدًا ، لذا تعد أبعاد مجال الهوائي مناسبة جدًا (صورة من ويكيبيديا):

مع مثل هذا الهوائي وإدخال الطاقة ، تغطي منطقة الاستقبال أوروبا بأكملها تقريبًا وبيلاروسيا وأوكرانيا وجزء من روسيا.

يمكن للجميع تسجيل إشارة. للقيام بذلك ، ما عليك سوى الانتقال إلى المتلقي عبر الإنترنت
http://websdr.ewi.utwente.nl:8901/ ، وحدد التردد هناك 76.5 كيلو هرتز وتعديل USB. يجب فتح صورة لشيء من هذا القبيل:

هناك نضغط على زر التنزيل ونسجل شظية عدة دقائق. بالطبع ، إذا كان لديك جهاز استقبال "حقيقي" قادر على تسجيل تردد يبلغ 77.5 كيلو هرتز ، فيمكنك استخدامه.
بالطبع ، عندما نتلقى إشارات الراديو في الوقت المحدد عبر الإنترنت ، لن نحصل على الوقت بالضبط - يتم تأخير الإشارة. لكن هدفنا هو فقط فهم بنية الإشارة ؛ ولهذا ، فإن تسجيل الإنترنت أكثر من كاف. في الحياة الواقعية ، بالطبع ، يتم استخدام أجهزة متخصصة للاستقبال وفك التشفير ، وسيتم مناقشتها أدناه.
لذلك ، حصلنا على السجل ، لنبدأ بمعالجته.
إشارة فك التشفير
قم بتنزيل الملف باستخدام 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()
نرى تعديل السعة نموذجي:

لتبسيط فك التشفير ، نأخذ مغلف الإشارة باستخدام تحويل Hilbert:
analytic_signal = signal.hilbert(data) A = np.abs(analytic_signal) plt.plot(A[:100000])
النتيجة في طريقة عرض مكبرة:

نقوم بتخفيف الانبعاثات الناتجة عن التداخل باستخدام مرشح تمرير منخفض ، وفي نفس الوقت نحسب متوسط القيمة ، سيكون مفيدًا في وقت لاحق للتحليل.
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
النتيجة (الخط الأصفر): إشارة مستطيلة تقريبًا يسهل تحليلها إلى حد ما.

إعراب
تحتاج أولا إلى الحصول على تسلسل بت. بنية الإشارة نفسها بسيطة للغاية.

تنقسم البقول إلى فواصل زمنية ثانية. إذا كانت المسافة بين النبضات 0.1 ثانية (أي ، طول النبضة هو 0.9 ثانية) ، أضف "0" إلى تسلسل البتة ، إذا كانت المسافة 0.2 ثانية (أي 0.8 ثانية) ، أضف "1". يشار إلى نهاية كل دقيقة بنبض "طويل" ، طوله 2 ثانية ، تتم إعادة تعيين تسلسل البت إلى صفر ، ويبدأ التعبئة مرة أخرى.
ما سبق سهل الكتابة في بايثون.
sig_start, sig_stop = 0, 0 pos = 0 bits_str = "" while pos < cnt - 4: if A[pos] < avg and A[pos+1] > avg:
نتيجةً لذلك ، حصلنا على سلسلة من البتات ، في مثالنا لمدة دقيقتين ، يبدو الأمر كما يلي:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
بالمناسبة ، من المثير للاهتمام أن هناك "طبقة ثانية" من البيانات في الإشارة. يتم تشفير تسلسل البتات أيضًا باستخدام
تشكيل الطور . من الناحية النظرية ، ينبغي أن يوفر هذا فك تشفير أكثر استقرارًا حتى في حالة وجود إشارة ضعيفة.
خطوتنا الأخيرة: الحصول على البيانات الفعلية. يتم إرسال البتات مرة واحدة في الثانية ، لذلك لدينا 59 بت فقط ، حيث يتم تشفير الكثير من المعلومات:

يتم وصف البتات على
ويكيبيديا ، وهم فضوليون جداً. لا يتم استخدام أول 15 بت ، على الرغم من وجود خطط لاستخدامها في أنظمة الإنذار
والدفاع المدني . تشير البت A1 إلى أنه في الساعة التالية سيتم ضبط الساعة على التوقيت الصيفي. تشير البتة A2 إلى أنه سيتم إضافة
ثانية إضافية في الساعة التالية ، والتي تُستخدم أحيانًا لتصحيح الوقت وفقًا لدوران الأرض. البتات المتبقية ترميز الساعات والدقائق والتاريخ.

بالنسبة لأولئك الذين يرغبون في تجربة من تلقاء أنفسهم ، يتم إعطاء رمز فك التشفير تحت المفسد.
شفرة المصدر 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. لذلك ، حتى ساعة اليد مصنوعة مع تزامن الراديو ، ناهيك عن بالطبع ، عن الجدار أو محطة الشارع.
الراحة والبساطة من DCF جذب عشاق المنتجات محلية الصنع. مقابل 10-20 دولار فقط ، يمكنك شراء وحدة نمطية جاهزة من هوائي به مستقبل جاهز وإخراج TTL ، والذي يمكن توصيله بأردوينو أو وحدة تحكم أخرى.

بالنسبة إلى Arduino ، تمت كتابة
مكتبات جاهزة بالفعل. ومع ذلك ، من المعروف بالفعل أنه بغض النظر عما تفعله على المتحكم الدقيق ، يمكنك الحصول على ساعة أو محطة الطقس. مع مثل هذا الجهاز ، يكون الحصول على الوقت الدقيق أمرًا سهلاً للغاية ، شريطة أن تكون في منطقة الاستقبال. حسنًا ، يمكنك تعليق نقش "الساعة الذرية" على الساعة ، وفي نفس الوقت شرح لكل من يريد ذلك ، أن الجهاز متزامن حقًا باستخدام ساعة ذرية.
يمكن لأولئك الذين يرغبون في ترقية ساعات جدتهم القديمة عن طريق تثبيت آلية جديدة مع تزامن الراديو فيها:

يمكنك العثور على واحدة على موقع ئي باي باستخدام الكلمات الرئيسية "الحركة التي تسيطر عليها الراديو".
وأخيرا ، اختراق الحياة لأولئك الذين قرأوا هنا. حتى لو لم يكن هناك جهاز إرسال واحد لإشارة الراديو في الألفين القادمة من الكيلومترات ، فمن السهل توليد مثل هذه الإشارة بشكل مستقل. يحتوي Google Play على برنامج يسمى "DCF77 Emulator" يقوم بإخراج إشارة إلى سماعات الرأس. وفقًا للمؤلف ، إذا قمت بلف سلك السماعة حول الساعة ، فسوف تصطاد إشارة (أتساءل كيف ، لأن سماعات الرأس العادية لن تعطي إشارة 77 كيلو هرتز ، ولكن ربما يأتي الاستقبال من التوافقيات). لم يعمل برنامجي على نظام Android 9 على الإطلاق - ببساطة لم يكن هناك صوت (أو ربما لم أسمع به - 77 كيلو هرتز ، بعد كل شيء :) ، ولكن ربما سيكون هناك شخص ما محظوظ. ومع ذلك ، يصنع البعض أنفسهم مولد إشارات DCF كامل ، من السهل القيام به على نفس Arduino أو ESP32:

(source
sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without- access )
استنتاج
اتضح أن نظام DCF كان بسيطًا للغاية ومريحًا. بمساعدة جهاز استقبال بسيط ورخيص ، يمكنك الحصول على الوقت الدقيق في أي وقت ، في أي مكان ، بالطبع ، في منطقة الاستقبال. يبدو أنه على الرغم من انتشار التكنولوجيا الرقمية و "إنترنت الأشياء" ، إلا أن مثل هذه الحلول البسيطة ستكون مطلوبة لفترة طويلة قادمة.