MultiWii на самолете

varvar

Для любителей поизвращаться - Multiwii 2.3 на летучее крыло

Может, кому сгодится или кто добавит чего. Кому не нравится - читать не нужно.

Конфигурация -
Crius Multiwii v.2.5 за 25 баксов
OpenLRSng сконфигурированный на SPPM
I2C_GPS и блохастый 5 гц NEO6M
MinimOSD

Motor D3, D11 - rigth, D12 – left
жужжалку ставим на D9
У меня напряжение батарейки на ноге A0, 2S

для начала править багу (иначе i2c имеет большой шанс загнуться при старте):
EEPROM**.**cpp
было

 #if GPS
      GPS_set_pids();    // at this time we don't have info about GPS init done
    #endif
  

надо:

  #if GPS
      if (f.I2C_INIT_DONE) GPS_set_pids();    // at this time we don't have info about GPS init done
    #endif

для мотора ставим 50 гц вместо 500
config.h

#define USE_THROTTLESERVO // For use of standard 50Hz servo on throttle. - motor still on D9 but 50Hz

Gyro smoothing
config.h

      #define MPU6050_LPF_20HZ

по умолчанию задействовано 5 серв - перебор, нужно 2 сервы и мотор
правим
def.h
было

#elif defined(FLYING_WING)
    #define PRI_SERVO_FROM   4
    #if defined (USE_THROTTLESERVO)
      #define NUMBER_MOTOR   0
      #define PRI_SERVO_TO   8 // use servo from 4,5 and 8
    #else
      #define NUMBER_MOTOR   1
      #define PRI_SERVO_TO   5 // use servo from 4 to 5
    #endif

поменял

#elif defined(FLYING_WING)
    #define PRI_SERVO_FROM   4
    #if defined (USE_THROTTLESERVO)
      #define NUMBER_MOTOR   0
        #define PRI_SERVO_TO   6 // use servo from 4,5 and 6
    // VLT #define PRI_SERVO_TO   8 // use servo from 4,5 and 8
    #else
      #define NUMBER_MOTOR   1
      #define PRI_SERVO_TO   5 // use servo from 4 to 5
    #endif

а так же
Output.cpp
было

  #elif defined( FLYING_WING )
      /*****************************             FLYING WING                **************************************/
      if (!f.ARMED) {
        servo[7] = MINCOMMAND;  // Kill throttle when disarmed
      } else {
        servo[7] = constrain(rcCommand[THROTTLE], conf.minthrottle, MAXTHROTTLE);
      }
      motor[0] = servo[7];
      if (f.PASSTHRU_MODE) {    // do not use sensors for correction, simple 2 channel mixing
        servo[3] = (SERVODIR(3,1) * rcCommand[PITCH]) + (SERVODIR(3,2) * rcCommand[ROLL]);
        servo[4] = (SERVODIR(4,1) * rcCommand[PITCH]) + (SERVODIR(4,2) * rcCommand[ROLL]);
      } else {                  // use sensors to correct (gyro only or gyro+acc according to aux1/aux2 configuration
        servo[3] = (SERVODIR(3,1) * axisPID[PITCH])   + (SERVODIR(3,2) * axisPID[ROLL]);
        servo[4] = (SERVODIR(4,1) * axisPID[PITCH])   + (SERVODIR(4,2) * axisPID[ROLL]);
      }
      servo[3] += get_middle(3);
      servo[4] += get_middle(4);

поменял

  #elif defined( FLYING_WING )
      /*****************************             FLYING WING                **************************************/
      if (!f.ARMED) {
        servo[5] = MINCOMMAND;  // Kill throttle when disarmed
      } else {
        servo[5] = constrain(rcCommand[THROTTLE], conf.minthrottle, MAXTHROTTLE);
      }
      motor[0] = servo[5];
      if (f.PASSTHRU_MODE) {    // do not use sensors for correction, simple 2 channel mixing
        servo[3] = (SERVODIR(3,1) * rcCommand[PITCH]) + (SERVODIR(3,2) * rcCommand[ROLL]);
        servo[4] = (SERVODIR(4,1) * rcCommand[PITCH]) + (SERVODIR(4,2) * rcCommand[ROLL]);
      } else {                  // use sensors to correct (gyro only or gyro+acc according to aux1/aux2 configuration
        servo[3] = (SERVODIR(3,1) * axisPID[PITCH])   + (SERVODIR(3,2) * axisPID[ROLL]);
        servo[4] = (SERVODIR(4,1) * axisPID[PITCH])   + (SERVODIR(4,2) * axisPID[ROLL]);
      }
      servo[3] += get_middle(3);
      servo[4] += get_middle(4);

