İçindekiler:

FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü: 5 Adım
FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü: 5 Adım

Video: FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü: 5 Adım

Video: FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü: 5 Adım
Video: ARSIM - Hava Arama ve Kurtarma (ARFF) Temel ve Taktik Eğitim Simülasyonu 2024, Temmuz
Anonim
FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü
FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü
FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü
FSX için Arduino Tabanlı (JETI) PPM - USB Joystick Dönüştürücü

JETI DC-16 vericimi Mod 2'den Mod 1'e geçirmeye karar verdim, bu da temelde Gaz Kelebeği ve Asansörü soldan sağa ve tam tersi şekilde değiştirir. Beynimdeki bazı sol/sağ karışıklığı nedeniyle modellerimden birini çökertmek istemediğimden, FSX'te biraz pratik yapmanın mümkün olup olmadığını merak ediyordum.

JETI vericilerinin kutudan çıktığı haliyle bir Joystick modunu desteklediğini okudum ve test ettim, ancak eksenler ve anahtar atamaları için tam esneklik istedim ve TX'i gerçek bir modelde olduğu gibi kullanmak istedim. Alıcının çıkışını kullanarak, DC-16'daki sinyal işlemeden yararlanmak ve orada programlayabileceğiniz her şeyi mikserler, uçuş fazları, çift oranlar kullanmak da mümkündür.

Son zamanlarda Pro Micro gibi ucuz bir Arduino'dan bir USB HID giriş cihazının, yani bir Joystick'in nasıl yapılacağına dair güzel bir eğitim buldum:

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

Bu, bir uçağı / helikopteri / FSX'teki her şeyi kontrol etmek için gereken her şeyi sağlayacaktır! Çok sayıda eksen ve düğme mevcuttur.

Az önce yedek bir JETI RSAT2'ye sahip olduğum için, onu Arduino ile bağlamaya karar verdim ve Joystick kitaplığı ile birlikte küçük bir PPM ayrıştırıcısı uygulamaya çalıştım.

Bu adımları izleyen herkesin bir Arduino'yu bağlamaya ve programlamaya aşina olduğunu varsayıyorum. Arızalar veya hasarlar için herhangi bir garanti almayacağım!

Gereçler

İhtiyacın olacak…

  • Joystick kitaplığı tarafından desteklenen herhangi bir Arduino, bir Sparkfun Pro Micro 5V / 16 MHz kullandım
  • Arduino IDE'nin yeni bir sürümü
  • JETI RSAT2 gibi bir PPM sinyali veren herhangi bir RC alıcısı
  • birkaç atlama teli (min. 3)
  • Arduino IDE'de kurulu Joystick kütüphanesi
  • arduino-timer kitaplığı:

Adım 1: RX ve Arduino'yu Bağlayın

RX ve Arduino'yu Bağlayın
RX ve Arduino'yu Bağlayın
RX ve Arduino'yu Bağlayın
RX ve Arduino'yu Bağlayın

Kablolama oldukça basittir. Bir Joystick cihazını taklit edeceği için Arduino'yu yalnızca USB'den çalıştırmaya karar verdim. Bu, Arduino'ya RC alıcısına güç sağlamak için de kullanılabilen 5V sağlayacaktır.

Düzenlenmiş çıkış sağlayan Pin VCC'yi ve en yakın Gnd pinini kullandım - sadece onu PPM'nin + ve - pinlerine bağlayın. Arduino'ya güç verildiğinde, alıcı da artık güçleniyor.

PPM sinyali için, onları ayrıştırmak için kesmeler kullanmaya karar verdim. Kesintiler mevcuttur; Pin 3'te, bu yüzden sadece oraya bağlayın - arduino'da "yerel RC pini" yoktur, ancak muhtemelen alıcı sinyalinde okumanın daha fazla ve farklı yolu vardır.

USB beslemeli VCC voltajı yalnızca 4,5V civarında olacağından RX voltaj alarmını devre dışı bırakmak zorunda kaldım - ancak oldukça kararlı, yani hiç sorun değil.

Adım 2: Bazı PPM Sinyallerini Alma

Bazı PPM Sinyallerini Alma
Bazı PPM Sinyallerini Alma
Bazı PPM Sinyallerini Alma
Bazı PPM Sinyallerini Alma

Alıcı VE TX'e güç verildiğinde, resimde gösterildiği gibi PPM sinyalleri alıyordum. 16 kanal, sonsuza kadar tekrarlandı. RSAT üzerindeki Failsafe devre dışı bırakılırsa ve verici kapatılırsa, PPM çıkışı devre dışı bırakılır.

PPM hakkında daha fazla bilgiyi burada bulabilirsiniz:

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

Bu durumda gerçek şeyler uçurmadığım için, teorik zamanlamaları umursamadım ve osiloskopta, çubukları tamamen soldan tam sağa hareket ettirirken alıcımın tam olarak ne verdiğini anladım (TX'deki standart ayarlar). Görünüşe göre -%100, 600µs uzunluğundaki darbelere ve +%100 ila 1600µs'ye karşılık geliyor. Arduino kodumdaki duraklama darbelerinin (400µs) uzunluğunu da umursamadım, ancak minimum kare aralığı varsaydım. 3000µs.

Adım 3: Vericiyi Yapılandırma

Vericiyi Yapılandırma
Vericiyi Yapılandırma
Vericiyi Yapılandırma
Vericiyi Yapılandırma
Vericiyi Yapılandırma
Vericiyi Yapılandırma

Yalnızca kontrol yüzeylerinin gerçek konumunun bilinmesi gerektiğinden, RC işlevi başına bir kanal / "servo" yeterlidir. Sonuç olarak, normal bir RC modeline benzer şekilde oldukça basit bir verici kurulumu yapılabilir. Kanatçık, elevatör, dümen ve gaz kelebeği ana fonksiyonlarının her biri sırasıyla sadece bir servo verici kanalı gerektirir. Ayrıca şimdiye kadar 9 kanalı boş bırakarak kanatlar, frenler ve dişliler ekledim. Flap'ların uçuş aşamasına getirildiğini ve doğrudan bir çubuk, kaydırıcı veya düğme ile kontrol edilmediğini lütfen unutmayın.

Adım 4: Joystick'i Çalıştırma

Joystick'i Çalıştırma
Joystick'i Çalıştırma
Joystick'i Çalıştırma
Joystick'i Çalıştırma

Joystick kitaplığının kullanımı oldukça kolaydır ve bazı örnekler ve testler sağlar. Öncelikle Arduino'nun uygun Joystick olarak algılanıp algılanmadığını kontrol etmek faydalı olacaktır, giriş bölümünde bağlantılı talimatlar ve kütüphanenin kendisi bazı iyi rehberlik sağlar.

Cihazlar ve Yazıcılar kontrol panelinde Arduino "Sparkfun Pro Micro" olarak görünüyordu ve joystick test penceresi 7 eksen ve birçok desteklenen buton gösteriyordu. Arduino'da programlandığında bir şapka anahtarı bile kullanılabilir.

Adım 5: Arduino'yu Kodlamak

Arduino'yu Kodlamak
Arduino'yu Kodlamak
Arduino'yu Kodlamak
Arduino'yu Kodlamak

Hala eksik olan şey, PPM sinyalinin gerçek ayrıştırılması ve Joystick eksenlerine ve düğmelerine atanmasıdır. Aşağıdaki eşleme için karar verdim:

Kanal / İşlev / Joystick ataması:

  1. Gaz -> Gaz kelebeği ekseni
  2. Aileron -> X ekseni
  3. Asansör -> Y ekseni
  4. Dümen -> X dönüş ekseni
  5. Kanatlar -> Y dönüş ekseni
  6. Fren -> Z ekseni
  7. Dişli -> Düğme 0

Vites düştüğünde Joystick'in ilk düğmesine basılacak ve vites yükseltilirken bırakılacaktır. Ancak bu, FSX için FSUIPC'yi gerektirecek, kutudan çıktığı gibi, FSX yalnızca vites değiştirmek için bir düğmeyi kabul edecek, bu tam olarak benim modellerimde olan şey değil.

Kodun şu anki sürümünü birçok yorumla sağladım, bu benim için oldukça iyi çalışıyor - atamanızı değiştirmekten veya yeni işlevler eklemekten çekinmeyin. Son 9 RC kanalı şu anda kullanılmıyor.

Kurulum için, temel olarak sayısal eksen aralıkları tanımlanarak Joystick sınıfının başlatılması gerekir:

/* Eksen aralığını ayarla (başlıkta tanımlı, 0 - 1000) */

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

0'dan 1000'e kadar olan değerler kullanılarak, darbe uzunluğunu (600 - 1600µs) yeniden ölçeklendirmeden joystick değerlerine doğrudan eşleştirmek mümkündür.

DIN 3, dijital giriş olarak başlatılır, çekmeler etkinleştirilir ve bir kesme eklenir:

pinMode(PPM_PIN, INPUT_PULLUP);

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

Hata ayıklama amacıyla, arduino-timer kitaplığını kullanarak Seri arabirim aracılığıyla düzenli aralıklarla bazı çıktılar ekledim:

if(SERIAL_PRINT_INTERVAL > 0) {

Scheduler.every(SERIAL_PRINT_INTERVAL, (void*) -> bool { SerialPrintChannels(); true döndür; }); }

Pin kesmesi, pinin mantıksal değeri değiştiğinde, yani PPM sinyalindeki her kenar için çağrılır. Nabız uzunluğunu micros() kullanarak sadece basit zamanlama ile değerlendirin:

uint32_t curTime = mikros();

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

Mevcut pinin durumunu değerlendirerek ve bunu darbe uzunluğu ve geçmiş darbelerle birleştirerek yeni darbeler sınıflandırılabilir. Aşağıdaki koşul, çerçeveler arası boşluğu algılayacaktır:

if(lastState == 0 && pulseLength > 3000 && pulseLength < 6000)

Sonraki darbeler için darbe uzunluğu, darbe uzunluğunu joystick eksen aralığına uyacak şekilde kırparak ve saptırarak bir eksen durumuna eşlenir:

uint16_t rxLength = darbeLength;

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

rxChannels dizisi sonunda 0 - 1000 arasında çubuk / kaydırıcı ve düğme konumlarını gösteren 16 değer içerir.

16 kanal aldıktan sonra Joystick ile eşleştirme yapılır:

/* eksenler */

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üğmeleri */ Joystick.setButton(0, (kanallar[6] < 500 ? 1: 0)); /* USB aracılığıyla verileri güncelle */ Joystick.sendState();

Koddaki bazı eksenleri ters çevirdim, bu kesinlikle gerekli değil, çünkü eksen ayrıca servo yönünü veya FSX'deki atamayı çevirerek de ters çevrilebilir. Ancak, servo yönergelerini ve ayrıca orijinal FSX atamasını korumaya karar verdim.

Düğme, kanal 7'nin sınırlanmasıyla açılır veya kapatılır.

Ve zamanlayıcıyı işaretlemeyi unutmayın… aksi takdirde hata ayıklama çıktıları görünmeyecektir.

boşluk döngüsü () {

zamanlayıcı.tick(); }

Eklediğim ekran görüntüsünde, kanal 1'in 1000'den (tam gaz) 0'a (boşta) taşındığını görebilirsiniz.

FSX, Arduino'yu diğer herhangi bir Joystick gibi algılayacaktır, bu yüzden sadece düğmeyi ve eksenleri atayın ve kalkışta eğlenin!

Bu yaklaşımla ilgili gerçekten sevdiğim şey, vericinizi gerçek bir modelde olduğu gibi kullanabilirsiniz, ör. uçuş aşamalarını kullanma vb.

Önerilen: