मिक्सर संदर्भ
स्टिक और जायरो से तार पर µ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 बाएँ और दाएँ पंख के तात्कालिक स्ट्रोक विक्षेप हैं, प्रत्येक अपने आयाम और उग्रता-आकारित तरंग का गुणनफल। एलेवेटर ऊपर डाउनस्ट्रोक को, नीचे अपस्ट्रोक को मज़बूत करता है(असममित उग्रता)। यॉ पंखों को दो पूरक तरीकों से बाँटता है:
- उग्रता अंतर(
rudderFerocityRange): बाएँ को+उग्रता, दाएँ को−उग्रता— दोनों पंख अलग-अलग ड्वेल करते हैं पर साझा रिवर्सल फ़ेज़(limiarShared) रखते हैं, इसलिए मोड़ शुद्ध रोल टॉर्क होते हैं, कभी अतुल्यकालिक नहीं। - आयाम अंतर(
rudderAmplitudeDifferential): बायाँ आयाम ×(1+Δ), दायाँ ×(1−Δ) — थ्रॉटल-सेट स्ट्रोक के चारों ओर सममित विचलन।
कोण 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 में रनटाइम-ट्यूनेबल, प्रति बैकअप संग्रहित)। रडर पर रोल युग्मन ही भारी-पंख वाले टेरोसॉर को बिना यॉ-स्ट्रिंग कसरत के समन्वित मोड़ बनाए रखने देता है; यदि हेड रडर रोल में बहुत आक्रामक लगे तो रोल भार घटाएँ।
गियरबॉक्स पूँछ और एलेवॉन मिक्सिंग
गियरबॉक्स कर्नेल हर टिक स्टेटलेस चलता है। इसके तीन उप-मिक्सर:
- मोटर —
SF_MOTOR: आर्म होने पर थ्रॉटल 0…1 से 1000…2000 µs में मैप; डिसआर्म या लिंक-डाउन पर न्यूनतम बल(मोटर रुकी)। - रडर — ऊपर के खंड के समान समीकरण।
- टेल — दो परिवार। क्लासिक प्रोफ़ाइल(6/7) अलग एलेवेटर चलाती हैं:
µs = 1500 + elevatorNorm·500 + pitchPID + trim। V-टेल प्रोफ़ाइल(3/4/5) दोनों चैनलों को दो टेल सर्वो पर एलेवॉन-मिक्स करती हैं:
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 पर और गियरबॉक्स मोटर न्यूनतम पर लौट आते हैं, इसलिए मॉडल हमेशा न्यूट्रल पर ग्लाइड करता है।
व्यावहारिक परत के लिए तैयार? वेवफ़ॉर्म ट्यूनिंग ट्यूटोरियल दिखाता है कि ये संख्याएँ स्टिक से कैसी लगती हैं, और आर्किटेक्चर लेख दिखाता है कि हर मिक्सर पाइपलाइन में कहाँ बैठता है।