Mục lục:

Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX: 5 bước
Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX: 5 bước

Video: Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX: 5 bước

Video: Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX: 5 bước
Video: Hướng Dẫn Nạp Code Arduino ATTiny85 USB / Tự Làm Thiết Bị Mở Khóa Máy Tính Với Touch Sensor 2024, Tháng mười một
Anonim
Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX
Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX
Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX
Bộ chuyển đổi PPM sang USB Joystick dựa trên Arduino (JETI) cho FSX

Tôi đã quyết định chuyển máy phát JETI DC-16 của mình từ Chế độ 2 sang Chế độ 1, về cơ bản sẽ chuyển Throttle và Elevator từ trái sang phải và ngược lại. Vì tôi không muốn làm hỏng một trong các mô hình của mình do một số nhầm lẫn trái / phải trong não của tôi, tôi đã tự hỏi liệu có thể thực hành một chút trong FSX hay không.

Tôi đã đọc và thử nghiệm các bộ phát JETI thực sự hỗ trợ chế độ Cần điều khiển ngoài hộp, tuy nhiên tôi muốn có sự linh hoạt hoàn toàn cho các nhiệm vụ trục và công tắc và sử dụng TX như với một mô hình thực. Bằng cách sử dụng đầu ra của máy thu, bạn cũng có thể tận dụng quá trình xử lý tín hiệu trong DC-16 và sử dụng bộ trộn, giai đoạn bay, tốc độ kép, bất cứ thứ gì bạn có thể lập trình ở đó.

Gần đây, tôi đã tìm thấy một hướng dẫn hay về cách tạo thiết bị đầu vào USB HID, cụ thể là Cần điều khiển, từ Arduino rẻ tiền như Pro Micro:

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

Điều này sẽ cho phép mọi thứ cần thiết để điều khiển máy bay / trực thăng / bất cứ thứ gì trong FSX! Rất nhiều trục và nút có sẵn.

Vì tôi chỉ có một JETI RSAT2 dự phòng, tôi quyết định kết nối nó với Arduino và cố gắng triển khai một trình phân tích cú pháp PPM nhỏ cùng với thư viện Joystick.

Tôi giả định rằng bất kỳ ai làm theo các bước này đều quen thuộc với việc kết nối và lập trình Arduino. Tôi sẽ không nhận bất kỳ bảo hành nào đối với trục trặc hoặc hư hỏng!

Quân nhu

Bạn sẽ cần…

  • bất kỳ Arduino nào được hỗ trợ bởi thư viện Joystick, tôi đã sử dụng Sparkfun Pro Micro 5V / 16 MHz
  • phiên bản gần đây của Arduino IDE
  • bất kỳ bộ thu RC nào xuất ra tín hiệu PPM, như JETI RSAT2
  • một vài dây nhảy (tối thiểu 3)
  • thư viện Joystick được cài đặt trong Arduino IDE
  • thư viện arduino-timer:

Bước 1: Nối dây RX và Arduino

Lên dây RX và Arduino
Lên dây RX và Arduino
Lên dây RX và Arduino
Lên dây RX và Arduino

Hệ thống dây điện khá đơn giản. Tôi quyết định chỉ cấp nguồn cho Arduino từ USB, vì nó sẽ mô phỏng thiết bị Cần điều khiển. Điều này sẽ cung cấp cho Arduino nguồn 5V, cũng có thể được sử dụng để cấp nguồn cho bộ thu RC.

Tôi đã sử dụng Pin VCC, cung cấp đầu ra được điều chỉnh và chân Gnd gần nhất - chỉ cần kết nối nó với đầu nối + và - chân của PPM. Khi Arduino được cấp nguồn, bộ thu cũng đang bật nguồn.

Đối với tín hiệu PPM, tôi quyết định sử dụng ngắt để phân tích cú pháp chúng. Có sẵn các ngắt, ví dụ: tại Pin 3, vì vậy chỉ cần kết nối nó ở đó - không có "chân RC gốc" trên arduino, nhưng có thể có nhiều cách khác nhau để đọc tín hiệu của bộ thu.

Tôi đã phải tắt cảnh báo điện áp RX, vì điện áp VCC với nguồn cung cấp USB sẽ chỉ khoảng 4,5V - nhưng khá ổn định, vì vậy không có vấn đề gì cả.

Bước 2: Nhận một số tín hiệu PPM

Nhận một số tín hiệu PPM
Nhận một số tín hiệu PPM
Nhận một số tín hiệu PPM
Nhận một số tín hiệu PPM

Khi bộ thu VÀ TX được cấp nguồn, tôi nhận được tín hiệu PPM như trong hình. 16 kênh, lặp lại mãi mãi. Nếu Failsafe trên RSAT bị tắt và máy phát tắt nguồn, đầu ra PPM sẽ bị vô hiệu hóa.

Thông tin thêm về PPM có sẵn tại đây:

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

Vì tôi không bay đồ thật trong trường hợp này, nên tôi không quan tâm đến thời gian lý thuyết và chỉ tìm hiểu trên máy hiện sóng xem bộ thu của tôi xuất ra âm thanh gì khi di chuyển các que từ hoàn toàn trái sang phải hoàn toàn (cài đặt tiêu chuẩn trong TX). Nó dường như -100% tương ứng với các xung có độ dài 600µs và + 100% đến 1600µs. Tôi cũng không quan tâm đến độ dài của các xung tạm dừng (400µs) trong mã Arduino của mình, nhưng tôi giả định khoảng cách khung hình là min. 3000µs.

Bước 3: Định cấu hình máy phát

Cấu hình máy phát
Cấu hình máy phát
Cấu hình máy phát
Cấu hình máy phát
Cấu hình máy phát
Cấu hình máy phát

Vì chỉ cần biết vị trí thực tế của các bề mặt điều khiển, một kênh / "servo" cho mỗi chức năng RC là đủ. Do đó, một thiết lập máy phát khá đơn giản có thể được thực hiện - tương tự như một mô hình RC thông thường. Mỗi chức năng chính aileron, thang máy, bánh lái và van tiết lưu chỉ yêu cầu một kênh phát tương ứng servo. Tôi cũng đã bổ sung cánh đảo gió, phanh và bánh răng, để lại 9 kênh miễn phí cho đến nay. Xin lưu ý rằng Flaps được đặt trong giai đoạn bay và không được điều khiển trực tiếp thông qua thanh, thanh trượt hoặc nút.

Bước 4: Chạy Joystick

Chạy Joystick
Chạy Joystick
Chạy Joystick
Chạy Joystick

Thư viện Joystick khá dễ sử dụng và cung cấp một số ví dụ và bài kiểm tra. Trước tiên, sẽ hữu ích khi kiểm tra xem Arduino có được phát hiện là Cần điều khiển thích hợp hay không, các hướng dẫn được liên kết trong phần mục nhập và bản thân thư viện cung cấp một số hướng dẫn tốt.

Trong bảng điều khiển Thiết bị và Máy in, Arduino hiển thị là "Sparkfun Pro Micro" và cửa sổ kiểm tra cần điều khiển hiển thị 7 trục và nhiều nút được hỗ trợ. Thậm chí có thể sử dụng công tắc mũ khi được lập trình trong Arduino.

Bước 5: Mã hóa Arduino

Mã hóa Arduino
Mã hóa Arduino
Mã hóa Arduino
Mã hóa Arduino

Điều vẫn còn thiếu là phân tích cú pháp thực tế của tín hiệu PPM và gán cho các trục và nút của Cần điều khiển. Tôi đã quyết định lập bản đồ sau:

Kênh / Chức năng / Chỉ định phím điều khiển:

  1. Throttle -> Trục bướm ga
  2. Aileron -> Trục X
  3. Thang máy -> Trục Y
  4. Bánh lái -> Trục quay X
  5. Flaps -> Trục quay Y
  6. Phanh -> Trục Z
  7. Bánh răng -> Nút 0

Khi cần số xuống, nút đầu tiên của Cần điều khiển sẽ được nhấn và sẽ được nhả ra khi tăng số. Tuy nhiên, điều này sẽ yêu cầu FSUIPC cho FSX, ngoài ra, FSX sẽ chỉ chấp nhận một nút để chuyển đổi thiết bị, điều này không chính xác là những gì đang xảy ra với các mô hình của tôi.

Tôi đã cung cấp phiên bản mã hiện tại của mình với rất nhiều nhận xét, điều này đang hoạt động khá tốt đối với tôi - vui lòng thay đổi nhiệm vụ của bạn hoặc thêm các chức năng mới. 9 kênh RC cuối cùng hiện không được sử dụng.

Để thiết lập, lớp Cần điều khiển cần được khởi tạo, về cơ bản bằng cách xác định các phạm vi trục số:

/ * Đặt phạm vi trục (được xác định trong tiêu đề, 0 - 1000) * /

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

Bằng cách sử dụng các giá trị từ 0 đến 1000, có thể ánh xạ trực tiếp độ dài xung (600 - 1600µs) tới các giá trị của phím điều khiển mà không cần thay đổi tỷ lệ.

DIN 3 được khởi tạo dưới dạng đầu vào kỹ thuật số, kích hoạt pullups và một ngắt được đính kèm:

pinMode (PPM_PIN, INPUT_PULLUP);

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

Đối với mục đích gỡ lỗi, tôi đã thêm một số bản in qua giao diện Serial trong các khoảng thời gian đều đặn, sử dụng thư viện arduino-timer:

nếu (SERIAL_PRINT_INTERVAL> 0) {

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

Ngắt của chân sẽ được gọi bất cứ khi nào giá trị logic của chân thay đổi, vì vậy đối với mỗi cạnh trong tín hiệu PPM. Đánh giá độ dài xung chỉ bằng cách định thời đơn giản bằng micros ():

uint32_t curTime = micros ();

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

Bằng cách đánh giá trạng thái của chân hiện tại và kết hợp nó với độ dài xung và các xung trong quá khứ, các xung mới có thể được phân loại. Sau đây có điều kiện sẽ phát hiện khoảng cách giữa các khung:

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

Đối với các xung tiếp theo, độ dài xung sẽ được ánh xạ tới trạng thái trục bằng cách cắt bớt và phân biệt độ dài xung để phù hợp với phạm vi trục của cần điều khiển:

uint16_t rxLength = xungLength;

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

Mảng rxChannels cuối cùng chứa 16 giá trị từ 0 - 1000, cho biết vị trí thanh / trượt và nút.

Sau khi nhận được 16 kênh, ánh xạ tới Cần điều khiển được thực hiện:

/ * trục * /

Joystick.setThrottle (các kênh [0]); Joystick.setXAxis (kênh [1]); Joystick.setYAxis (1000 - kênh [2]); Joystick.setRxAxis (kênh [3]); Joystick.setRyAxis (kênh [4]); Joystick.setZAxis (1000 - kênh [5]); / * các nút * / Joystick.setButton (0, (các kênh [6] <500? 1: 0)); / * cập nhật dữ liệu qua USB * / Joystick.sendState ();

Tôi đã đảo ngược một số trục trong mã, điều này không cần thiết tuyệt đối, vì trục cũng có thể được đảo ngược bằng cách lật hướng servo hoặc phép gán trong FSX. Tuy nhiên, tôi quyết định giữ lại hướng servo và cũng là nhiệm vụ FSX ban đầu.

Nút được bật hoặc tắt bằng cách ngưỡng kênh 7.

Và đừng quên đánh dấu vào bộ lập lịch… nếu không, sẽ không có bản in gỡ lỗi nào được hiển thị.

void loop () {

Scheduler.tick (); }

Trong ảnh chụp màn hình mà tôi đính kèm, bạn có thể thấy, kênh 1 đã được chuyển từ 1000 (hết ga) sang 0 (không tải).

FSX sẽ phát hiện Arduino giống như bất kỳ Cần điều khiển nào khác, vì vậy chỉ cần gán nút và trục và vui vẻ khi cất cánh!

Điều tôi thực sự thích về cách tiếp cận này là, bạn chỉ có thể sử dụng máy phát của mình như với một mô hình thực, ví dụ: sử dụng các giai đoạn bay v.v.

Đề xuất: