Колесо вкладки аналогового триммирования FlightGear
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
| ||||
| ||||
|
Об этом проекте
В подключении Arduino к FlightGear нет ничего нового, но я обнаружил, что вики-сайты устарели, а форумы дают ценные советы, где вам нужно работать.
Идея заключалась в том, чтобы иметь красивую, дешевую и компактную аналоговую команду для управления колесом триммера руля высоты самолета в FlightGear. Вики работает до коммуникационной части. Строго говоря, вы не можете напрямую использовать последовательную связь для передачи команд от Arduino к FlightGear. Чтобы отправлять пакеты через UDP, необходимо найти обходной путь с Python.
Что такое триммер? Это аналоговое устройство для управления отклонением триммера, который представляет собой аэродинамическое устройство, позволяющее удерживать управляющую поверхность (в данном случае лифт, регулирующий тангаж самолета) в заданном положении без каких-либо усилий со стороны пилота. Из википедии:
Дополнительные требования для этого проекта:Python с библиотеками serial
, сокет
и sys
установлен. Предполагая, что Anaconda установлена, недостающие библиотеки можно получить с помощью приглашения Anaconda, набрав:
>>> conda install -c anaconda pyserial
то же самое с серийным
и socket
. Поищите в Интернете подходящий пакет, обычно лучше всего подходят самые загружаемые для вашей платформы. После того, как у вас будет Python с этими библиотеками (и, конечно же, установлен FlightGear), вы можете перейти к следующему разделу.
Существует три сценария кода:эскиз Arduino, исполняемый сценарий Python и сценарий XML. Эскиз Arduino должен быть загружен на вашу плату. Для обеспечения связи между Arduino и FlightGear необходимо выполнить сценарий python. Сценарий XML - это общий протокол FlightGear, который необходимо переместить в
Для скетча Arduino требуется U8glib
библиотека. Как упоминалось в комментарии, отрегулируйте линию эскиза 2 с вашим дисплеем:
#include U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI
См. U8glib
примеры и документация. Скетч должен работать даже без дисплея, поэтому вы можете играть без визуальной обратной связи с доски.
Если вас не устраивает направление вращения, просто измените положение двух последних аргументов в следующей карте
инструкции
w =map (p, 0,1023,100, -100); m =map (p, 0,1023,90,0);
чтобы значения потенциометра изменялись от -100 до 100, а датчик стрелки - от 0 до 90 (это трюк, позволяющий вывести иглу в правильное положение, попробуйте сами, если вам интересно).
Сценарий python включает адрес хоста и номер последовательного порта. Хост должен быть "localhost"
. (если не работает, попробуйте 127.0.0.1
), порт любой (может быть, он лучше не используется другими приложениями, я не знаю), последовательный порт, к которому подключена ваша плата, может быть прочитан из Arduino IDE. В моем случае это «COM4»
. Примечание:если вы тестируете Arduino с помощью монитора последовательного порта, вам, возможно, придется отключить и повторно подключить плату перед выполнением скрипта python, чтобы заставить его работать правильно.
host ="localhost" port =21567 # buf =1024addr =(host, port) UDPSock =socket (AF_INET, SOCK_DGRAM) tty ="COM4" print ("tty is", tty)
Скрипт python может располагаться где угодно. Вы можете выполнить его из командной строки вашей операционной системы. В моем случае (Windows) я набираю в командной строке:
python c:\ путь \ к \ файлу \ arduinoElevatorTrim.py
Это может быть запущено до или даже после запуска FlightGear.
Наконец, как указывалось ранее, сценарий XML должен быть перемещен один раз и навсегда в папку протокола вашей установки FlightGear. Теперь вы готовы к работе. Запустите FlightGear в предпочитаемом режиме (командная строка или программа запуска), добавив следующую команду (без пробелов между символами!) :
--generic =socket, in, 30, localhost, 21567, udp, arduinoElevatorTrim
где мы говорим FlightGear применить общий протокол через сокет, читать ввод 30 раз в секунду, по адресу localhost, порт 21567, протокол UDP, инструкции в файле arduinoElevatorTrim.xml. Наслаждайтесь вашим личным обрезным колесом!
Код
- arduinoElevatorTrimOLED.ino
- arduinoElevatorTrim.py
- arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.ino Arduino
Код для загрузки на Arduino Nano. При необходимости отрегулируйте строку 2 (тип отображения).#includeU8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI int xmax =128; int ymax =64; int xcenter =xmax / 2; int ycenter =ymax / 2 + 10; int arc =ymax / 2; int angle =0; char * label ="ОБРЕЗАТЬ"; int labelXpos =53; int p, w, m; u8g_uint_t xx =0; int const potPin =A6; float potVal; // Настраиваемая функцияvoid gauge (uint8_t angle) {// рисуем границу шкалы u8g.drawCircle (xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_RIGHT); u8g.drawCircle (xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_RIGHT); u8g.drawCircle (xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_LEFT); u8g.drawCircle (xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_LEFT); // рисуем иглу float x1 =sin (2 * angle * 2 * 3.14 / 360); float y1 =cos (2 * угол * 2 * 3,14 / 360); u8g.drawLine (xcenter, ycenter, xcenter + arc * x1, ycenter-arc * y1); u8g.drawDisc (xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT); u8g.drawDisc (xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT); u8g.setFont (u8g_font_chikita); // отображение меток шкалы // u8g.drawStr (10, 42, "-1.0"); // u8g.drawStr (19, 14, "-0.5"); // u8g.drawStr (63, 14, "0"); // u8g.drawStr (92, 14, "0.5"); // u8g. drawStr (105, 42, "1.0"); u8g.drawStr (1, 42, «ВНИЗ»); u8g.drawStr (52, 17, «НЕЙТ»); u8g.drawStr (105, 42, «ВВЕРХ»); // показать метку шкалы u8g.setPrintPos (labelXpos, 32); u8g.print (этикетка); // показать цифровое значение и выровнять его положение u8g.setFont (u8g_font_profont22); если (ш> =99) {u8g.setPrintPos (47,60); } если (ш> =10 &&ш <99) {u8g.setPrintPos (54,60); } если (ш> =0 &&ш <9) {u8g.setPrintPos (60,60); } если (ш> =-9 &&ш <0) {u8g.setPrintPos (48,60); } если (ш> =-99 &&ш <-9) {u8g.setPrintPos (42,60); } если (ш <-99) {u8g.setPrintPos (35,60); } u8g.print (w);} установка void () {Serial.begin (9600); u8g.setFont (u8g_font_chikita); u8g.setColorIndex (1); // назначаем значение цвета по умолчанию if (u8g.getMode () ==U8G_MODE_R3G3B2) {u8g.setColorIndex (255); } иначе, если (u8g.getMode () ==U8G_MODE_GRAY2BIT) {u8g.setColorIndex (3); } иначе, если (u8g.getMode () ==U8G_MODE_BW) {u8g.setColorIndex (1); } иначе, если (u8g.getMode () ==U8G_MODE_HICOLOR) {u8g.setHiColorByRGB (255,255,255); }} пустая петля () {potVal =analogRead (potPin); potVal =(potVal - 512.0) /512.0; Серийный принт (potVal); Serial.print ("\ n"); // p - то же самое, что potVal, но целое число p =analogRead (potPin); w =карта (p, 0,1023,100, -100); m =карта (p, 0,1023,90,0); // показать стрелку и набрать xx =m; если (хх <45) {хх =хх + 135; } else {xx =xx - 45; } // цикл изображения {u8g.firstPage (); делать {калибр (хх); } while (u8g.nextPage ()); } delay (10);}
arduinoElevatorTrim.py Python
Скрипт, который будет выполняться вместе с FlightGear для «перевода» последовательной связи в пакеты UDP. Для выполнения этого скрипта вам потребуется установленный Python. При необходимости измените строку 14 (порт USB, к которому подключен Arduino).#! / Usr / bin / pythonimport sysimport serialfrom socket import * host ="localhost" port =21567 # buf =1024addr =(host, port) UDPSock =socket (AF_INET, SOCK_DGRAM) tty ="COM4" print ("tty is", tty) попробуйте:ser =serial.Serial (tty, 9600) за исключением:print ("Ошибка подключения к", tty) prevline ="" в то время как 1:outline ='' line =ser.readline () if line! =Prevline:# какое-то значение изменено print (line) outline =line UDPSock.sendto (outline, addr) prevline =line
arduinoElevatorTrim.xml XML
Скрипт будет добавлен в папкуXml version ="1.0"?>\ n , Триммер лифта / controls / flight / elevator-trim float
Github
Онлайн-репозиторий на Github https://github.com/dciliberti/arduinoElevatorTrimOLEDСхема
Во Fritzing нельзя проводить провода под компонентами. Провод заземления дисплея может проходить под Arduino Nano.Производственный процесс