FSX এর জন্য Arduino ভিত্তিক (JETI) PPM থেকে USB জয়স্টিক কনভার্টার: 5 টি ধাপ
FSX এর জন্য Arduino ভিত্তিক (JETI) PPM থেকে USB জয়স্টিক কনভার্টার: 5 টি ধাপ
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- এ একটু অনুশীলন করা সম্ভব কিনা।

আমি জেইটিআই ট্রান্সমিটারগুলি পড়েছি এবং পরীক্ষা করেছি আসলে বক্সের বাইরে একটি জয়স্টিক মোড সমর্থন করে, তবে আমি অক্ষ এবং সুইচ অ্যাসাইনমেন্টগুলির জন্য সম্পূর্ণ নমনীয়তা চাই এবং একটি বাস্তব মডেলের মতো টিএক্স ব্যবহার করি। রিসিভারের আউটপুট ব্যবহার করে, ডিসি -১ in-এ সিগন্যাল প্রসেসিং ব্যবহার করা এবং মিক্সার, ফ্লাইট ফেজ, ডুয়াল রেট ব্যবহার করা সম্ভব।

সম্প্রতি আমি একটি প্রো মাইক্রোর মতো সস্তা আরডুইনো থেকে একটি ইউএসবি এইচআইডি ইনপুট ডিভাইস, যেমন একটি জয়স্টিক তৈরি করার একটি চমৎকার টিউটোরিয়াল পেয়েছি:

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

এটি একটি প্লেন / হেলিকপ্টার / FSX- তে যাই হোক না কেন সবকিছু নিয়ন্ত্রণ করতে সক্ষম হবে! অক্ষ এবং বোতাম প্রচুর পাওয়া যায়।

যেহেতু আমার কাছে মাত্র একটি অতিরিক্ত জেটিআই আরএসএটি 2 ছিল, তাই আমি এটিকে আরডুইনো দিয়ে সংযুক্ত করার সিদ্ধান্ত নিলাম এবং জয়স্টিক লাইব্রেরির সাথে একটি ছোট পিপিএম পার্সার প্রয়োগ করার চেষ্টা করব।

আমি ধরে নিচ্ছি যে এই পদক্ষেপগুলি অনুসরণ করে যে কেউ Arduino সংযোগ এবং প্রোগ্রামিংয়ের সাথে পরিচিত। আমি ত্রুটি বা ক্ষতির জন্য কোন ওয়ারেন্টি নেব না!

সরবরাহ

আপনার প্রয়োজন হবে…

  • জয়স্টিক লাইব্রেরি দ্বারা সমর্থিত কোন Arduino, আমি একটি স্পার্কফুন প্রো মাইক্রো 5V / 16 MHz ব্যবহার করেছি
  • Arduino IDE এর একটি সাম্প্রতিক সংস্করণ
  • কোন RC রিসিভার একটি PPM সিগন্যাল আউটপুট করে, যেমন JETI RSAT2
  • কয়েকটি জাম্পার তার (মিনিট 3)
  • Arduino IDE তে জয়স্টিক লাইব্রেরি ইনস্টল করা আছে
  • আরডুইনো-টাইমার লাইব্রেরি:

ধাপ 1: আরএক্স এবং আরডুইনো আপ করুন

আরএক্স এবং আরডুইনো ওয়্যার আপ করুন
আরএক্স এবং আরডুইনো ওয়্যার আপ করুন
আরএক্স এবং আরডুইনো ওয়্যার আপ করুন
আরএক্স এবং আরডুইনো ওয়্যার আপ করুন

ওয়্যারিং বেশ সহজবোধ্য। আমি কেবল ইউএসবি থেকে আরডুইনোকে পাওয়ার সিদ্ধান্ত নিয়েছি, যেহেতু এটি একটি জয়স্টিক ডিভাইসকে অনুকরণ করবে। এটি 5V দিয়ে Arduino সরবরাহ করবে, যা RC রিসিভারকে পাওয়ার জন্যও ব্যবহার করা যেতে পারে।

আমি পিন VCC ব্যবহার করেছি, যা নিয়ন্ত্রিত আউটপুট প্রদান করে, এবং নিকটতম Gnd পিন - শুধু এটি PPM এর সংযোগকারী + এবং - পিনের সাথে সংযুক্ত করুন। যখন Arduino চালিত হয়, তখন রিসিভারটিও শক্তি বাড়ায়।

পিপিএম সংকেতের জন্য, আমি তাদের বিশ্লেষণ করার জন্য বাধা ব্যবহার করার সিদ্ধান্ত নিয়েছি। বাধা পাওয়া যায় যেমন পিন 3 এ, তাই এটিকে সেখানে সংযুক্ত করুন - আরডুইনোতে কোনও "নেটিভ আরসি পিন" নেই, তবে সম্ভবত রিসিভার সিগন্যালে পড়ার আরও এবং বিভিন্ন উপায়।

আমাকে RX ভোল্টেজ অ্যালার্ম নিষ্ক্রিয় করতে হয়েছিল, যেহেতু USB সরবরাহ সহ VCC ভোল্টেজ শুধুমাত্র 4.5V এর কাছাকাছি হবে - কিন্তু বেশ স্থিতিশীল, তাই কোন সমস্যা নেই।

ধাপ 2: কিছু পিপিএম সিগন্যাল পাওয়া

কিছু পিপিএম সিগন্যাল পাওয়া
কিছু পিপিএম সিগন্যাল পাওয়া
কিছু পিপিএম সিগন্যাল পাওয়া
কিছু পিপিএম সিগন্যাল পাওয়া

যখন রিসিভার এবং TX চালিত হয়, আমি ছবিতে দেখানো মত PPM সংকেত পাচ্ছিলাম। 16 টি চ্যানেল, চিরতরে পুনরাবৃত্তি। যদি RSAT- এ Failsafe নিষ্ক্রিয় করা হয় এবং ট্রান্সমিটার চালিত হয়, PPM আউটপুট নিষ্ক্রিয় করা হবে।

পিপিএম সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে:

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

যেহেতু আমি এই ক্ষেত্রে আসল জিনিসগুলি উড়ছি না, তাই আমি তাত্ত্বিক সময়গুলির যত্ন নিইনি এবং কেবল অসিলোস্কোপে খুঁজে বের করেছি যে আমার রিসিভারটি সম্পূর্ণভাবে বাম থেকে সম্পূর্ণ ডানদিকে সরাতে গিয়ে কী করছে । মনে হচ্ছিল -100% ডালের সাথে 600µs দৈর্ঘ্যের এবং +100% থেকে 1600µ এর সাথে মিলে যায়। আমি আমার Arduino কোডে বিরতি ডাল (400µs) দৈর্ঘ্যের জন্যও যত্ন নিইনি, কিন্তু আমি মিনিটের একটি ফ্রেম স্পেসিং ধরে নিয়েছি। 3000µs।

ধাপ 3: ট্রান্সমিটার কনফিগার করা

ট্রান্সমিটার কনফিগার করা হচ্ছে
ট্রান্সমিটার কনফিগার করা হচ্ছে
ট্রান্সমিটার কনফিগার করা
ট্রান্সমিটার কনফিগার করা
ট্রান্সমিটার কনফিগার করা হচ্ছে
ট্রান্সমিটার কনফিগার করা হচ্ছে

যেহেতু নিয়ন্ত্রণ পৃষ্ঠগুলির প্রকৃত অবস্থান জানা প্রয়োজন, তাই প্রতি আরসি ফাংশনে একটি চ্যানেল / "সার্ভো" যথেষ্ট। ফলস্বরূপ, একটি সাধারণ ট্রান্সমিটার সেটআপ করা যেতে পারে - একটি সাধারণ আরসি মডেলের অনুরূপ। প্রধান ফাংশন এলিরন, লিফট, রুডার এবং থ্রোটল প্রত্যেকটির যথাক্রমে একটি পরিবাহক চ্যানেল প্রয়োজন। আমি ফ্ল্যাপ, ব্রেক এবং গিয়ার যোগ করেছি, এ পর্যন্ত 9 টি চ্যানেল মুক্ত রেখেছি। দয়া করে নোট করুন যে ফ্ল্যাপগুলি একটি ফ্লাইট পর্যায়ে রাখা হয়েছিল, এবং সরাসরি একটি লাঠি, স্লাইডার বা বোতামের মাধ্যমে নিয়ন্ত্রিত হয় না।

ধাপ 4: জয়স্টিক চালানো

জয়স্টিক চালাচ্ছে
জয়স্টিক চালাচ্ছে
জয়স্টিক চালাচ্ছে
জয়স্টিক চালাচ্ছে

