मिक्सर संदर्भ

स्टिक और जायरो से तार पर µs तक: हर चयन योग्य मिक्सर की पूर्ण ज्यामिति — पंख अक्ष, रडर मिश्रण, एलेवॉन, ट्रिम और क्लैम्प।

यह पृष्ठ src/lib/Ornithopter/Ornithopter.cpp की मिक्सर परत और OrnithopterConfig.h की प्रोफ़ाइल प्रणाली का दस्तावेज़ है। आसपास की वास्तुकला के लिए, आर्किटेक्चर लेख ; पल्स टाइमिंग और ट्रिम रेंज के लिए देखें सर्वो कर्नेल लेख देखें।

सर्वो फ़ंक्शन टैग

हर मिक्सर का हर आउटपुट _f[] में लिखा गया µs मान है, जो 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 4-विंग एयरफ़्रेम का पिछला पंख जोड़ा(सामने के जोड़े का दर्पण, अपना ट्रिम)

एक रनटाइम प्रोफ़ाइल 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) पर हार्ड-क्लैम्प। इसलिए जायरो गड़बड़ी टेल सर्वो को हिला सकती है पर कभी रोक नहीं सकती।

ज़ेफ़िरोस इंजेक्शन, ट्रिम और फ़ेलसेफ़

कर्नेल और अक्ष के आधार पर तीन अलग इंजेक्शन बिंदु हैं:

अक्ष वेवफ़ॉर्म कर्नेल गियरबॉक्स कर्नेल
रडर / यॉ क्रेस्ट रडर µs में gyroRudderCorrection जोड़ा गया फ़िन रडर µs में gyroRudderCorrection जोड़ा गया
रोल(एलेरॉन) —(वेवफ़ॉर्म पंख कोई रोल PID नहीं रखते) gyroAileronCorrection, V-टेल पर प्रति-फ़ेज़, ±250 µs क्लैम्प
पिच(एलेवेटर) —(Zephyrus परत में वेव मॉड्यूलेशन के रूप में इंजेक्ट) gyroElevatorCorrection, कॉमन-मोड, ±250 µs क्लैम्प

ट्रिम और सीमाएँ। हर फ़ंक्शन में एक चिह्नित प्रति-सर्वो ट्रिम(servoTrimUs[tag], डिफ़ॉल्ट 0, ±300 µs) अंत में जुड़ता है, और हर मान _clampServo — सब पर भारी एक निरपेक्ष 500…2500 µs सुरक्षा क्लैम्प — से गुज़रता है। फेलसेफ़ या लिंक-डाउन पर सभी फ़ंक्शन 1500 µs पर और गियरबॉक्स मोटर न्यूनतम पर लौट आते हैं, इसलिए मॉडल हमेशा न्यूट्रल पर ग्लाइड करता है।

व्यावहारिक परत के लिए तैयार? वेवफ़ॉर्म ट्यूनिंग ट्यूटोरियल दिखाता है कि ये संख्याएँ स्टिक से कैसी लगती हैं, और आर्किटेक्चर लेख दिखाता है कि हर मिक्सर पाइपलाइन में कहाँ बैठता है।