теперь имеем мотор - D3, D11 - rigth, D12 - left
В начале несколько импульсов неправильной длины устанавливают неправильный уровень для ESC
правим
Output.cpp

#if defined(SERVO)
  // volatile uint8_t atomicServo[8] = {5,5,5,5,5,5,5,5};
    #if defined(HW_PWM_SERVOS)
      // hw servo pwm does not need atomicServo[]
    #elif defined(PROMINI) || (defined(PROMICRO) && defined(HWPWM6))
      #if defined(AIRPLANE) || defined(HELICOPTER)
        // To prevent motor to start at reset. atomicServo[7]=5 or 249 if reversed servo
        volatile uint8_t atomicServo[8] = {125,125,125,125,125,125,125,5};
      // VLT begin
              #elif defined(FLYING_WING)
                // for ESC - 1ms is lowest throttle
        volatile uint8_t atomicServo[8] = {125,125,125,125,125,5,125,125};
              // VLT end
              #else

                volatile uint8_t atomicServo[8] = {125,125,125,125,125,125,125,125};
      #endif
    #else
      #if defined(AIRPLANE)|| defined(HELICOPTER)
        // To prevent motor to start at reset. atomicServo[7]=5 or 249 if reversed servo
        volatile uint16_t atomicServo[8] = {8000,8000,8000,8000,8000,8000,8000,320};
      #else
        volatile uint16_t atomicServo[8] = {8000,8000,8000,8000,8000,8000,8000,8000};
      #endif
    #endif
  #endif

жужжалку ставим на D9
config**.**h

  #define OVERRIDE_BUZZERPIN_PINMODE pinMode (9, OUTPUT);
    #define OVERRIDE_BUZZERPIN_ON PORTB |= 0x02;
    #define OVERRIDE_BUZZERPIN_OFF PORTB &= ~0x02;

измеряем напругу
config.h

    #define VBAT              // uncomment this line to activate the vbat code
      #define VBATSCALE       131 // (*) (**) change this value if readed Battery voltage is different than real voltage
    #define VBATNOMINAL      84 // 12,6V full battery nominal voltage - only used for lcd.telemetry
      #define VBATLEVEL_WARN1  71 // (*) (**) 10,7V
      #define VBATLEVEL_WARN2  66 // (*) (**) 9.9V
      #define VBATLEVEL_CRIT   62 // (*) (**) 9.3V - critical condition: if vbat ever goes below this value, permanent alarm is triggered
      #define NO_VBAT          16 // Avoid beeping without any battery
 

куда ж без GPS?
config**.**h

    #define I2C_GPS
      #define MAG_DECLINATION  9.82f  // правьте под свое!

передатчик далек от идеала, посему
config**.**h

    #define SERIAL_SUM_PPM         ROLL,PITCH,THROTTLE,YAW,AUX1,AUX2,AUX3,AUX4,8,9,10,11 //For Robe/Hitec/Futaba
      #define DEADBAND 25

полезно:
config.h

#define GYROCALIBRATIONFAILSAFE

Возврат домой делается OpenLRSng – просто установить все настройки и нажать бинд на передатчике

В общем, можно пробовать - я не тестировал, только что с мотором разобрался 😦 - теперь следующих выходных ждать и надеяться на погоду.

zerokul:

В прошивку я раскоментировал летающие крыло и залил прошивку

Маловато будет 😃 - там достаточно много чего раскомментировать надо, хотя бы тип платы.

Кстати, в моем варианте это будет
#define HK_MultiWii_SE_V2 // Hobbyking board with MPU6050 + HMC5883L + BMP085

lotophagi

Возврат домой делается OpenLRSng – просто установить все настройки и нажать бинд на передатчике

Я не в курсе по поводу OpenLRSng, но неужели приемник может возвращать модель домой?
И зачем городить огород? Прошивка под MultiWii с RTH уже есть, испробована и со своей функцией полностью справляется.

Может, кому сгодится или кто добавит чего. Кому не нравится - читать не нужно.

Вот что могу добавить в целом для крыльев и самолетов:

  1. Есть известная проблема с gps по i2c со сбросом расстояния домой после 655 метров (www.rcgroups.com/forums/showpost.php?p=25545123&po…). Показания обнуляются, и приходиться считать количество сбросов и постоянно держать в голове во время полета.
    Тут описывается решение проблемы
    www.multiwii.com/forum/viewtopic.php?f=8&t=2817&p=…
    Или от сюда заливаем в конвертер модернизированную прошивку github.com/disq/i2c-gps-nav
    Надо раскомментировать строку в прошивке i2c-gps-nav:
    config.h
#define DISTANCE_TO_HOME_IN_METERS // WARNING! IF YOU DEFINE THIS YOU MUST MODIFY MULTIWII SOURCE!!!

…и закомментировать в прошивке Multiwii:
GPS.ino

//GPS_distanceToHome = GPS_distanceToHome / 100;      //register is in CM, we need in meter. max= 655 meters with this way
  1. Хорошо убирает вибрации на гирах эта функция:
    config.h
      /* GYRO_SMOOTHING. In case you cannot reduce vibrations _and_ _after_ you have tried the low pass filter options, you
         may try this gyro smoothing via averaging. Not suitable for multicopters!
         Good results for helicopter, airplanes and flying wings (foamies) with lots of vibrations.*/
      #define GYRO_SMOOTHING {20, 20, 3}    // (*) separate averaging ranges for roll, pitch, yaw

Есть еще особенности по настройкам модернизированной самолетной прошивки с RTH, но про них расскажу отдельно, если кому интересно.

varvar
lotophagi:

Я не в курсе по поводу OpenLRSng, но неужели приемник может возвращать модель домой? И зачем городить огород? Прошивка под MultiWii с RTH уже есть, испробована и со своей функцией полностью справляется.

Она и используется, приемник только говорит, что пора домой, когда сигнал потерян 😃

lotophagi:

Есть еще особенности по настройкам модернизированной самолетной прошивки с RTH, но про них расскажу отдельно, если кому интересно.

Да что уж, рассказывайте 😃

lotophagi

Правим в config.h:

  • важно раскомментировать
#define DONT_RESET_HOME_AT_ARM 
  • переключение режимов я повесил на D8, т.к. на D12 висит серва (или правим код)
#define RCAUXPIN8
  • желательно сервы оттриммировать здесь а не в передатчике
#define SERVO_OFFSET     {  0,   0,   0,  0,   0,   0,  0,   0 }

В гуи теперь надо настроить полетные режимы. Я поставил на трех-позиционный тумблер HORIZON+BARO, ANGLE и PASSTHRU. На второй двух-позиционный повесил GPS_HOME и ARM (среднее положение и крайнее, см. картинку)

На Failsafe приемника надо настроить уровень газа и включение режимов HORIZON и GPS HOME

FW_Nav_130322 прошивка для MultiWii www.ex.ua/load/83808740 (Выставляем свою плату, датчики и магнитное склонение)
i2c-gps-nav www.ex.ua/load/83809003
MinimOSD www.ex.ua/load/83814772

Видео полета

youtu.be/z6f4gh8O_gc

На 3:57, 4:40, 5:30, 7:48 видно как проскакивают FS и связь отрубается, самолет разворачивается домой

19 days later
Flutter

Парни, требуется консультация.
Сделал связку Crius AIO и Remzibi OSD. Зашит допиленный под ремзиби мультивий 2.2 в режиме airplane. Криус запитан от внешнего ВЕСа, подключены ВТ, ЖПС МТК-3329, приемник FrSky D4R-II по PPMSum. Arming движка выведен через AUX1. Все работает, в ГУИ ползунки бегают, диапазоны изменения 1000- 2000, subtrim`ы выставлены на 1500, ремзиби правильно накладывает цифирьки в AmCap. Вопрос: Почему не работают сервы при подключении к D2, D5, D6, D7 (перенесен с D37). М.б. что-нибудь забыл раскомментить?

Config.h

#define AIRPLANE
#define CRIUS_AIO_PRO_V1
закомментил //#define ALLOW_ARM_DISARM_VIA_TX_YAW
#define SERIAL_SUM_PPM ROLL,PITCH,THROTTLE,YAW,AUX1,AUX2,AUX3,AUX4,8,9,10,11
#define PPM_ON_THROTTLE
#define GYRO_SMOOTHING {20, 20, 3}
#define GPS_SERIAL 2
#define MTK_BINARY19
#define INIT_MTK_GPS
#define MAG_DECLINIATION 9.63f
#define OSD_REMZIBI_SERIAL 1
#define RX_RSSI_PIN A3
#define MOTOR_STOP

def.h
изменения для переноса сервы 1 элерона с 37 пина на 7-й

#define SERVO_4_PINMODE pinMode (37, OUTPUT); pinMode (7, OUTPUT);
#define SERVO_4_PIN_HIGH PORTC |= 1<<0;PORTH |= 1<<4;
#define SERVO_4_PIN_LOW PORTC &= ~(1<<0);PORTH &= ~(1<<4);

Попутно еще вопросик, если раскомментить
#define USE_THROTTLESERVO // For use of standard 50Hz servo on throttle
то выхода на ESC вообще не будет, т.е. это сделано для ДВС?

Вот картинки ГУИ

Flutter

Разобрался. Вот, чтобы другие не наступали на те же грабли.
Оказывается, на трехпиновый ряд разъемов (D2 и т.д.) питание с самой платы вообще не подается, а попадает обычно с ESC, и выходы для серв оказываются не запитаны, пока не подключишь сигнальный провод от ESC на D3.
А я, как прилежный пионер, подключал по очереди сначала серву (естественно не работает), потом ее вытащил и воткнул ESC (мотор работает). Короче, тупанул😍
Выплыл баг платы. Если эл. движка вообще нет, а есть, скажем, бензиныч, то как подать питание на сервы - вопрос, или бросать соплю с +5в платы на трехрядные пины или возить для этого на борту отдельный ВЕС:(

29 days later
flygreen

Добрался наконец до своего ЛК. Хочу к нему мультивий на криус SE колхозить. Пока для стабилизации, в дольнейшем если попрет под ГПС и возврат.

А, как у вас успехи с мультивием на самолетах ? Есть какие новости в плане настроек ?

lotophagi

Multiwii с настройками по дефолту прекрасно летает на самолете.
Вышла новая прошивка с возвратом, но я ее не тестировал, не на чем. Самолет мой улетел. Отказал мотор после того, как отрубилось управление, и самолет унесло ветром хвостом вперед. Последние координаты по видеоканалу я видел на расстоянии 7-8км и 500м высоты от места взлета. Это максимум, что пробил 200мВт передатчик на 5.8Г. Найти самолет не удалось.

21 days later
Flutter

В декабре подключил Remzibi и на этом успокоился. А на днях попытался настроить Вия, и оказалось, что работают не все сервы. Подробнее тут. Буду рад любой помощи.

8 days later
fat_hamster

это мне удачно ссылку дали 😃

вчера наконец кроме размышлений заставил себя что-то сделать - а именно подключил контроллер от коптера к самолету. Контроллер Crius SE v2, самолет - пушер с V- хвостом

собрал, код чуть подправил, что-то заработало (лежит на столе в куче, самолет собрать не было ни метса, ни времени… час ночи однако) - плату наклоняю, сервы отрабатывают что-то
слегка “истерично”, настройку для чувствительности видел, но то на потом

я туплю, но не могу найти в коде (2.3 мультивии), где инвертировать сервы?! для элеронов инвертировал в гуе одну машинку, но то не дело, если перешью со сбросом eeprom и забуду про донастроить
для хвоста вообще пока хардкодом микс сделал

с одной стороны, делаю себе, хардкоды - не страшно; кроме того, там же есть деф MY_PRIVATE_MIXING, можно свой код в отдельный файлик, тогда и проблем с обновлением исходников никаких
а с другой - “абидно, слушай”… все цитируют строчку для раскомментирования реверса серв, но ее в коде нет (правда мне лень было исходники 2.2 посмотреть, может поменялось что-то в коде)

кажется мне я вчера зря поленился и не посмотрел, что вот это в config.h делает

/* if you want to preset min/middle/max values for servos right after flashing, because of limited physical
* room for servo travel, then you must enable and set all three following options */
//#define SERVO_MIN {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020}
//#define SERVO_MAX {2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000}
//#define SERVO_MID {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500} // (*)
//#define FORCE_SERVO_RATES {30,30,100,100,100,100,100,100} // 0 = normal, 1= reverse

(у меня есть оправдание конечно - спать хотелось)
FORCE_SERVO_RATES наверно надо раскоментить и править; из комента правда непонятно, какие 0, какие 1, если там число до 100, наверное просто “-” добавлять для реверса

fat_hamster

у меня затык с окончательной деталью перед запуском - с этим *** армингом двигателя

по разным причинам хочу, чтобы двигатель сразу со старта был “армирован” - у меня мотор отключается в аппе тумблером и меня более чем устраивает
но что надо для этого сделать - хз

вроде очевидный вариант - в гуи поставить “галочки” на arm для всех 3-х положений какого-нибудь AUX - а вот болт; работает один раз, после перезагрузки контроллера галки стоят, а арм не активен (не подсвечен зеленым), ну и мотор не работает естественно

lotophagi

Вий, с включенным армингом, при подаче питания, залипает. Он стартовать должен с выключенным армом.

fat_hamster
lotophagi:

Вий, с включенным армингом, при подаче питания, залипает. Он стартовать должен с выключенным армом.

инфа 100%? 😉
ибо печаль тогда 😦 у меня закончились порты ввода на контроллере - похоже я сжег D8 случайно, так что на aux повесить не получиться…

schs
fat_hamster:

у меня закончились порты ввода на контроллере

Завести по PPM?

fat_hamster

Вот тут я немного туплю 😃
Надо читать про этот Ваш РРМ; это вообще применимо к любой аппе? К 9rx в частности?

gena_g
fat_hamster:

у меня затык с окончательной деталью перед запуском - с этим *** армингом двигателя

по разным причинам хочу, чтобы двигатель сразу со старта был “армирован” - у меня мотор отключается в аппе тумблером и меня более чем устраивает
но что надо для этого сделать - хз

вроде очевидный вариант - в гуи поставить “галочки” на arm для всех 3-х положений какого-нибудь AUX - а вот болт; работает один раз, после перезагрузки контроллера галки стоят, а арм не активен (не подсвечен зеленым), ну и мотор не работает естественно

Я добавил в multiwii.cpp

#if defined(FIXEDWING)
if ((rcData[THROTTLE] < MINCHECK) && (calibratingG == 0) && f.ACC_CALIBRATED) go_arm();
#endif

schs
fat_hamster:

Надо читать про этот Ваш РРМ; это вообще применимо к любой аппе? К 9rx в частности?

Он не мой 😃 Смысл - передача нескольких каналов(чаще 8) через один провод. Аппа не важна, важно чтобы приёмник умел его отдавать.

fat_hamster
gena_g:

if ((rcData[THROTTLE] < MINCHECK) && (calibratingG == 0) && f.ACC_CALIBRATED) go_arm();

2-е и 3-е условия и так проверяются в go_arm; а в каком месте вставлять? что-то у меня пока не получается 😦

gena_g
fat_hamster:

2-е и 3-е условия и так проверяются в go_arm; а в каком месте вставлять? что-то у меня пока не получается 😦

Я ставил перед
//**** PITCH & ROLL & YAW PID ****

fat_hamster
gena_g:

Я ставил перед

все, получилось вроде, тупил (ненавижу этот чисто сишный код с миллиардом дефайнов)