كيفية تكوين صداقات PLUTO و HDSDR



منذ وقت ليس ببعيد ، اشترى باندفاع جهاز إرسال واستقبال SDR لطيف للأطفال والشباب - ADALM PLUTO. للأسف ، يعمل مع مجموعة من البرامج الخاصة بـ LINUX ، ولكن HDSDR المفضل لا يدعمها. بدون تفكير مرتين ، بدأت في التعامل مع هذه المشكلة وإليكم ما جاء منها:

أجهزة التناظرية يخاطب PLUTO للطلاب. جميع برامج PLUTO مفتوحة ومتاحة بحرية. يحتوي موقع الويب الخاص بالشركة على صفحة يمكنك من خلالها العثور على جميع المعلومات الضرورية تقريبًا حول تشغيل PLUTO. تتم كتابة معظم البرامج تحت Linux وينصح الطلاب باستخدام GNU Radio ، MATLAB ، إلخ.

لدي اهتمام هواة الراديو بحتة في PLUTO. إن حقوق السحب الخاصة التي تتراوح من 70 ميجا هرتز إلى 6 جيجا هرتز (بعد الإفصاح ) مقابل 150 دولار أمريكي فقط هي معجزة. كم عدد التجارب التي يمكن القيام بها! انظر كم تم دمج كل شيء هناك:



على ما يبدو ، يعتقد م أنه يجب على hams أنفسهم كتابة برامج تشغيل للبرامج الشائعة ، لذلك حتى وقت قريب ، لم يتم دعم SDR #. لكن SDR # لا يناسبني ، لأنني بحاجة إلى دعم CAT جيد في برنامج لمزامنة التردد مع جهاز إرسال / استقبال. أرغب في محاولة استخدام HDSDR كجهاز استقبال بانورامي عن طريق توصيله بالتردد الوسيط الأول لجهاز الإرسال والاستقبال. لذلك ، هناك طريقة واحدة فقط للخروج - لدمج HDSDR و PLUTO بنفسك.

باستخدام Google ، اكتشفت بسرعة أنه لحل مشكلتي ، أحتاج إلى إنشاء مكتبة ExtIO_.dll خاصة بتنسيق Winrad . تعمل هذه المكتبة كجسر برامج بين HDSDR وجهاز استقبال SDR المطلوب. لحسن الحظ ، تم توثيق واجهة المكتبة جيدًا. بالإضافة إلى ذلك ، هناك عدد غير قليل من تطبيقات المكتبة الجاهزة للعديد من أجهزة الاستقبال على جيثب: RTL_SDR ، LimeSDR ، إلخ. كان هناك مكان لمعرفة كيفية كتابة التعليمات البرمجية. المكتبة نفسها هي مدرسة قديمة للغاية ، ولا توجد تقنيات جديدة ، C89 خالص ، كما كتبوا قبل 20 عامًا. على الأقل لن تحتاج إلى تعلم لغة برمجة جديدة ، والتي ألهمت بالفعل الأمل في النجاح.

بشكل أساسي ، يجب تنفيذ ExtIO_.dll مع عشرات الوظائف التي تتيح لك تهيئة أجهزة SDR ، وبدء وإيقاف استقبال الإشارة ، وحفظ واستعادة الإعدادات المحددة. بالنسبة لي ، كانت أكثر اللحظات غير المفهومة هي تنسيق تبادل البيانات بين المستقبِل و HDSDR ، ولكن أكثر في ذلك أدناه.

الآن السؤال الذي يطرح نفسه هو كيفية التحكم في PLUTO برمجياً. هناك بالفعل العديد من خيارات التحكم. لقد وجدت اثنين على الأقل: إما مباشرة مع الشريحة من خلال مكتبة libad9361.dll ، أو من خلال مكتبة IIO . بدا الخيار الأخير أبسط وأكثر وصفًا جيدًا لي ، لذلك استقرت عليه. في هذه المكتبة ، تتوفر جميع إعدادات المعدات في شكل نوع من بنية XML ، يتم الوصول إلى عنصر فردي بواسطة الاسم النصي للممتلكات ، وهو مناسب تمامًا. يمكن الاطلاع على مزيد من التفاصيل حول المكتبة هنا . الميزة الكبيرة للمكتبة هي أنها تأتي مع أدوات مساعدة لسطر الأوامر ، والتي يمكنك دائمًا من خلالها تغيير إعدادات المستقبل المطلوبة بسرعة. وبالتالي ، لا تحتاج إلى تنفيذ جميع إعدادات SDR في واجهة HDSDR ، يمكنك الحصول على الحد الأدنى الضروري. وتحميل بعض مرشح FIR الغريب يمكن القيام به من سطر الأوامر ، إن وجد ، فهذه الحاجة تظهر. تدفقات البيانات في IIO:



تعلم كيفية التحكم في PLUTO من HDSDR برمجيًا كان سريعًا وسهلاً. لقد كان الحصول على نتيجة مرضية في تدفق البيانات أمرًا صعبًا بعض الشيء ، خاصة وأنني لم أحصل على خبرة سابقة في حقوق السحب الخاصة. هنا تحتاج إلى فهم أن البيانات تأتي من جهاز الاستقبال SDR في شكل دفق من عينات I / Q / I / Q ... I / Q. كل عينة عبارة عن عدد صحيح 16 بت غير موقّع ، منها 12 بت ذات ترتيب منخفض فقط. في الوقت نفسه ، يحتوي HDSDR على عشرة خيارات لتلقي تدفقات البيانات. أيهما أكثر ملاءمة وأفضل ليس واضحًا تمامًا بالنسبة لي. كنتيجة لذلك ، استقرت على الخيار ، والذي يسمى في ExtIO exthwUSBdata16 ، أي في الواقع واحد إلى واحد كيف مكتبة IIO يعطي البيانات.
كانت المشكلة التالية هي نقل البيانات بين IIO تلقي المخازن المؤقتة و HDSDR. يستقبل الأخير البيانات في كتل مضاعفات 512 بايت ، ولا يمكن IIO إخراج البيانات بهذا التنسيق. اضطررت إلى إجراء مخزن مؤقت وسيط ونقل الدفق عبره. يظهر رمز النقل أدناه.

DWORD WINAPI GeneratorThreadProc( __in LPVOID lpParameter ) { int16_t iqbuf[EXT_BLOCKLEN * 2]; ssize_t nbytes_rx; char *p_dat, *p_end; ptrdiff_t p_inc; int iqcnt = 0; // pointer to sample in iqbuf while ( !gbExitThread ) { nbytes_rx = iio_buffer_refill(rxbuf); p_inc = iio_buffer_step(rxbuf); p_end = (char *)iio_buffer_end(rxbuf); for (p_dat = (char *)iio_buffer_first(rxbuf, rx0_i); p_dat < p_end; p_dat += p_inc) { iqbuf[iqcnt++] = ((int16_t*)p_dat)[0]; iqbuf[iqcnt++] = ((int16_t*)p_dat)[1]; if (iqcnt == EXT_BLOCKLEN * 2) { // buffer full iqcnt = 0; pfnCallback(EXT_BLOCKLEN, 0, 0.0F, &iqbuf[0]); } } } gbExitThread = false; gbThreadRunning = false; return 0; } 

باستخدام الدورة المشار إليها ، كان من الممكن تحقيق نقل تيار قدره 4 مللي ثانية / ثانية ، وفوق هذه القيمة ، لا يتوفر للبيانات وقت لإرسال واستقبال الإشارة مع التأتأة ، على الرغم من أن الحديد يبدو أنه قادر على إرسال 20 مللي ثانية / ثانية وأعلى. زيادة أولوية مؤشر الترابط الذي يدور الحلقة إلى THREAD_PRIORITY_TIME_CRITICAL ، زاد حجم المخازن المؤقتة. لا توجد نتيجة. علاوة على ذلك ، عندما تمت زيادة المخزن المؤقت إلى 1 ميغابايت ، كان الاستقبال العادي مستحيلًا عند معدل التدفق الأدنى. أكثر هنا لا يعني أفضل. إذا كانت لديك أفكار حول كيفية زيادة السرعة ، فيرجى مشاركتها في التعليقات.

يجب أن أقول أن 4 مللي ثانية / ثانية كافية تمامًا لأغراضي ، فالفرقة تغطي أكثر من أي فرقة هيفي HF. نعم ، وعلى نطاقات الموجات المترية (VHF) والموجات الدقيقة بما يكفي لمعظم المهام ونتيجة لذلك ، تتم كتابة المكتبة ، ويبدو أن نافذة HDSDR مع PLUTO قيد التشغيل للاستقبال تبدو كما يلي:



كل رمز المكتبة متاح على جيثب هنا . لا تتردد في استخدامه لتجاربك مع ADALM PLUTO.

73 de R2AJP

Source: https://habr.com/ru/post/ar441676/


All Articles