Daftar Isi:

Berbasis Arduino (JETI) PPM ke USB Joystick Converter untuk FSX: 5 Langkah
Berbasis Arduino (JETI) PPM ke USB Joystick Converter untuk FSX: 5 Langkah

Video: Berbasis Arduino (JETI) PPM ke USB Joystick Converter untuk FSX: 5 Langkah

Video: Berbasis Arduino (JETI) PPM ke USB Joystick Converter untuk FSX: 5 Langkah
Video: Пользовательский Arduino HOTAS из старой установки Thrustmaster 2024, Juli
Anonim
Konverter Joystick PPM ke USB Berbasis Arduino (JETI) untuk FSX
Konverter Joystick PPM ke USB Berbasis Arduino (JETI) untuk FSX
Konverter Joystick PPM ke USB Berbasis Arduino (JETI) untuk FSX
Konverter Joystick PPM ke USB Berbasis Arduino (JETI) untuk FSX

Saya memutuskan untuk mengganti pemancar JETI DC-16 saya dari Mode 2 ke Mode 1, yang pada dasarnya mengubah Throttle dan Elevator dari kiri ke kanan dan sebaliknya. Karena saya tidak ingin crash salah satu model saya karena beberapa kebingungan kiri/kanan di otak saya, saya bertanya-tanya apakah mungkin untuk berlatih sedikit di FSX.

Saya membaca dan menguji pemancar JETI benar-benar mendukung mode Joystick di luar kotak, namun saya menginginkan fleksibilitas penuh untuk tugas sumbu dan sakelar dan menggunakan TX seperti pada model nyata. Dengan menggunakan output receiver, juga dimungkinkan untuk memanfaatkan pemrosesan sinyal di DC-16 dan menggunakan mixer, fase penerbangan, kecepatan ganda, apa pun yang dapat Anda program di sana.

Baru-baru ini saya menemukan tutorial yang bagus tentang cara membuat perangkat input USB HID, yaitu Joystick, dari Arduino murah seperti Pro Micro:

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

Ini akan memungkinkan semua yang diperlukan untuk mengendalikan pesawat / helikopter / apa pun di FSX! Banyak sumbu dan tombol yang tersedia.

Karena saya baru saja memiliki JETI RSAT2 cadangan, saya memutuskan untuk menghubungkannya dengan Arduino dan mencoba menerapkan parser PPM kecil bersama dengan perpustakaan Joystick.

Saya berasumsi siapa pun yang mengikuti langkah-langkah ini akrab dengan menghubungkan dan memprogram Arduino. Saya tidak akan mengambil jaminan untuk malfungsi atau kerusakan!

Perlengkapan

Anda akan perlu…

  • Arduino apa pun yang didukung oleh perpustakaan Joystick, saya menggunakan Sparkfun Pro Micro 5V / 16 MHz
  • versi terbaru dari Arduino IDE
  • setiap penerima RC yang mengeluarkan sinyal PPM, seperti JETI RSAT2
  • beberapa kabel jumper (min. 3)
  • perpustakaan Joystick dipasang di Arduino IDE
  • perpustakaan arduino-timer:

Langkah 1: Hubungkan RX dan Arduino

Hubungkan RX dan Arduino
Hubungkan RX dan Arduino
Hubungkan RX dan Arduino
Hubungkan RX dan Arduino

Pengkabelan cukup mudah. Saya memutuskan untuk hanya menyalakan Arduino dari USB, karena itu akan meniru perangkat Joystick. Ini akan memasok Arduino dengan 5V, yang dapat digunakan juga untuk memberi daya pada penerima RC.

Saya menggunakan Pin VCC, yang menyediakan output yang diatur, dan pin Gnd terdekat - cukup sambungkan ke pin konektor + dan - PPM. Saat Arduino diberi daya, penerima sekarang juga menyala.

Untuk sinyal PPM, saya memutuskan untuk menggunakan interupsi untuk menguraikannya. Interupsi tersedia, mis. di Pin 3, jadi sambungkan saja di sana - tidak ada "pin RC asli" pada arduino, tetapi mungkin lebih banyak dan cara yang berbeda untuk membaca sinyal penerima.

Saya harus menonaktifkan alarm tegangan RX, karena tegangan VCC dengan suplai USB hanya sekitar 4,5V - tetapi cukup stabil, jadi tidak ada masalah sama sekali.

Langkah 2: Mendapatkan Beberapa Sinyal PPM

Mendapatkan Beberapa Sinyal PPM
Mendapatkan Beberapa Sinyal PPM
Mendapatkan Beberapa Sinyal PPM
Mendapatkan Beberapa Sinyal PPM

Ketika penerima DAN TX dihidupkan, saya mendapatkan sinyal PPM seperti yang ditunjukkan pada gambar. 16 saluran, diulang selamanya. Jika Failsafe pada RSAT dinonaktifkan dan pemancar dimatikan, output PPM akan dinonaktifkan.

Informasi lebih lanjut tentang PPM tersedia di sini:

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

Karena saya tidak menerbangkan barang nyata dalam hal ini, saya tidak peduli dengan pengaturan waktu teoretis dan hanya mengetahui di osiloskop apa yang dihasilkan receiver saya secara akurat ketika memindahkan tongkat dari kiri penuh ke kanan penuh (pengaturan standar di TX). Tampaknya -100% sesuai dengan pulsa dengan panjang 600µs, dan +100% hingga 1600s. Saya juga tidak peduli dengan panjang pulsa jeda (400µs) dalam kode Arduino saya, tetapi saya mengasumsikan jarak bingkai min. 3000 detik.

Langkah 3: Mengkonfigurasi Pemancar

Mengonfigurasi Pemancar
Mengonfigurasi Pemancar
Mengonfigurasi Pemancar
Mengonfigurasi Pemancar
Mengonfigurasi Pemancar
Mengonfigurasi Pemancar

Karena hanya posisi sebenarnya dari permukaan kontrol yang perlu diketahui, satu saluran / "servo" per fungsi RC sudah cukup. Akibatnya, setup pemancar yang agak sederhana dapat dibuat - mirip dengan model RC normal. Fungsi utama aileron, elevator, rudder dan throttle masing-masing hanya membutuhkan satu saluran pemancar masing-masing servo. Saya juga menambahkan penutup, rem, dan roda gigi, sejauh ini menyisakan 9 saluran gratis. Harap dicatat bahwa Flaps diletakkan pada fase penerbangan, dan tidak dikontrol secara langsung melalui tongkat, penggeser, atau tombol.

Langkah 4: Menjalankan Joystick

Menjalankan Joystick
Menjalankan Joystick
Menjalankan Joystick
Menjalankan Joystick

Pustaka Joystick cukup mudah digunakan, dan menyediakan beberapa contoh dan pengujian. Akan sangat membantu untuk memeriksa terlebih dahulu apakah Arduino terdeteksi sebagai Joystick yang tepat, instruksi yang ditautkan di bagian entri dan perpustakaan itu sendiri memberikan beberapa panduan yang baik.

Di panel kontrol Perangkat dan Printer, Arduino muncul sebagai "Sparkfun Pro Micro", dan jendela uji joystick menunjukkan 7 sumbu dan banyak tombol yang didukung. Bahkan sakelar topi dapat digunakan saat diprogram di Arduino.

Langkah 5: Mengkode Arduino

Mengkode Arduino
Mengkode Arduino
Mengkode Arduino
Mengkode Arduino

Apa yang masih hilang adalah penguraian sebenarnya dari sinyal PPM dan penetapan ke sumbu dan tombol Joystick. Saya memutuskan untuk pemetaan berikut:

Penugasan Saluran / Fungsi / Joystick:

  1. Throttle -> Sumbu Throttle
  2. Aileron -> sumbu X
  3. Lift -> sumbu Y
  4. Kemudi -> sumbu rotasi X
  5. Flaps -> sumbu rotasi Y
  6. Rem -> sumbu Z
  7. Gigi -> Tombol 0

Saat persneling turun, tombol pertama Joystick akan ditekan dan akan dilepaskan saat menaikkan persneling. Namun, ini akan membutuhkan FSUIPC untuk FSX, di luar kotak, FSX hanya akan menerima tombol untuk mengubah persneling, yang tidak persis seperti yang terjadi dengan model saya.

Saya memberikan versi kode saya saat ini dengan banyak komentar, yang bekerja cukup baik untuk saya - jangan ragu untuk mengubah tugas Anda atau menambahkan fungsi baru. 9 saluran RC terakhir saat ini tidak digunakan.

Untuk pengaturan, kelas Joystick perlu diinisialisasi, pada dasarnya dengan menentukan rentang sumbu numerik:

/* Mengatur rentang sumbu (didefinisikan di header, 0 - 1000) */

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

Dengan menggunakan nilai dari 0 hingga 1000, dimungkinkan untuk langsung memetakan panjang pulsa (600 - 1600µs) ke nilai joystick tanpa mengubah skala.

DIN 3 diinisialisasi sebagai input digital, pullup diaktifkan, dan interupsi terpasang:

pinMode(PPM_PIN, INPUT_PULLUP);

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

Untuk tujuan debugging, saya menambahkan beberapa cetakan melalui antarmuka Serial secara berkala, menggunakan perpustakaan arduino-timer:

if(SERIAL_PRINT_INTERVAL > 0) {

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

Interupsi pin akan dipanggil setiap kali nilai logika pin berubah, jadi untuk setiap tepi dalam sinyal PPM. Evaluasi panjang pulsa hanya dengan pengaturan waktu sederhana menggunakan micros():

uint32_t curTime = mikro();

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

Dengan mengevaluasi status pin saat ini dan menggabungkannya dengan panjang pulsa dan pulsa masa lalu, pulsa baru dapat diklasifikasikan. Kondisional berikut akan mendeteksi celah interframe:

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

Untuk pulsa berikutnya, panjang pulsa akan dipetakan ke status sumbu dengan memotong dan membiaskan panjang pulsa agar sesuai dengan rentang sumbu joystick:

uint16_t rxLength = pulseLength;

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

Array rxChannels akhirnya berisi 16 nilai dari 0 - 1000, yang menunjukkan posisi tongkat / penggeser dan tombol.

Setelah menerima 16 saluran, pemetaan ke Joystick dilakukan:

/* sumbu */

Joystick.setThrottle(saluran[0]); Joystick.setXAxis(saluran[1]); Joystick.setYAxis(1000 - saluran [2]); Joystick.setRxAxis(saluran[3]); Joystick.setRyAxis(saluran[4]); Joystick.setZAxis(1000 - saluran[5]); /* tombol */ Joystick.setButton(0, (saluran[6] < 500 ? 1: 0)); /* memperbarui data melalui USB */ Joystick.sendState();

Saya membalikkan beberapa sumbu dalam kode, yang tidak mutlak diperlukan, karena sumbu juga dapat dibalik dengan membalik arah servo atau penugasan di FSX. Namun, saya memutuskan untuk mempertahankan arah servo dan juga tugas FSX asli.

Tombol diaktifkan atau dinonaktifkan oleh saluran ambang 7.

Dan jangan lupa untuk mencentang scheduler… jika tidak, tidak ada cetakan debug yang akan terlihat.

lingkaran kosong() {

penjadwal. centang(); }

Pada tangkapan layar yang saya lampirkan, Anda dapat melihat, saluran 1 dipindahkan dari 1000 (akselerasi penuh) ke 0 (idle).

FSX akan mendeteksi Arduino sama seperti Joystick lainnya, jadi tetapkan saja tombol dan sumbunya dan bersenang-senanglah lepas landas!

Yang sangat saya sukai dari pendekatan ini adalah, Anda dapat menggunakan pemancar seperti model nyata, mis. menggunakan fase penerbangan dll.

Direkomendasikan: