مرجع المزجات

من العصي والجيروسكوب إلى ميكروثانية على السلك: الهندسة الكاملة لكل مزج قابل للاختيار — محاور الجناح، ومزج الدفة، والإلفونات، والضبط والحدود.

توثّق هذه الصفحة طبقة الخلّاط في src/lib/Ornithopter/Ornithopter.cpp ونظام الملفات في OrnithopterConfig.h. للاطلاع على البنية المحيطة، ابدأ بـ مقال البنية ؛ ولتوقيت النبض ونطاقات التريم انظر نواة السيرفو مقالاً.

وسوم وظيفة السيرفو

كل خرج من كل خلّاط هو قيمة µs تُكتب في _f[]، مفهرسة بـوسم ServoFunc. الوسوم وسيلة نقل — تقول ماذا يعني الإشارة، وليس أين تُوصَّل أبداً:

وسم الاسم المعنى
0 SF_NONE محجوز — بلا وظيفة(تبقى أولى خانات PWM فارغة لـ BOOT وI2C)
1 / 2 SF_LEFT_WING / SF_RIGHT_WING الأجنحة الخفّاقة الأمامية(نواة الموجة)
3 SF_RUDDER دفة الرأس/العرف(موجة) أو دفة الزعنفة(علبة تروس)— مزيج انعراج + لفة
4 SF_MOTOR خانق ESC بدون فرش(لنواة علبة التروس فقط)
5 / 6 SF_VTAIL_LEFT / SF_VTAIL_RIGHT أسطح ذيل V بمزيج إلفون(نواة علبة التروس)
7 SF_ELEVATOR رافعة منفصلة تقليدية(ملفات علبة التروس 6/7)
8 / 9 SF_BACK_LEFT_WING / SF_BACK_RIGHT_WING زوج الأجنحة الخلفي لهيكل رباعي الأجنحة(مرآة الزوج الأمامي، تريم خاص)

يوفّر ملف وقت التشغيل funcMap: مصفوفة تسقط فهرس مخرج PWM → ServoFunc. الخانات الثلاث الأولى(PWM 1…3) دائماً SF_NONE — تخص حزام BOOT وناقل I2C — لذا تبدأ دوال السيرفو الفعلية عند فهرس PWM 3(يوضّح تعليق البرمجية: الفهرس 3 = CH4، 4 = CH5، 5 = CH6).

ملفات المزج الثمانية

توجد ثمانية ملفات خلّاط. الملفات 0–2 تقود نواة الموجة(أجنحة خفّاقة)، والملفات 3–7 نواة علبة التروس(محرك + ذيول):

# ملف نواة سيرفو funcMap (PWM 3 · 4 · 5)
0 SERVO_2WING موجة 2 جناح أيسر · جناح أيمن · —
1 SERVO_2WING_1RUD موجة 3 جناح أيسر · جناح أيمن · دفة
2 SERVO_4WING موجة 4(الخلفي الأيمن يشارك مرآة الخلفي الأيسر) جناح أيسر · جناح أيمن · جناح خلفي أيسر
3 GEARBOX_2VTAIL_1RUD علبة تروس 3 دفة · ذيل V أيسر · ذيل V أيمن
4 GEARBOX_1MOT_2VTAIL علبة تروس 3 محرك · ذيل V أيسر · ذيل V أيمن
5 GEARBOX_1MOT_2VTAIL_1RUD علبة تروس 4(ذيل V الأيمن يشارك المرآة اليسرى) دفة · محرك · ذيل V أيسر
6 GEARBOX_1ELE_1RUD علبة تروس 2 دفة · رافعة · —
7 GEARBOX_1MOT_1ELE_1RUD علبة تروس 3 دفة · محرك · رافعة

الاختيار: علم البناء MIXER_PROFILE(القديم ORNITHOPTER_GEARBOX=1 → الملف 5)، ثم قابل للتجاوز وقت التشغيل عبر WebUI(setOrnithopterProfile). اختبار النواة ببساطة activeProfile ≥ GEARBOX_2VTAIL_1RUD.

مزج محاور الجناح (نواة الموجة)

تدخل كل قيم القنوات إلى الخلّاطات مطبَّعة: _crsfToNorm يسقط النافذة الخام 172…1811 خطياً على −1…+1. ثم تُدرَّج أوامر التوجيه بمنزلقات السلطة لكل ملف(aileronScale، elevatorScale، 0–100%) مضروبة بـ ±60°(ORNI_STEER_MAX_DEG).

هندسة مرآوية. سيرفو الجناح مركّب مرآوياً، ما يبدّل معنى الحدود المشتركة والتفاضلية. لذلك يعامل الكود الجنيح(اللفة) كـمشترك — يُضاف إلى الجناحين، فيصبح انحرافاً فيزيائياً تفاضلياً — والرافعة(الميلان) كـتفاضلي في الكود، فتصبح انحرافاً فيزيائياً مشتركاً. معادلات الزاوية، مع ORNI_NEUTRAL_ANGLE_DEG = 100° والمضاعف 2× المطبَّق على حدود الانحراف فقط:

angleLeft  = NEUTRAL + (aileron + elevator + flapCentre − degL) · 2
angleRight = NEUTRAL + (aileron − elevator − flapCentre + degR) · 2

flapping:  degL/R = amplitudeL/R · shapedWave(rawPhase, ferocityL/R, …)
glide:     degL = degR = 0 → static glide offset takes over

degL/degR هما انحرافا الضربة اللحظيان للجناح الأيسر والأيمن، كلٌّ حاصل ضرب سعته وموجة مشكَّلة بالشراسة. الرافعة لأعلى تقوّي الضربة الهابطة؛ ولأسفل الصاعدة(شراسة لا تناظرية). الانعراج يقسم الجناحين بطريقتين متكاملتين:

تُقيَّد الزوايا 0…180° وتُحوَّل إلى نبضات بالغلاف القابل للضبط servoMinUs…servoMaxUs(افتراضياً 988…2012): µs = min + الزاوية·(max−min)/180، زائد التريم لكل دالة. تدخل إزاحات مركز الانزلاق/الرفرفة(glideAngleDeg، flappingAngleDeg، ±15°) كحدود ثابتة في فرعها — لذا يمكن ضبط مركزي الانزلاق والرفرفة باستقلالية لكل ملف طيران.

مزج الدفة (النواتان معًا)

خلّاط الدفة مشترك حرفياً بين النواتين — معادلة واحدة، هيكلان:

mix  = rudderNorm · rudderYawWeight  +  aileronNorm · rudderRollWeight
mix  = clamp(mix, −1 … +1)
µs   = 1500 + mix · 500            (rudder centre ± 500 µs)
       + gyroRudderCorrection       (Zephyrus, when enabled)
       + servoTrimUs[SF_RUDDER]

الافتراضيات: rudderYawWeight = 65%، rudderRollWeight = 35%(قابلة للضبط وقت التشغيل في WebUI وتُخزَّن لكل نسخة احتياطية). اقتران اللفة على الدفة هو ما يتيح لتيروصور ثقيل الجناح الحفاظ على منعطفات منسّقة دون بهلوانيات خيط الانعراج؛ خفّض وزن اللفة إذا بدت دفة الرأس عنيفة جداً في اللفة.

مزج الذيل والإلفونات (علبة التروس)

تعمل نواة علبة التروس بلا حالة في كل نبضة. خلّاطاتها الفرعية الثلاثة:

VtailLeft  = 1500 + (aileron + elevator)·scale + rollPID + pitchPID + trimL
VtailRight = 1500 + (aileron − elevator)·scale − rollPID + pitchPID + trimR
scale = 500 µs;  both aileron/elevator sums clamped to −1…+1 first

على نواة علبة التروس، يحقن Zephyrus تصحيحات PID للفة والميلان معاً في سيرفو الذيل(اللفة عكسي الطور، الميلان مشترك الطور)، كلٌّ مقيَّد صرامة بـ ±250 µs(ZEPHYR_GEARBOX_CLAMP_US). لذلك يمكن لومضة جيروسكوب أن تهزّ سيرفو الذيل لكن لا توقفه أبداً.

حقن زيفيروس والضبط وفشل الأمان

توجد ثلاث نقاط حقن مختلفة حسب النواة والمحور:

محور نواة الموجة نواة علبة التروس
دفة / انعراج gyroRudderCorrection يُضاف إلى µs دفة العرف gyroRudderCorrection يُضاف إلى µs دفة الزعنفة
لفة(جنيح) —(أجنحة الموجة لا تحمل PID لفة) gyroAileronCorrection، عكسي الطور عبر ذيل V، مقيَّد ±250 µs
ميلان(رافعة) —(يُحقن كتعديل موجة في طبقة Zephyrus) gyroElevatorCorrection، مشترك الطور، مقيَّد ±250 µs

التريمات والحدود. لكل دالة تريم بإشارة لكل سيرفو(servoTrimUs[tag]، افتراضياً 0، ±300 µs) يُضاف أخيراً، وكل قيمة تمر عبر _clampServo — حد أمان مطلق 500…2500 µs يتفوق على كل شيء. عند الوضع الآمن أو فقدان الوصلة، تعود كل الدوال إلى 1500 µs ومحرك علبة التروس إلى الأدنى، فينزلق النموذج دائماً إلى الحياد.

مستعد للطبقة العملية؟ ضبط الموجة يعرض كيف تشعر هذه الأرقام من العصي، و البنية يعرض أين يقع كل خلّاط في خط الأنابيب.