জয়স্টিক লাইব্রেরি ব্যবহার করা বেশ সহজ, এবং কিছু উদাহরণ এবং পরীক্ষা প্রদান করে। Arduino যথাযথ জয়স্টিক হিসাবে সনাক্ত করা হয়েছে কিনা তা পরীক্ষা করার জন্য এটি সহায়ক হওয়া উচিত, এন্ট্রি বিভাগে সংযুক্ত নির্দেশাবলী এবং লাইব্রেরি নিজেই কিছু ভাল নির্দেশিকা প্রদান করে।

ডিভাইস এবং প্রিন্টার কন্ট্রোল প্যানেলে, আরডুইনো "স্পার্কফুন প্রো মাইক্রো" হিসাবে দেখাচ্ছিল, এবং জয়স্টিক পরীক্ষার উইন্ডোতে 7 টি অক্ষ এবং প্রচুর সমর্থিত বোতাম দেখাচ্ছিল। এমনকি আরডুইনোতে প্রোগ্রাম করার সময় একটি টুপি সুইচ ব্যবহার করা যেতে পারে।

ধাপ 5: Arduino কোডিং

Arduino কোডিং
Arduino কোডিং
Arduino কোডিং
Arduino কোডিং

যা এখনও অনুপস্থিত তা হ'ল পিপিএম সংকেতের প্রকৃত পার্সিং এবং জয়স্টিক অক্ষ এবং বোতামগুলিতে নিয়োগ। আমি নিম্নলিখিত ম্যাপিংয়ের জন্য সিদ্ধান্ত নিয়েছি:

চ্যানেল / ফাংশন / জয়স্টিক অ্যাসাইনমেন্ট:

  1. থ্রোটল -> থ্রোটল অক্ষ
  2. Aileron -> X অক্ষ
  3. লিফট -> Y অক্ষ
  4. রডার -> এক্স ঘূর্ণন অক্ষ
  5. ফ্ল্যাপ -> Y ঘূর্ণন অক্ষ
  6. ব্রেক -> জেড অক্ষ
  7. গিয়ার -> বোতাম 0

গিয়ার ডাউন হয়ে গেলে, জয়স্টিকের প্রথম বোতাম টিপতে হবে এবং গিয়ার বাড়ানোর সময় ছেড়ে দেওয়া হবে। যাইহোক, এর জন্য FSUIPC এর প্রয়োজন হবে FSX, বাক্সের বাইরে, FSX গিয়ার টগল করার জন্য শুধুমাত্র একটি বোতাম গ্রহণ করবে, যা আমার মডেলগুলির সাথে ঠিক কি ঘটছে তা নয়।

আমি কোডের আমার বর্তমান সংস্করণটি অনেক মন্তব্যের সাথে সরবরাহ করেছি, যা আমার জন্য বেশ ভালভাবে কাজ করছে - নির্দ্বিধায় আপনার নিয়োগ পরিবর্তন করুন বা নতুন ফাংশন যোগ করুন। শেষ 9 টি আরসি চ্যানেল বর্তমানে ব্যবহার করা হয় না।

সেটআপের জন্য, জয়স্টিক ক্লাস শুরু করা প্রয়োজন, মূলত সংখ্যাসূচক অক্ষ পরিসর নির্ধারণ করে:

/ * অক্ষের পরিসর সেট করুন (হেডারে সংজ্ঞায়িত, 0 - 1000) */

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

0 থেকে 1000 পর্যন্ত মান ব্যবহার করে, পালস দৈর্ঘ্য (600 - 1600µs) সরাসরি জয়স্টিক মানগুলি উদ্ধার না করেই ম্যাপ করা সম্ভব।

ডিআইএন 3 ডিজিটাল ইনপুট, পুলআপ সক্ষম এবং একটি বাধা সংযুক্ত হিসাবে শুরু করা হয়েছে:

পিনমোড (PPM_PIN, INPUT_PULLUP);

attachInterrupt (digitalPinToInterrupt (PPM_PIN), PPM_Pin_Changed, পরিবর্তন);

ডিবাগিং উদ্দেশ্যে, আমি নিয়মিত বিরতিতে সিরিয়াল ইন্টারফেসের মাধ্যমে কিছু প্রিন্টআউট যুক্ত করেছি, আরডুইনো-টাইমার লাইব্রেরি ব্যবহার করে:

যদি (SERIAL_PRINT_INTERVAL> 0) {

Scheduler.every (SERIAL_PRINT_INTERVAL, (void*) -> bool {SerialPrintChannels (); true true;}); }

যখনই পিনের লজিক্যাল মান পরিবর্তিত হবে, তখনই পিনের বিরতি বলা হবে, তাই পিপিএম সিগন্যালের প্রতিটি প্রান্তের জন্য। মাইক্রো () ব্যবহার করে কেবল সাধারণ সময় দ্বারা পালস দৈর্ঘ্য মূল্যায়ন করুন:

uint32_t curTime = মাইক্রো ();

uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalRead (PPM_PIN);

বর্তমান পিনের অবস্থা মূল্যায়ন করে এবং এটি নাড়ির দৈর্ঘ্য এবং অতীতের ডালের সাথে একত্রিত করে, নতুন ডালগুলিকে শ্রেণিবদ্ধ করা যায়। নিম্নলিখিত শর্তাধীন ইন্টারফ্রেম ফাঁক সনাক্ত করবে:

যদি (lastState == 0 && pulseLength> 3000 && pulseLength <6000)

পরবর্তী ডালগুলির জন্য, পালস দৈর্ঘ্য একটি অক্ষ অবস্থায় ম্যাপ করা হবে ক্লিপিং এবং পালস দৈর্ঘ্য পক্ষপাত করে জয়স্টিক অক্ষ পরিসরের সাথে মেলে:

uint16_t rxLength = pulseLength;

rxLength = (rxLength> 1600)? 1600: rxLength; rxLength = (rxLength <600)? 600: rxLength; rxChannels [curChannel] = rxLength - 600;

RxChannels অ্যারে অবশেষে 0 - 1000 থেকে 16 টি মান ধারণ করে, যা স্টিক / স্লাইডার এবং বোতামের অবস্থান নির্দেশ করে।

16 টি চ্যানেল পাওয়ার পর, জয়স্টিকে ম্যাপিং করা হয়:

/ * অক্ষ */

Joystick.setThrottle (চ্যানেল [0]); Joystick.setXAxis (চ্যানেল [1]); Joystick.setYAxis (1000 - চ্যানেল [2]); Joystick.setRxAxis (চ্যানেল [3]); Joystick.setRyAxis (চ্যানেল [4]); Joystick.setZAxis (1000 - চ্যানেল [5]); / * বোতাম */ Joystick.setButton (0, (চ্যানেল [6] <500? 1: 0)); / * USB */ Joystick.sendState () এর মাধ্যমে ডেটা আপডেট করুন;

আমি কোডে কিছু অক্ষ উল্টে দিয়েছি, যা একেবারে প্রয়োজনীয় নয়, যেহেতু অক্ষ অক্ষও উল্টানো যেতে পারে সার্ভো দিক নির্দেশনা বা FSX এ অ্যাসাইনমেন্ট। যাইহোক, আমি servo দিকনির্দেশনা এবং মূল FSX অ্যাসাইনমেন্ট রাখার সিদ্ধান্ত নিয়েছি।

চ্যানেল 7 থ্রেশহোল্ডিং দ্বারা বোতামটি চালু বা বন্ধ করা হয়।

এবং সময়সূচীতে টিক দিতে ভুলবেন না … অন্যথায়, কোন ডিবাগ প্রিন্ট দৃশ্যমান হবে না।

অকার্যকর লুপ () {

Scheduler.tick (); }

আমি সংযুক্ত স্ক্রিনশটে আপনি দেখতে পাচ্ছেন, চ্যানেল 1 1000 (পূর্ণ থ্রোটল) থেকে 0 (নিষ্ক্রিয়) এ সরানো হয়েছে।

এফএসএক্স অন্য যেকোন জয়স্টিকের মতোই আরডুইনো সনাক্ত করবে, তাই কেবল বোতাম এবং অক্ষগুলি বরাদ্দ করুন এবং মজা নিন!

এই পদ্ধতির বিষয়ে আমি যা সত্যিই পছন্দ করি তা হল, আপনি আপনার ট্রান্সমিটারটি একটি বাস্তব মডেলের মতো ব্যবহার করতে পারেন, যেমন ফ্লাইট পর্যায় ইত্যাদি ব্যবহার করে

প্রস্তাবিত: