Оглавление:

Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX: 5 шагов
Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX: 5 шагов

Видео: Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX: 5 шагов

Видео: Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX: 5 шагов
Видео: Симулятор джойстика для аппаратуры управления на arduino / ppm 2024, Ноябрь
Anonim
Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX
Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX
Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX
Конвертер джойстика PPM в USB на базе Arduino (JETI) для FSX

Я решил переключить свой передатчик JETI DC-16 из режима 2 в режим 1, который в основном переключает газ и руль высоты слева направо и наоборот. Поскольку я не хотел разбивать одну из моих моделей из-за некоторой путаницы в левом / правом в моем мозгу, мне было интересно, можно ли немного попрактиковаться в FSX.

Я прочитал и протестировал передатчики JETI, которые действительно поддерживают режим джойстика из коробки, однако мне нужна была полная гибкость для назначения осей и переключателей и использование TX как с реальной моделью. Используя выход приемника, также можно усилить обработку сигнала в DC-16 и использовать микшеры, фазы полета, двойные скорости, все, что вы можете там запрограммировать.

Недавно я нашел хороший урок о том, как сделать устройство ввода USB HID, а именно джойстик, из дешевого Arduino, такого как Pro Micro:

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

Это сделало бы возможным все необходимое для управления самолетом / вертолетом / чем угодно в FSX! Доступно множество осей и кнопок.

Поскольку у меня только что был запасной JETI RSAT2, я решил подключить его к Arduino и попытаться реализовать небольшой анализатор PPM вместе с библиотекой Joystick.

Я предполагаю, что кто-нибудь, выполняющий эти шаги, знаком с подключением и программированием Arduino. Я не возьму на себя никаких гарантий в случае неисправности или повреждения!

Запасы

Тебе понадобится…

  • любой Arduino, поддерживаемый библиотекой Joystick, я использовал Sparkfun Pro Micro 5V / 16 MHz
  • последняя версия Arduino IDE
  • любой RC-приемник, выводящий сигнал PPM, например JETI RSAT2
  • несколько перемычек (минимум 3)
  • библиотека Joystick, установленная в Arduino IDE
  • библиотека таймера arduino:

Шаг 1: Подключите RX и Arduino

Подключите RX и Arduino
Подключите RX и Arduino
Подключите RX и Arduino
Подключите RX и Arduino

Подключение довольно простое. Я решил запитать Arduino только от USB, так как он должен имитировать джойстик. Это обеспечит питание Arduino напряжением 5 В, которое также можно использовать для питания RC-приемника.

Я использовал контакт VCC, который обеспечивает регулируемый выход, и ближайший контакт Gnd - просто подключите его к контактам + и - разъема PPM. Когда Arduino получает питание, теперь включается и приемник.

Для сигнала PPM я решил использовать прерывания для их анализа. Доступны прерывания, например на выводе 3, поэтому просто подключите его туда - на Arduino нет «родного RC-вывода», но, возможно, больше и разных способов считывания сигнала приемника.

Мне пришлось отключить сигнализацию напряжения RX, так как напряжение VCC с питанием USB будет всего около 4,5 В, но довольно стабильно, так что никаких проблем.

Шаг 2: получение сигналов PPM

Получение сигналов PPM
Получение сигналов PPM
Получение сигналов PPM
Получение сигналов PPM

Когда на приемник И TX подается питание, я получал сигналы PPM, как показано на изображении. 16 каналов, повторяющиеся вечно. Если отказоустойчивый на RSAT отключен и питание передатчика отключено, выход PPM будет отключен.

Более подробная информация о PPM доступна здесь:

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

Поскольку в данном случае я не летаю на реальных вещах, я не обращал внимания на теоретические тайминги и просто выяснил на осциллографе, что мой приемник фактически выводил при перемещении стиков из крайнего левого положения в крайнее правое (стандартные настройки в TX).. Казалось, -100% соответствует импульсам длительностью 600 мкс, а + 100% - 1600 мкс. Я также не заботился о длине импульсов паузы (400 мкс) в моем коде Arduino, но я предположил, что интервал между кадрами равен мин. 3000 мкс.

Шаг 3: Настройка передатчика

Настройка передатчика
Настройка передатчика
Настройка передатчика
Настройка передатчика
Настройка передатчика
Настройка передатчика

Поскольку необходимо знать только фактическое положение управляющих поверхностей, достаточно одного канала / «сервопривода» для каждой функции RC. Следовательно, можно сделать довольно простую настройку передатчика - аналогично обычной RC-модели. Для основных функций элеронов, руля высоты, руля направления и дроссельной заслонки требуется только один канал сервопривода или передатчика. Я также добавил закрылки, тормоза и редуктор, оставив пока 9 каналов свободными. Обратите внимание, что закрылки переведены в фазу полета и не управляются напрямую с помощью джойстика, ползунка или кнопки.

Шаг 4: Запуск джойстика

Запуск джойстика
Запуск джойстика
Запуск джойстика
Запуск джойстика

Библиотека джойстика довольно проста в использовании и содержит несколько примеров и тестов. Было бы полезно сначала проверить, определяется ли Arduino как правильный джойстик, инструкции, указанные в разделе ввода, и сама библиотека дают хорошее руководство.

На панели управления «Устройства и принтеры» Arduino отображался как «Sparkfun Pro Micro», а в окне тестирования джойстика отображалось 7 осей и множество поддерживаемых кнопок. При программировании в Arduino можно использовать даже переключатель шляпы.

Шаг 5: Кодирование Arduino

Кодирование Arduino
Кодирование Arduino
Кодирование Arduino
Кодирование Arduino

Чего еще не хватает, так это фактического анализа сигнала PPM и назначения осям и кнопкам джойстика. Я выбрал следующее отображение:

Назначение канала / функции / джойстика:

  1. Дроссельная заслонка -> Ось дроссельной заслонки
  2. Элероны -> ось 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 мкс) значениям джойстика без изменения масштаба.

DIN 3 инициализируется как цифровой вход, подтяжки включены и прерывание присоединено:

pinMode (PPM_PIN, INPUT_PULLUP);

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

В целях отладки я добавил несколько распечаток через последовательный интерфейс через регулярные промежутки времени, используя библиотеку arduino-timer:

если (SERIAL_PRINT_INTERVAL> 0) {

scheduler.every (SERIAL_PRINT_INTERVAL, (void *) -> bool {SerialPrintChannels (); return 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.setThrottle (каналы [0]); Joystick.setXAxis (каналы [1]); Joystick.setYAxis (1000 - каналы [2]); Joystick.setRxAxis (каналы [3]); Joystick.setRyAxis (каналы [4]); Joystick.setZAxis (1000 - каналы [5]); / * кнопки * / Joystick.setButton (0, (каналы [6] <500? 1: 0)); / * обновление данных через USB * / Joystick.sendState ();

Я инвертировал некоторые оси в коде, что не является абсолютно необходимым, поскольку ось также может быть инвертирована путем изменения направления сервопривода или назначения в FSX. Однако я решил сохранить направление сервопривода, а также исходное назначение FSX.

Кнопка включается или выключается пороговым каналом 7.

И не забудьте поставить галочку в планировщике… иначе отладочные отпечатки не будут видны.

void loop () {

scheduler.tick (); }

На скриншоте, который я прикрепил, вы можете видеть, что канал 1 был перемещен с 1000 (полный газ) на 0 (холостой ход).

FSX обнаружит Arduino так же, как любой другой джойстик, поэтому просто назначьте кнопку и оси и получайте удовольствие от взлета!

Что мне действительно нравится в этом подходе, так это то, что вы можете просто использовать свой передатчик, как с реальной моделью, например с использованием фаз полета и т. д.

Рекомендуемые: