Mündəricat:

FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə: 5 addım
FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə: 5 addım

Video: FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə: 5 addım

Video: FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə: 5 addım
Video: ARSIM - Hava Arama ve Kurtarma (ARFF) Temel ve Taktik Eğitim Simülasyonu 2024, Iyul
Anonim
FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə
FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə
FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə
FSX üçün Arduino Tabanlı (JETI) PPM -dən USB Joystick Konverterinə

JETI DC-16 ötürücümü 2-ci rejimdən 1-ci rejimə keçirməyə qərar verdim, bu da əsasən Qəza və Asansörü soldan sağa və əksinə dəyişir. Beynimdəki sol/sağ qarışıqlıq səbəbiylə modellərimdən birini çökdürmək istəmədiyim üçün FSX -də bir az məşq etməyin mümkün olub -olmadığını düşünürdüm.

JETI ötürücülərini oxudum və sınadım, əslində qutudan kənarda bir Joystick rejimini dəstəkləyirəm, ancaq baltalar və açarlar üçün tam rahatlıq istədim və TX -ni real bir modeldə olduğu kimi istifadə etdim. Alıcının çıxışını istifadə edərək, DC-16-da siqnal işlənməsindən istifadə etmək və orada proqramlaşdıra biləcəyiniz hər şeyi qarışdırıcılardan, uçuş mərhələlərindən, ikili dərəcələrdən istifadə etmək mümkündür.

Bu yaxınlarda, Pro Micro kimi ucuz bir Arduinodan bir USB HID giriş cihazının, yəni bir Joystickin necə hazırlanacağına dair gözəl bir dərs tapdım:

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

Bu, FSX -də bir təyyarəni / vertolyotu idarə etmək üçün lazım olan hər şeyi təmin edəcək! Bol boltlar və düymələr mövcuddur.

Yedək bir JETI RSAT2 -ə sahib olduğum üçün onu Arduino ilə bağlamağa və Joystick kitabxanası ilə birlikdə kiçik bir PPM ayrıştırıcısını tətbiq etməyə qərar verdim.

Düşünürəm ki, bu addımları izləyən hər kəs bir Arduino bağlamaq və proqramlaşdırmaqla tanışdır. Arızalar və ya zədələr üçün heç bir zəmanət götürməyəcəyəm!

Təchizat

Sizə lazım olacaq…

  • Joystick kitabxanası tərəfindən dəstəklənən hər hansı bir Arduino, bir Sparkfun Pro Micro 5V / 16 MHz istifadə etdim
  • Arduino IDE -nin son versiyası
  • JETI RSAT2 kimi PPM siqnalı verən hər hansı bir RC qəbuledicisi
  • bir neçə tullanan tel (min. 3)
  • Arduino IDE -də quraşdırılmış Joystick kitabxanası
  • arduino-timer kitabxanası:

Addım 1: RX və Arduino'yu bağlayın

RX və Arduino'yu bağlayın
RX və Arduino'yu bağlayın
RX və Arduino'yu bağlayın
RX və Arduino'yu bağlayın

Kablolama olduqca sadədir. Arduino -nu yalnız USB -dən gücləndirməyə qərar verdim, çünki Joystick cihazını təqlid edəcək. Bu, Arduino -ya RC qəbuledicisini gücləndirmək üçün də istifadə oluna bilən 5V təchiz edəcək.

Tənzimlənən çıxış təmin edən Pin VCC və ən yaxın Gnd pinindən istifadə etdim - yalnız PPM -in + və - pinlərinə bağlayın. Arduino güc aldıqda, alıcı da artıq güclənir.

PPM siqnalı üçün onları ayırmaq üçün fasilələrdən istifadə etmək qərarına gəldim. Fasillər mövcuddur, məsələn. Pin 3 -də, sadəcə oraya bağlayın - arduinoda "doğma RC pin" yoxdur, ancaq alıcı siqnalında oxumaq üçün daha çox və fərqli yollar var.

RX gərginliyi siqnalını söndürməli oldum, çünki USB təchizatı ilə VCC gərginliyi yalnız 4.5V ətrafında olacaq - lakin olduqca sabitdir, buna görə heç bir problem yoxdur.

