विषयसूची:

FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर: 5 चरण
FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर: 5 चरण

वीडियो: FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर: 5 चरण

वीडियो: FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर: 5 चरण
वीडियो: How to make cheap Drone using Arduino Uno, MPU 6050 & Flysky i6 TX/RX 2024, जुलाई
Anonim
FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर
FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर
FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर
FSX के लिए Arduino आधारित (JETI) PPM से USB जॉयस्टिक कनवर्टर

मैंने अपने JETI DC-16 ट्रांसमीटर को मोड 2 से मोड 1 में स्विच करने का निर्णय लिया, जो मूल रूप से थ्रॉटल और लिफ्ट को बाएं से दाएं और इसके विपरीत स्विच करता है। चूँकि मैं अपने मस्तिष्क में कुछ बाएँ/दाएँ भ्रम के कारण अपने एक मॉडल को क्रैश नहीं करना चाहता था, मैं सोच रहा था कि क्या FSX में थोड़ा अभ्यास करना संभव है।

मैंने पढ़ा और परीक्षण किया कि जेईटीआई ट्रांसमीटर वास्तव में बॉक्स से बाहर जॉयस्टिक मोड का समर्थन करते हैं, हालांकि मैं कुल्हाड़ियों और स्विच असाइनमेंट के लिए पूर्ण लचीलापन चाहता था और वास्तविक मॉडल के साथ TX का उपयोग करता था। रिसीवर के आउटपुट का उपयोग करके, डीसी -16 में सिग्नल प्रोसेसिंग का लाभ उठाना और मिक्सर, उड़ान चरणों, दोहरी दरों का उपयोग करना संभव है, जो भी आप वहां प्रोग्राम कर सकते हैं।

हाल ही में मुझे एक प्रो माइक्रो जैसे सस्ते Arduino से USB HID इनपुट डिवाइस बनाने का एक अच्छा ट्यूटोरियल मिला, जिसका नाम जॉयस्टिक है:

www.instructables.com/id/Create-a-Joystick…

यह एक विमान/हेलीकॉप्टर/जो कुछ भी FSX में नियंत्रित करने के लिए आवश्यक सब कुछ सक्षम करेगा! बहुत सारे कुल्हाड़ी और बटन उपलब्ध हैं।

चूँकि मेरे पास बस एक अतिरिक्त JETI RSAT2 था, मैंने इसे Arduino के साथ तार-तार करने का निर्णय लिया और जॉयस्टिक लाइब्रेरी के साथ एक छोटा PPM पार्सर लागू करने का प्रयास किया।

मैं मान रहा हूं कि इन चरणों का पालन करने वाला कोई भी व्यक्ति Arduino को जोड़ने और प्रोग्रामिंग करने से परिचित है। मैं खराबी या क्षति के लिए कोई वारंटी नहीं लूंगा!

आपूर्ति

आपको चाहिये होगा…

  • जॉयस्टिक लाइब्रेरी द्वारा समर्थित कोई भी Arduino, मैंने स्पार्कफुन प्रो माइक्रो 5V / 16 मेगाहर्ट्ज का उपयोग किया
  • Arduino IDE का नवीनतम संस्करण
  • कोई भी RC रिसीवर PPM सिग्नल आउटपुट करता है, जैसे JETI RSAT2
  • कुछ जम्पर तार (मिनट 3)
  • Arduino IDE में स्थापित जॉयस्टिक लाइब्रेरी
  • आर्डिनो-टाइमर लाइब्रेरी:

चरण 1: RX और Arduino को तार दें

RX और Arduino को वायर अप करें
RX और Arduino को वायर अप करें
RX और Arduino को वायर अप करें
RX और Arduino को वायर अप करें

वायरिंग काफी सीधी है। मैंने केवल USB से Arduino को पावर देने का निर्णय लिया, क्योंकि यह जॉयस्टिक डिवाइस का अनुकरण करेगा। यह 5V के साथ Arduino की आपूर्ति करेगा, जिसका उपयोग RC रिसीवर को पावर देने के लिए भी किया जा सकता है।

मैंने पिन वीसीसी का उपयोग किया, जो विनियमित आउटपुट प्रदान करता है, और निकटतम जीएनडी पिन - बस इसे पीपीएम के कनेक्टर + और - पिन से कनेक्ट करें। जब Arduino संचालित हो जाता है, तो रिसीवर अब भी शक्ति प्रदान कर रहा है।

पीपीएम सिग्नल के लिए, मैंने उन्हें पार्स करने के लिए इंटरप्ट का उपयोग करने का निर्णय लिया। व्यवधान उपलब्ध हैं उदा। पिन 3 पर, तो बस इसे वहां कनेक्ट करें - आर्डिनो पर कोई "देशी आरसी पिन" नहीं है, लेकिन संभवतः रिसीवर सिग्नल में पढ़ने के अधिक और अलग-अलग तरीके हैं।

मुझे आरएक्स वोल्टेज अलार्म को अक्षम करना पड़ा, क्योंकि यूएसबी आपूर्ति के साथ वीसीसी वोल्टेज केवल 4.5V के आसपास होगा - लेकिन काफी स्थिर, इसलिए कोई समस्या नहीं है।

चरण 2: कुछ पीपीएम सिग्नल प्राप्त करना

कुछ पीपीएम सिग्नल प्राप्त करना
कुछ पीपीएम सिग्नल प्राप्त करना
कुछ पीपीएम सिग्नल प्राप्त करना
कुछ पीपीएम सिग्नल प्राप्त करना

जब रिसीवर और TX संचालित होता है, तो मुझे पीपीएम सिग्नल मिल रहे थे जैसे कि छवि में दिखाया गया है। 16 चैनल, हमेशा के लिए दोहराए गए। यदि RSAT पर Failsafe अक्षम है और ट्रांसमीटर बंद है, तो PPM आउटपुट अक्षम हो जाएगा।

पीपीएम पर अधिक जानकारी यहां उपलब्ध है:

  • https://en.wikipedia.org/wiki/Pulse-position_modul…
  • https://wiki.rc-network.de/index.php/PPM

चूंकि मैं इस मामले में वास्तविक सामान नहीं उड़ा रहा हूं, इसलिए मैंने सैद्धांतिक समय की परवाह नहीं की और सिर्फ आस्टसीलस्कप पर पता लगाया कि स्टिक्स को पूरी तरह से बाएं से पूरी तरह से दाएं (TX में मानक सेटिंग्स) ले जाने पर मेरा रिसीवर क्या आउटपुट कर रहा था।. ऐसा लग रहा था -100% दालों से मेल खाती है जिनकी लंबाई 600µs, और +100% से 1600µs तक होती है। मैंने अपने Arduino कोड में पॉज़ पल्स (400µs) की लंबाई की भी परवाह नहीं की, लेकिन मैंने मिनट की एक फ्रेम रिक्ति मान ली। 3000μs।

चरण 3: ट्रांसमीटर को कॉन्फ़िगर करना

ट्रांसमीटर को कॉन्फ़िगर करना
ट्रांसमीटर को कॉन्फ़िगर करना
ट्रांसमीटर को कॉन्फ़िगर करना
ट्रांसमीटर को कॉन्फ़िगर करना
ट्रांसमीटर को कॉन्फ़िगर करना
ट्रांसमीटर को कॉन्फ़िगर करना

चूंकि केवल नियंत्रण सतहों की वास्तविक स्थिति को जानने की जरूरत है, प्रति आरसी फ़ंक्शन एक चैनल / "सर्वो" पर्याप्त है। नतीजतन, एक सामान्य आरसी मॉडल के समान एक साधारण ट्रांसमीटर सेटअप बनाया जा सकता है। मुख्य कार्य एलेरॉन, एलेवेटर, रडर और थ्रॉटल प्रत्येक को क्रमशः ट्रांसमीटर चैनल केवल एक सर्वो की आवश्यकता होती है। मैंने फ्लैप, ब्रेक और गियर भी जोड़े, जिससे अब तक 9 चैनल फ्री हो गए हैं। कृपया ध्यान दें कि फ्लैप एक उड़ान चरण पर लगाए गए थे, और सीधे छड़ी, स्लाइडर या बटन के माध्यम से नियंत्रित नहीं होते हैं।

चरण 4: जॉयस्टिक चलाना

जॉयस्टिक चलाना
जॉयस्टिक चलाना
जॉयस्टिक चलाना
जॉयस्टिक चलाना

जॉयस्टिक पुस्तकालय का उपयोग करना काफी आसान है, और कुछ उदाहरण और परीक्षण प्रदान करता है। पहले यह जांचना मददगार होना चाहिए कि क्या Arduino को उचित जॉयस्टिक के रूप में पाया गया है, प्रवेश अनुभाग में जुड़े निर्देश और पुस्तकालय स्वयं कुछ अच्छा मार्गदर्शन प्रदान करते हैं।

उपकरण और प्रिंटर नियंत्रण कक्ष में, Arduino "Sparkfun Pro Micro" के रूप में दिखाई दे रहा था, और जॉयस्टिक परीक्षण विंडो 7 अक्ष और बहुत सारे समर्थित बटन दिखा रहा था। Arduino में प्रोग्राम किए जाने पर भी एक हैट स्विच का उपयोग किया जा सकता है।

चरण 5: Arduino को कोड करना

Arduino कोडिंग
Arduino कोडिंग
Arduino कोडिंग
Arduino कोडिंग

जो अभी भी गायब है वह है पीपीएम सिग्नल की वास्तविक पार्सिंग और जॉयस्टिक कुल्हाड़ियों और बटनों को असाइनमेंट। मैंने निम्नलिखित मानचित्रण के लिए निर्णय लिया:

चैनल / फंक्शन / जॉयस्टिक असाइनमेंट:

  1. थ्रॉटल -> थ्रॉटल एक्सिस
  2. ऐलेरॉन -> एक्स अक्ष
  3. लिफ्ट -> वाई अक्ष
  4. पतवार -> एक्स रोटेशन अक्ष
  5. फ्लैप -> वाई रोटेशन अक्ष
  6. ब्रेक -> जेड अक्ष
  7. गियर -> बटन 0

जब गियर नीचे हो, तो जॉयस्टिक का पहला बटन दबाया जाएगा और गियर को ऊपर उठाते समय छोड़ा जाएगा। हालाँकि, इसके लिए FSX के लिए FSUIPC की आवश्यकता होगी, बॉक्स के बाहर, FSX गियर को चालू करने के लिए केवल एक बटन को स्वीकार करेगा, जो कि मेरे मॉडलों के साथ बिल्कुल नहीं हो रहा है।

मैंने कोड का अपना वर्तमान संस्करण बहुत सारी टिप्पणियों के साथ प्रदान किया है, जो मेरे लिए काफी अच्छा काम कर रहा है - बेझिझक अपना असाइनमेंट बदलें या नए फ़ंक्शन जोड़ें। अंतिम 9 RC चैनल वर्तमान में उपयोग नहीं किए जाते हैं।

सेटअप के लिए, जॉयस्टिक वर्ग को प्रारंभ करने की आवश्यकता है, मूल रूप से संख्यात्मक अक्ष श्रेणियों को परिभाषित करके:

/* सेट एक्सिस रेंज (हेडर में परिभाषित, 0 - 1000) */

Joystick.setXAxisRange(CHANNEL_MIN, CHANNEL_MAX); Joystick.setYAxisRange(CHANNEL_MIN, CHANNEL_MAX); …

0 से 1000 तक के मानों का उपयोग करके, पल्स लंबाई (600 - 1600μs) को जॉयस्टिक मानों में बिना रीस्केलिंग के सीधे मैप करना संभव है।

DIN 3 को डिजिटल इनपुट, पुलअप सक्षम, और एक इंटरप्ट संलग्न के रूप में प्रारंभ किया गया है:

पिनमोड (PPM_PIN, INPUT_PULLUP);

अटैचइंटरप्ट (डिजिटलपिनटोइंटरप्ट (पीपीएम_पिन), पीपीएम_पिन_चेंज, चेंज);

डिबगिंग उद्देश्यों के लिए, मैंने arduino-timer लाइब्रेरी का उपयोग करते हुए, नियमित अंतराल में सीरियल इंटरफ़ेस के माध्यम से कुछ प्रिंटआउट जोड़े:

अगर (SERIAL_PRINT_INTERVAL > 0) {

शेड्यूलर.हर (SERIAL_PRINT_INTERVAL, (void*) -> बूल {SerialPrintChannels(); रिटर्न ट्रू; }); }

जब भी पिन का तार्किक मान बदलेगा, तो पिन इंटरप्ट को कॉल किया जाएगा, इसलिए पीपीएम सिग्नल में प्रत्येक किनारे के लिए। माइक्रो () का उपयोग करके साधारण समय से नाड़ी की लंबाई का मूल्यांकन करें:

uint32_t curTime = माइक्रो ();

uint32_t पल्सलेंथ = कर्टटाइम - एजटाइम; uint8_t curState = digitalRead (PPM_PIN);

वर्तमान पिन की स्थिति का मूल्यांकन करके और इसे नाड़ी की लंबाई और पिछले दालों के साथ जोड़कर, नई दालों को वर्गीकृत किया जा सकता है। निम्नलिखित सशर्त इंटरफ्रेम अंतर का पता लगाएगा:

अगर (अंतिम स्थिति == 0 && पल्सलेंथ> 3000 && पल्सलेंथ <6000)

बाद की दालों के लिए, पल्स लंबाई को जॉयस्टिक अक्ष सीमा से मेल खाने के लिए पल्स लंबाई को क्लिपिंग और बायस करके अक्ष स्थिति में मैप किया जाएगा:

uint16_t rxLength = पल्सलेंथ;

rxLength = (rxLength > १६००) ? १६००: rxLength; rxLength = (rxLength <600)? 600: rxLength; rxChannels[curChannel] = rxLength - ६००;

rxChannels सरणी में अंततः 0 - 1000 से 16 मान होते हैं, जो स्टिक / स्लाइडर और बटन की स्थिति को दर्शाता है।

16 चैनल प्राप्त करने के बाद, जॉयस्टिक की मैपिंग की जाती है:

/* कुल्हाड़ियों */

जॉयस्टिक.सेट थ्रॉटल (चैनल [0]); जॉयस्टिक.सेटएक्सएक्सिस (चैनल [1]); Joystick.setYAxis(1000 - चैनल[2]); Joystick.setRxAxis (चैनल [3]); Joystick.setRyAxis (चैनल [4]); Joystick.setZAxis(1000 - चैनल[5]); /* बटन */ जॉयस्टिक.सेटबटन (0, (चैनल [6] <500? 1: 0)); /* USB के माध्यम से डेटा अपडेट करें */ Joystick.sendState();

मैंने कोड में कुछ कुल्हाड़ियों को उल्टा कर दिया, जो कि बिल्कुल आवश्यक नहीं है, क्योंकि धुरी को सर्वो दिशा या FSX में असाइनमेंट को फ़्लिप करके भी उलटा किया जा सकता है। हालाँकि, मैंने सर्वो निर्देश और मूल FSX असाइनमेंट रखने का निर्णय लिया।

थ्रेसहोल्डिंग चैनल 7 द्वारा बटन को चालू या बंद किया जाता है।

और शेड्यूलर पर टिक करना न भूलें…अन्यथा, कोई डिबग प्रिंट दिखाई नहीं देगा।

शून्य लूप () {

अनुसूचक.टिक (); }

मैंने जो स्क्रीनशॉट संलग्न किया है उसमें आप देख सकते हैं, चैनल 1 को 1000 (पूर्ण गला घोंटना) से 0 (निष्क्रिय) में ले जाया गया था।

FSX किसी भी अन्य जॉयस्टिक की तरह ही Arduino का पता लगाएगा, इसलिए बस बटन और कुल्हाड़ियों को असाइन करें और आनंद लें!

इस दृष्टिकोण के बारे में मुझे वास्तव में क्या पसंद है, आप अपने ट्रांसमीटर का उपयोग वास्तविक मॉडल के रूप में कर सकते हैं, उदा। उड़ान चरणों आदि का उपयोग करना।

सिफारिश की: