البنية: النوى وتدفق البيانات

كيف يتحول تيار CRSF إلى خفقان أجنحة وذيل: حدود الوحدات، نواتا المزج، وآلة الحالات التي تُبقي التيروصور حيًا عند انقطاع الربط.

مسار الإشارة

PteronautOS هو تفرّع من ExpressLRS 4.x استبدل ذيل «تمرير PWM» في المستقبِل بطبقة مخصّصة للتحكم بالطيران. مسار البيانات قصير عمداً:

CRSF radio link
  │  2.4 GHz SX1280
  ▼
rx_main / CRSF decoder        → ChannelData[]  (raw 172…1811 µs-window values)
  ▼
Ornithopter::update()          → _readChannels() → voice* fields
  ▼  kernel select: activeProfile ≥ GEARBOX_2VTAIL_1RUD ?
_computeServoMixer()   OR   _computeGearboxMixer()
  ▼
_f[]  (indexed by ServoFunc tag, µs)
  ▼
PWM output stage               → funcMap channels → wing / rudder / motor servos

أربع أفكار بنيوية تُبقي الوحش مستقراً والكود صغيراً:

  1. تُطبَّع القنوات مبكراً. كل قيمة خام في نافذة CRSF 172–1811 تُسقَط مرة واحدة على −1…+1(_crsfToNorm) أو على نسبة مئوية، ولا يتدفق عبر الخلّاطات إلا تلك الوحدة — بلا ثوابت سحرية متكررة.
  2. المخرجات موسومة لا مثبّتة. تكتب الخلّاطات في _f[ServoFunc]. أي مخرج PWM فيزيائي يقوده الوسم يتقرر لاحقاً عبر funcMap الخاص بالملف — انظر مرجع الخلّاطات .إعادة تثبيت نموذج لا تمسّ أبداً رياضيات الخلّاط.
  3. النواة عائلة وقت الترجمة، واختيار وقت التشغيل. كلٌّ من الخفّاق الموجي ومتحكم علبة التروس يعيش في الملف الثنائي؛ الملف النشط يختار النواة في كل نبضة تحديث.
  4. الوضع الآمن ليس حدثاً بل حالة. انقطاع الوصلة ووضع المنضدة وتجاوز العصا هي بوابات صريحة في update()، فلا تفلت السيرفو أبداً بينما الراديو صامت.

نواتان: الموجة وعلبة التروس

النواة هي الكتلة التي تحوّل القنوات المطبَّعة إلى µs لدوال السيرفو. لدى PteronautOS عائلتان، يُفرَّق بينهما برقم ملف الخلّاط:

العائلة الملفات المشغّلات نموذج أصلي
نواة الموجة (سيرفو) 0 SERVO_2WING · 1 SERVO_2WING_1RUD · 2 SERVO_4WING سيرفو الجناح الخفّاق (2–4)، دفة العرف أورنيثوبتر سيرفو مباشر — PteronautOS الكلاسيكي
نواة علبة التروس 3 GEARBOX_2VTAIL_1RUD · 4 GEARBOX_1MOT_2VTAIL · 5 GEARBOX_1MOT_2VTAIL_1RUD · 6 GEARBOX_1ELE_1RUD · 7 GEARBOX_1MOT_1ELE_1RUD محرك ESC، ذيل V أو رافعة + دفة خفّاق مُسنَّن / بمحرك مع أسطح ذيل تقليدية

يتم الاختيار في update() باختبار واحد PROFILE_IS_GEARBOX(activeProfile ≥ 3). الملف نفسه قيمة وقت تشغيل: يبدأ من علم البناء MIXER_PROFILE(القديم ORNITHOPTER_GEARBOX=1 لا يزال يُسقَط على الملف 5) لكن يمكن تبديله مباشرة من WebUI عبر setOrnithopterProfile() — تعيد البرمجية الثابتة استهداف هيكل جديد دون إعادة وميض. هناك ثمانية ملفات إجمالاً؛ تخطيطات funcMap الدقيقة مُجدوَلة في مرجع الخلّاطات.

نواة الموجة (خفقان بمحركات السيرفو)

نواة الموجة هي ما يعنيه معظم الناس بـ«PteronautOS»: سيرفوان للجناح ينفّذان تذبذباً متصل الطور يُنحَت شكله كل دورة. تشريحها:

نواة علبة التروس (محرك + أذناب)

تستبدل نواة علبة التروس رفرفة الجناح الخالصة بمجموعة دفع بمحرك مع أسطح ذيل تقليدية. ولأن المحرك يدور باستمرار، فهذه النواة بلا حالة في كل نبضة — بلا مذبذب — وبدلاً من ذلك:

يمكن لجهاز أورنيثوبتر واحد أن يحمل الشخصيتين معاً: إطلاق خفّاق بنواة الموجة، وإبحار بعلبة التروس — تبديل الملف وقت التشغيل هو ذلك السطر الواحد في update().

الحالات: الربط والمقعد وفشل الأمان

يُستدعى update() بإيقاع ثابت ~10 ms من حلقة WiFi/السيرفو ويبوّب على ثلاثة أعلام قبل تشغيل أي خلّاط:

الحالة الشرط السلوك
طيران عادي linkUp + قناة التسليح حيّة خرج النواة الكامل يتبع العصي
وضع المنضدة / اللوحة benchMode(لوحة WebUI، بلا وصلة RC) تُحقَن عصي محايدة ويُوقف الخانق دون عتبة الرفرفة — تعديلات الانزلاق + التريم مرئية مباشرة
تجاوز العصا stickOverride(قنوات افتراضية) قيم القنوات المحقونة من البرمجية الثابتة تحل محل CRSF كلياً(مسح السيرفو، اختبارات)
الوضع الآمن فُقدت الوصلة(onLinkDown / enterFailsafe) تتوسّط كل الدوال إلى 1500 µs، ويُعاد ضبط المذبذب، والمحرك → أدنى؛ وفقدان حزم CRSF يتوسّط أيضاً على مستوى RX

سلوك التوسيط عند الفقد مكرَّر عمداً في طبقتين: حزمة CRSF تؤمّن بيانات القنوات، وطبقة Ornithopter تؤمّن الهندسة(بما فيها حالة التذبذب). لذلك يترك راديو ميت هيكلاً منزلقاً قابلاً للتحكم — وليس هيكلاً متخبّطاً أبداً.

خريطة المصدر

الوحدة المسار المسؤولية
طبقة Ornithopter src/lib/Ornithopter/ اختيار النواة، رياضيات الخلّاط، مذبذب الموجة، الملفات، التريم
ملفات الطيران والثوابت src/lib/Ornithopter/OrnithopterConfig.h تعداد MixerProfile ووسوم ServoFunc وfuncMap وكل القيم الافتراضية الرقمية
المذبذب / الشكل src/lib/Ornithopter/OrnithopterWaveform.h تكامل الطور وتشكيل الشراسة ومنطق الانعكاس
Zephyrus(اختياري) src/lib/Zephyrus/ MPU6050 + Mahony AHRS وPID مزدوج وتصحيح العرف/الذيل
مرحلة إخراج PWM src/lib/ServoOutput/devServoOutput.cpp يكتب µs متزامنة مع نبضة CRSF
إعداد WebUI src/lib/WIFI/devWIFI.cpp ملف وقت التشغيل + استمرار الضبط(/pteronautos)

الطبقة الأدنى — أي شكل موجة تنتجه الأرقام بالضبط، وكيف يوصّل كل ملف الدوال بمخارج PWM — تعيش في مرجع الخلّاطات ، ويُوثَّق غلاف توقيت السيرفو في مقال نواة السيرفو مقالاً.