Addım 2: Bəzi PPM Siqnalları Alın

Bəzi PPM Siqnallarının Alınması
Bəzi PPM Siqnallarının Alınması
Bəzi PPM Siqnallarının Alınması
Bəzi PPM Siqnallarının Alınması

Alıcı VƏ TX işə salındıqda, şəkildəki kimi PPM siqnalları alırdım. Əbədi təkrarlanan 16 kanal. RSAT üzərindəki Failsafe əlil olarsa və ötürücü sönərsə, PPM çıxışı deaktiv ediləcək.

PPM haqqında daha çox məlumat burada mövcuddur:

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

Bu vəziyyətdə həqiqi bir şey uçmadığım üçün nəzəri vaxtlara əhəmiyyət vermədim və çubuqları tam soldan tam sağa hərəkət etdirərkən qəbuledicimin nə çıxardığını osiloskopda anladım (TX -də standart parametrlər). Göründüyü kimi -100%, uzunluğu 600μs, +100% -dən 1600µs -ə qədər olan paxlalılara uyğundur. Arduino kodumdakı fasilə pulslarının (400µs) uzunluğuna da əhəmiyyət vermədim, ancaq çərçivə aralığını min dəqiqəyə qədər götürdüm. 3000µs.

Addım 3: Vericinin konfiqurasiyası

Vericinin konfiqurasiyası
Vericinin konfiqurasiyası
Vericinin konfiqurasiyası
Vericinin konfiqurasiyası
Vericinin konfiqurasiyası
Vericinin konfiqurasiyası

Yalnız idarəetmə səthlərinin həqiqi mövqeyinin bilinməsi lazım olduğundan, RC funksiyası üçün bir kanal / "servo" kifayətdir. Nəticədə, normal bir RC modelinə bənzər olduqca sadə bir ötürücü qurğusu edilə bilər. Əsas funksiyalar aileron, lift, sükan və qaz hər biri müvafiq olaraq yalnız bir servo ötürücü kanalı tələb edir. Qapaqlar, əyləclər və dişlilər əlavə etdim və bu vaxta qədər 9 kanalı boş buraxdım. Diqqət yetirin ki, Flaps uçuş mərhələsinə keçir və birbaşa çubuq, kaydırıcı və ya düymə ilə idarə olunmur.

Addım 4: Joystick -i işə salın

Joystick -i işə salmaq
Joystick -i işə salmaq
Joystick -i işə salmaq
Joystick -i işə salmaq

Joystick kitabxanasından istifadə etmək olduqca asandır və bəzi nümunələr və testlər təqdim edir. Əvvəlcə Arduinonun uyğun Joystick olaraq aşkarlandığını yoxlamaq faydalı olacaq, giriş bölməsindəki təlimatlar və kitabxananın özü yaxşı bir bələdçi verir.

Cihazlar və Yazıcılar idarəetmə panelində Arduino "Sparkfun Pro Micro", joystick test pəncərəsində isə 7 ox və çoxlu dəstəklənən düymələr göstərilirdi. Hətta şapka açarı belə Arduinoda proqramlaşdırıldıqda istifadə edilə bilər.

Addım 5: Arduino kodlaşdırma

Arduino kodlaşdırma
Arduino kodlaşdırma
Arduino kodlaşdırma
Arduino kodlaşdırma

Hələ çatışmayan şey, PPM siqnalının faktiki olaraq ayrılması və Joystick baltalarına və düymələrinə təyin edilməsidir. Aşağıdakı xəritəyə qərar verdim:

Kanal / İşlev / Joystick tapşırığı:

  1. Qaz -> Qəza oxu
  2. Aileron -> X oxu
  3. Lift -> Y oxu
  4. Sükan -> X fırlanma oxu
  5. Flaps -> Y fırlanma oxu
  6. Əyləc -> Z oxu
  7. Ötürücü -> Düymə 0

Ötürücü aşağı düşdükdə, Joystickin ilk düyməsinə basılacaq və dişli qaldırıldıqda buraxılacaq. Ancaq bunun üçün FSX üçün FSUIPC tələb olunacaq, qutudan kənarda, FSX dişliləri dəyişdirmək üçün yalnız bir düyməni qəbul edəcək, bu mənim modellərimlə tam olaraq baş vermir.

Kodun hazırkı versiyasını mənim üçün çox yaxşı işləyən bir çox şərhlə təmin etdim - tapşırığınızı dəyişdirməkdən və ya yeni funksiyalar əlavə etməkdən çəkinməyin. Son 9 RC kanalı hazırda istifadə edilmir.

Quraşdırma üçün, Joystick sinifinin, əsasən rəqəm oxları aralığını təyin edərək, işə salınması lazımdır:

/ * Balta aralığını təyin edin (başlıqda təyin olunur, 0 - 1000) */

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

0 -dan 1000 -ə qədər olan dəyərlərdən istifadə edərək, pulse uzunluğunu (600 - 1600µs) ölçüsünü dəyişmədən joystick dəyərləri ilə birbaşa müqayisə etmək mümkündür.

DIN 3 rəqəmsal giriş, çəkilmələr aktiv və kəsmə əlavə edildikdə işə salınır:

pinMode (PPM_PIN, INPUT_PULLUP);

attachInterrupt (digitalPinToInterrupt (PPM_PIN), PPM_Pin_Changed, CHANGE);

Hata ayıklama məqsədləri üçün, arduino-timer kitabxanasından istifadə edərək, müntəzəm olaraq Serial interfeysi vasitəsi ilə bəzi nəşrlər əlavə etdim:

əgər (SERIAL_PRINT_INTERVAL> 0) {

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

Pinin məntiqi dəyəri dəyişdikdə, PPM siqnalının hər kənarı üçün pin kəsilməsi çağırılacaq. Pulse uzunluğunu micros () istifadə edərək sadə bir zamanlama ilə qiymətləndirin:

uint32_t curTime = mikrosxemlər ();

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

Mövcud pinin vəziyyətini qiymətləndirərək və onu nəbz uzunluğu və keçmiş pulslarla birləşdirərək, yeni impulsları təsnif etmək olar. Aşağıdakı şərtlər çərçivələrarası boşluğu aşkar edəcək:

əgər (lastState == 0 && pulseLength> 3000 && pulseLength <6000)

Növbəti impulslar üçün, darbe uzunluğu, joystick ox aralığına uyğun olaraq darbe uzunluğunu kəsmək və əyməklə bir ox vəziyyətinə salınacaq:

uint16_t rxLength = pulseLength;

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

RxChannels dizisi, nəticədə çubuq / sürgü və düymə mövqelərini göstərən 0 - 1000 arasında 16 dəyərdən ibarətdir.

16 kanal aldıqdan sonra, Joystick -in xəritələndirilməsi aparılır:

/ * baltalar */

Joystick.setThrottle (kanallar [0]); Joystick.setXAxis (kanallar [1]); Joystick.setYAxis (1000 - kanal [2]); Joystick.setRxAxis (kanallar [3]); Joystick.setRyAxis (kanallar [4]); Joystick.setZAxis (1000 - kanal [5]); / * düymələri */ Joystick.setButton (0, (kanallar [6] <500? 1: 0)); / * məlumatları USB vasitəsilə yeniləyin */ Joystick.sendState ();

Koddakı bəzi oxları tərsinə çevirdim, bu mütləq deyil, çünki ox da servo istiqaməti və ya FSX -dəki tapşırığı çevirərək tərsinə çevrilə bilər. Ancaq servo istiqamətlərini və orijinal FSX tapşırığını saxlamağa qərar verdim.

Düymə eşik kanal 7 ilə açılır və ya söndürülür.

Planlayıcını işarələməyi unutmayın … əks halda heç bir ayıklama izi görünməyəcək.

boşluq döngəsi () {

scheduler.tick (); }

Əlavə etdiyim ekran görüntüsündə görə bilərsiniz, kanal 1 1000 -dən (tam qaz) 0 -a (boş) köçürüldü.

FSX, digər Joystick kimi Arduinonu da aşkar edəcək, buna görə düyməni və baltaları təyin edin və havaya qalxın!

Bu yanaşmanın ən çox bəyəndiyim şey, ötürücünüzü həqiqi bir modeldə olduğu kimi istifadə edə bilərsiniz, məsələn. uçuş mərhələlərindən istifadə və s.

Tövsiyə: