Сборка кастомного квадранта тяг и колеса триммера для MS Flight Simulator на Arduino Leonardo и 3D-печати
Компоненты и материалы
| Arduino Leonardo (или Arduino Micro) — подходит для проекта, позволяет подключить до 6 органов управления на одну плату. | 1 |
| Провода для монтажа — 3 провода на каждый модуль. | 3 |
| Поворотный потенциометр 50 кОм — 1 шт. на модуль (подробности в разделе «Сборка»). | 1 |
Необходимые инструменты и оборудование
- Паяльник
- 3D-принтер
Приложения и онлайн-сервисы
- Arduino IDE
О проекте
Введение
После обновления ПК для запуска Microsoft Flight Simulator 2020 я решил улучшить органы управления. Клавиатура не дает нужных ощущений при полёте, а полноценный кокпит или готовые приборы требуют много места и денег. Я не профессиональный симуляторщик, поэтому искал компактное и доступное решение.
Проектирование
Я разработал органы управления в CAD, опираясь на имеющиеся инструменты и представления о реальных авиарулях (реального опыта управления нет). Для лёгких однодвигательных самолётов, которые я чаще всего летаю в симуляторе, понадобились: отдельные рычаги для тяги, закрылков, шасси и колесо триммера руля высоты.
Колесо триммера стало самым сложным узлом — на его дизайн ушло несколько дней и множество эскизов, чтобы добиться нужного тактильного ощущения и внешнего вида.
Сборка
Все детали напечатаны на 3D-принтере из ABS, затем покрашены и подключены к Arduino. Сначала использовалась Leonardo, затем заменена на Micro для компактности. Итог — плаг-энд-плей устройство, которое легко убирается, когда не используется.
Список 3D-печатаемых деталей
Каждый модуль рычага требует:
- 1 × Корпус левый
- 1 × Корпус правый
- 1 × Рычаг с фиксаторами (5 вариантов: 2–6 позиций)
- 1 × Накладка на конце рычага
- 1 × Кнопка/накладка (6 вариантов)
- 1 × Фрикционная пластина (3 варианта)
- 1 × Крепление потенциометра
Модуль колеса триммера требует:
- 1 × Корпус колеса левый
- 1 × Корпус колеса правый
- 1 × Шестерня колеса
- 1 × Втулка колеса
- 1 × Колесо (если собираемое)
- 8 × Накладок на колесо (если собираемое)
- 1 × Колесо монолитное (альтернативный вариант)
- 1 × Квадрант триммера
- 1 × Привод квадранта
- 1 × Крепление потенциометра
Детали задней коробки служат для размещения Arduino и проводки.
Заключение
Сборка принесла много удовольствия. С программной стороны всё крайне просто, главная сложность — проектирование, особенно колеса триммера и достижение правильного тактильного ощущения.
Программный код
Файл: Quadrant.ino
Используйте переменную setting и монитор последовательного порта для определения крайних значений каждого потенциометра, затем введите их в массив axisLimits.
#include <Joystick.h>
Joystick_ Joystick;
// Массивы крайних значений аналоговых входов (переводятся в диапазон 0–1023)
int axisLimits0[] = {686, 338};
int axisLimits1[] = {345, 695};
int axisLimits2[] = {327, 678};
int axisLimits3[] = {342, 692};
int axisLimits4[] = {0, 1023};
int axisLimits5[] = {0, 1023};
// Включение/отключение осей
bool a0Used = true;
bool a1Used = true;
bool a2Used = true;
bool a3Used = true;
bool a4Used = false;
bool a5Used = false;
// Режим калибровки: -1 = выкл, 0–5 = вывод значений пина в Serial
int setting = -1;
void setup() {
if(a0Used) pinMode(A0, INPUT);
if(a1Used) pinMode(A1, INPUT);
if(a2Used) pinMode(A2, INPUT);
if(a3Used) pinMode(A3, INPUT);
if(a4Used) pinMode(A4, INPUT);
if(a5Used) pinMode(A5, INPUT);
Joystick.begin();
if(setting >= 0) Serial.begin(9600);
}
void loop() {
int value = 0, pos = 0;
if(a0Used){
value = analogRead(A0);
pos = translateValue(value, axisLimits0[0], axisLimits0[1]);
Joystick.setThrottle(pos);
if(setting == 0) settingPrint(value, pos);
}
if(a1Used){
value = analogRead(A1);
pos = translateValue(value, axisLimits1[0], axisLimits1[1]);
Joystick.setRxAxis(pos);
if(setting == 1) settingPrint(value, pos);
}
if(a2Used){
value = analogRead(A2);
pos = translateValue(value, axisLimits2[0], axisLimits2[1]);
Joystick.setRyAxis(pos);
if(setting == 2) settingPrint(value, pos);
}
if(a3Used){
value = analogRead(A3);
pos = translateValue(value, axisLimits3[0], axisLimits3[1]);
Joystick.setRzAxis(pos);
if(setting == 3) settingPrint(value, pos);
}
if(a4Used){
value = analogRead(A4);
pos = translateValue(value, axisLimits4[0], axisLimits4[1]);
Joystick.setXAxis(pos);
if(setting == 4) settingPrint(value, pos);
}
if(a5Used){
value = analogRead(A5);
pos = translateValue(value, axisLimits5[0], axisLimits5[1]);
Joystick.setYAxis(pos);
if(setting == 5) settingPrint(value, pos);
}
delay(5);
}
int translateValue(int v, int f1, int f2){
int result = 0, start = 0;
float range = 0;
if(f1 < f2){ start = f1; range = f2 - f1; }
else{ start = f2; range = f1 - f2; }
result = (v - start) * (1023 / range);
if(result < 0) result = 0;
if(result > 1023) result = 1023;
return result;
}
void settingPrint(int value, int pos){
Serial.print(value);
Serial.print(" ");
Serial.println(pos);
}
3D-модели и корпус
Доступны файлы STEP со всеми деталями (released_u3k8QjPXzJ.stp) и вариант без выреза под фиксатор.
Схема подключения
Для добавления органов управления подключайте 5В и GND, используйте пины A1–A5. Файл схемы: quadrant_ZkMygPyRiE.fzz.
Производственный процесс
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Логгер температуры и влажности на Arduino с DHT11 и Ethernet Shield
- Компактное руль-триммер для FlightGear на Arduino Nano
- Управление Arduino Uno из Python 3: команды через последовательный порт и демонстрация с LED
- Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64
- Сборка компактного FM-радио на Arduino Nano и RDA5807M
- Система учёта рабочего времени на RFID, Arduino и Google Таблицах
- IoT-интеграция: Удаленный контроль Arduino через UWP-приложения Windows 10
- Балансировка и развал-схождение колес: что нужно знать