Компактное руль-триммер для FlightGear на Arduino Nano
Компоненты и материалы
- Arduino Nano R3 (или совместимая) — 1 шт.
- Потенциометр (ротационный) — 1 шт.
- Конденсатор 100 мкФ — 1 шт. (для сглаживания показаний АЦП)
- OLED-дисплей 0.96″ SSD1306 (I2C) — 1 шт.
- Провода-перемычки — 1 набор
Приложения и сервисы
- Arduino IDE
- Anaconda (Python + библиотеки
pyserial,socket,sys) - FlightGear (флайт-сим)
О проекте
Идея
Создать дешёвый компактный аналоговый руль управления триммером глубины (elevator trim) для симулятора FlightGear. Arduino считывает потенциометр, отправляет данные по Serial → Python-скрипт пересылает их по UDP в FlightGear через Generic Protocol.
Архитектура
- Arduino-скетч (
arduinoElevatorTrimOLED.ino) — опрашивает АЦп, выводит показания на OLED (шкала с иглой), шлёт float в Serial (9600 бод). - Python-скрипт (
arduinoElevatorTrim.py) — читает Serial, отправляет UDP-пакеты наlocalhost:21567. - XML-протокол (
arduinoElevatorTrim.xml) — кладётся в<FlightGearRoot>/data/protocol, описывает маппинг UDP → property/controls/flight/elevator-trim.
Настройка Python
>>> conda install -c anaconda pyserial
# socket и sys встроены
В скрипте укажите свой COM-порт (в примере COM4).
Запуск
- Прошейте Arduino (библиотека
U8glib, настройте тип дисплея в строке 2). - Положите
arduinoElevatorTrim.xmlв папку протоколов FlightGear. - Запустите Python-скрипт:
python путь/к/arduinoElevatorTrim.py. - Запустите FlightGear с параметром:
--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
Теперь поворот потенциометра плавно меняет триммер в симуляторе. На OLED отображается шкала DOWN–NEUT–UP и цифровое значение (-100…100).
Код Arduino (ключевые фрагменты)
#include
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
const int potPin = A6;
void gauge(uint8_t angle) {
// рисуем дугу, иглу, подписи DOWN/NEUT/UP, цифровое значение w
}
void loop() {
int p = analogRead(potPin);
int w = map(p, 0, 1023, 100, -100); // значение для сима
int m = map(p, 0, 1023, 90, 0); // угол иглы
// вывод на OLED
u8g.firstPage();
do { gauge(m); } while(u8g.nextPage());
Serial.println((p - 512.0) / 512.0); // float для Python
delay(10);
}
Репозиторий
GitHub — полные исходники, схема в Fritzing, инструкции.
Производственный процесс
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Аналоговые POV-часы на Arduino Nano: персистенция зрения с 17 светодиодами
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
- Своё рулевое управление (джойстик) для игр на Arduino
- FM-радиоприемник на Arduino и модуле TEA5767
- Arduino 101: Пedometer с датчиком DHT11 и LCD-дисплеем