فهرست مطالب:

مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX: 5 مرحله
مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX: 5 مرحله

تصویری: مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX: 5 مرحله

تصویری: مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX: 5 مرحله
تصویری: 😉 وقتی شوهرش سرکاره، ربات مرد تمام خواسته های زن را برآورده می کند 2024, جولای
Anonim
مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX
مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX
مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX
مبدل PPM به Joystick مبتنی بر آردوینو (JETI) برای FSX

تصمیم گرفتم فرستنده JETI DC-16 خود را از حالت 2 به حالت 1 تغییر دهم ، که اساساً دریچه گاز و آسانسور را از چپ به راست و بالعکس تغییر می دهد. از آنجا که من نمی خواستم یکی از مدلهایم را به دلیل سردرگمی چپ/راست در مغزم خراب کنم ، می پرسیدم آیا می توان کمی در FSX تمرین کرد؟

من فرستنده های JETI را که واقعاً از حالت Joystick پشتیبانی می کند ، خارج از جعبه خواندم و آزمایش کردم ، با این حال من انعطاف پذیری کامل را برای محورها و سوئیچ ها می خواهم و از TX به عنوان یک مدل واقعی استفاده می کنم. با استفاده از خروجی گیرنده ، همچنین می توانید از پردازش سیگنال در DC-16 استفاده کنید و از میکسرها ، مراحل پرواز ، نرخ دوگانه ، هر آنچه که می توانید در آنجا برنامه ریزی کنید ، استفاده کنید.

اخیراً یک آموزش خوب در مورد نحوه ساخت دستگاه ورودی USB HID ، یعنی Joystick ، از Arduino ارزان قیمت مانند Pro Micro پیدا کردم:

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

این امر همه چیز مورد نیاز برای کنترل هواپیما / هلیکوپتر / هر چیزی را در FSX فعال می کند! تعداد زیادی محور و دکمه در دسترس است.

از آنجا که من فقط یک JETI RSAT2 اضافی داشتم ، تصمیم گرفتم آن را با Arduino وصل کنم و سعی کنم یک تجزیه کننده کوچک PPM را به همراه کتابخانه Joystick پیاده سازی کنم.

فرض می کنم هرکسی این مراحل را دنبال می کند با اتصال و برنامه نویسی آردوینو آشنا است. من هیچ گونه ضمانتی برای نقص یا آسیب نمی بینم!

تدارکات

شما نیاز خواهید داشت…

  • هر آردوینویی که توسط کتابخانه Joystick پشتیبانی می شود ، من از Sparkfun Pro Micro 5V / 16 MHz استفاده کردم
  • یک نسخه جدید از Arduino IDE
  • هر گیرنده RC خروجی یک سیگنال PPM ، مانند JETI RSAT2
  • چند سیم جهنده (حداقل 3)
  • کتابخانه Joystick که در Arduino IDE نصب شده است
  • کتابخانه زمان سنج arduino:

مرحله 1: RX و Arduino را سیم کشی کنید

RX و آردوینو را سیم کشی کنید
RX و آردوینو را سیم کشی کنید
RX و آردوینو را سیم کشی کنید
RX و آردوینو را سیم کشی کنید

سیم کشی بسیار ساده است. من تصمیم گرفتم که آردوینو را فقط از USB تغذیه کنم ، زیرا از دستگاه Joystick تقلید می کند. این آردوینو را با ولتاژ 5 ولت تغذیه می کند که می تواند برای تغذیه گیرنده RC نیز مورد استفاده قرار گیرد.

من از Pin VCC ، که خروجی تنظیم شده را ارائه می دهد ، و نزدیکترین پین Gnd استفاده کردم - فقط آن را به پین + و - PPM متصل کنید. وقتی آردوینو تغذیه می شود ، گیرنده نیز روشن می شود.

برای سیگنال PPM ، تصمیم گرفتم از وقفه ها برای تجزیه آنها استفاده کنم. وقفه در دسترس است به عنوان مثال در پین 3 ، بنابراین فقط آن را وصل کنید - هیچ "پین RC بومی" در آردوینو وجود ندارد ، اما احتمالاً روشهای مختلف و متفاوتی برای خواندن سیگنال گیرنده وجود دارد.

من مجبور شدم زنگ ولتاژ RX را غیرفعال کنم ، زیرا ولتاژ VCC با منبع USB فقط در حدود 4.5 ولت خواهد بود - اما کاملاً پایدار است ، بنابراین هیچ مشکلی ندارد.

مرحله 2: دریافت برخی از سیگنال های PPM

دریافت برخی از سیگنال های PPM
دریافت برخی از سیگنال های PPM
دریافت برخی از سیگنال های PPM
دریافت برخی از سیگنال های PPM

هنگامی که گیرنده و TX روشن می شود ، من سیگنال های PPM را مانند تصویر دریافت می کنم. 16 کانال ، برای همیشه تکرار می شود. اگر Failsafe در RSAT غیرفعال باشد و فرستنده خاموش باشد ، خروجی PPM غیرفعال می شود.

اطلاعات بیشتر در مورد PPM در اینجا موجود است:

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

از آنجا که در این مورد من چیزهای واقعی پرواز نمی کنم ، من به زمان های نظری اهمیت نمی دادم و فقط در یک اسیلوسکوپ فهمیدم که گیرنده من هنگام حرکت چوب ها از چپ به راست به طور کامل چه چیزی را به طور حتم خروج می کند (تنظیمات استاندارد در TX) به به نظر می رسید -100 to مربوط به پالس هایی با طول 600 میکرو ثانیه و +100 to تا 1600 میکرو ثانیه است. من همچنین به طول پالس های مکث (400µs) در کد آردوینو خود اهمیتی نمی دهم ، اما فاصله فریم را حداقل دقیقه فرض کردم. 3000 میکرومتر

مرحله 3: پیکربندی فرستنده

پیکربندی فرستنده
پیکربندی فرستنده
پیکربندی فرستنده
پیکربندی فرستنده
پیکربندی فرستنده
پیکربندی فرستنده

از آنجا که فقط موقعیت واقعی سطوح کنترل باید مشخص شود ، یک کانال / "سروو" در هر عملکرد RC کافی است. در نتیجه ، یک تنظیم کننده فرستنده نسبتاً ساده می تواند انجام شود - شبیه به یک مدل RC معمولی. عملکردهای اصلی aileron ، آسانسور ، سکان و دریچه گاز هر کدام به ترتیب تنها به یک فرستنده سروو احتیاج دارند. من همچنین فلپ ، ترمز و چرخ دنده اضافه کردم و تا کنون 9 کانال را آزاد گذاشتم. لطفاً توجه داشته باشید که فلپ ها در مرحله پرواز قرار می گیرند و مستقیماً از طریق چوب ، لغزنده یا دکمه کنترل نمی شوند.

مرحله 4: اجرای جوی استیک

اجرای جوی استیک
اجرای جوی استیک
اجرای جوی استیک
اجرای جوی استیک

استفاده از کتابخانه Joystick بسیار آسان است و نمونه ها و آزمایش هایی را ارائه می دهد. ابتدا باید بررسی شود که آیا آردوینو به عنوان جوی استیک مناسب تشخیص داده شده است یا خیر ، دستورالعمل های موجود در بخش ورود و کتابخانه راهنمای خوبی ارائه می دهد.

در کنترل پنل Devices and Printers ، Arduino به عنوان "Sparkfun Pro Micro" نمایش داده می شد و پنجره تست جوی استیک 7 محور و تعداد زیادی دکمه پشتیبانی شده را نشان می داد. هنگام برنامه نویسی در آردوینو حتی می توان از سوئیچ کلاه استفاده کرد.

مرحله 5: کدنویسی آردوینو

کدنویسی آردوینو
کدنویسی آردوینو
کدنویسی آردوینو
کدنویسی آردوینو

آنچه هنوز وجود ندارد تجزیه واقعی سیگنال PPM و تخصیص به محورها و دکمه های Joystick است. برای نقشه برداری زیر تصمیم گرفتم:

کانال / عملکرد / تخصیص جوی استیک:

  1. دریچه گاز -> محور دریچه گاز
  2. Aileron -> X محور
  3. آسانسور -> محور Y
  4. فرمان -> محور چرخش X
  5. فلپ -> محور چرخش Y
  6. ترمز -> محور Z
  7. دنده -> دکمه 0

هنگامی که دنده پایین است ، اولین دکمه جوی استیک باید فشار داده شود و هنگام بالا بردن دنده آزاد می شود. با این حال ، این مورد نیاز به FSUIPC برای FSX دارد ، خارج از جعبه ، FSX فقط یک دکمه برای تغییر دنده را می پذیرد ، که دقیقاً همان چیزی نیست که در مورد مدل های من اتفاق می افتد.

من نسخه فعلی کد خود را با بسیاری از نظرات ارائه کردم ، که برای من بسیار خوب کار می کند - با خیال راحت وظیفه خود را تغییر دهید یا توابع جدید اضافه کنید. در حال حاضر 9 کانال RC اخیر استفاده نمی شود.

برای راه اندازی ، کلاس Joystick نیاز به راه اندازی اولیه دارد ، اساساً با تعریف محدوده های محور عددی:

/ * تنظیم محدوده محورها (تعریف شده در سرصفحه ، 0 - 1000) */

Joystick.setXAxisRange (CHANNEL_MIN ، CHANNEL_MAX) ؛ Joystick.setYAxisRange (CHANNEL_MIN ، CHANNEL_MAX) ؛ …

با استفاده از مقادیر 0 تا 1000 ، می توان طول پالس (600 - 1600µs) را مستقیماً بر روی مقادیر جوی استیک بدون تغییر مجدد ترسیم کرد.

DIN 3 به عنوان ورودی دیجیتال اولیه شده ، کشش ها فعال شده و وقفه ای متصل شده است:

pinMode (PPM_PIN ، INPUT_PULLUP) ؛

attachInterrupt (digitalPinToInterrupt (PPM_PIN) ، PPM_Pin_Changed ، CHANGE) ؛

برای اشکال زدایی ، برخی از چاپها را از طریق رابط سریال در فواصل منظم و با استفاده از کتابخانه arduino-timer اضافه کردم:

if (SERIAL_PRINT_INTERVAL> 0) {

scheduler.every (SERIAL_PRINT_INTERVAL، (void*) -> bool {SerialPrintChannels () ؛ true true؛})؛ }

هرگاه مقدار منطقی پین تغییر کند ، وقفه پین فراخوانی می شود ، بنابراین برای هر لبه در سیگنال PPM. طول نبض را فقط با زمان بندی ساده با استفاده از micros () ارزیابی کنید:

uint32_t curTime = micros ()؛

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

با ارزیابی وضعیت پین فعلی و ترکیب آن با طول پالس و پالس های گذشته ، می توان پالس های جدید را طبقه بندی کرد. شرط زیر شکاف بین فریم را تشخیص می دهد:

if (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 در نهایت شامل 16 مقدار از 0 تا 1000 است که موقعیت چوب / لغزنده و دکمه را نشان می دهد.

پس از دریافت 16 کانال ، نگاشت به Joystick انجام می شود:

/ * محورها */

Joystick.setThrottle (کانالها [0]) ؛ Joystick.setXAxis (کانالها [1]) ؛ Joystick.setYAxis (1000 - کانال [2]) ؛ Joystick.setRxAxis (کانالها [3]) ؛ Joystick.setRyAxis (کانالها [4]) ؛ Joystick.setZAxis (1000 - کانال [5]) ؛ / * buttons */ Joystick.setButton (0 ، (کانالها [6] <500؟ 1: 0)) ؛ / * به روز رسانی داده ها از طریق USB */ Joystick.sendState ()؛

من برخی از محورها را در کد معکوس کردم ، که کاملاً ضروری نیست ، زیرا محور را می توان با چرخاندن جهت سروو یا انتساب در FSX معکوس کرد. با این حال ، من تصمیم گرفتم که دستورالعمل های سروو و همچنین تخصیص اصلی FSX را حفظ کنم.

دکمه توسط کانال آستانه 7 روشن یا خاموش می شود.

و فراموش نکنید که زمانبند را علامت بزنید … در غیر این صورت ، هیچ گونه اشکال زدایی قابل مشاهده نخواهد بود.

حلقه خالی () {

scheduler.tick ()؛ }

در تصویری که پیوست کردم مشاهده می کنید ، کانال 1 از 1000 (گاز کامل) به 0 (بیکار) منتقل شد.

FSX آردوینو را مانند هر جوی استیک دیگر تشخیص می دهد ، بنابراین فقط دکمه و محورها را تعیین کنید و از بلند شدن لذت ببرید!

آنچه من واقعاً در مورد این روش دوست دارم این است که شما فقط می توانید از فرستنده خود به عنوان یک مدل واقعی استفاده کنید ، به عنوان مثال. استفاده از مراحل پرواز و غیره

توصیه شده: