MultiWii на самолете
Для любителей поизвращаться - 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 – просто установить все настройки и нажать бинд на передатчике
В общем, можно пробовать - я не тестировал, только что с мотором разобрался 😦 - теперь следующих выходных ждать и надеяться на погоду.
В прошивку я раскоментировал летающие крыло и залил прошивку
Маловато будет 😃 - там достаточно много чего раскомментировать надо, хотя бы тип платы.
Кстати, в моем варианте это будет
#define HK_MultiWii_SE_V2 // Hobbyking board with MPU6050 + HMC5883L + BMP085
Возврат домой делается OpenLRSng – просто установить все настройки и нажать бинд на передатчике
Я не в курсе по поводу OpenLRSng, но неужели приемник может возвращать модель домой?
И зачем городить огород? Прошивка под MultiWii с RTH уже есть, испробована и со своей функцией полностью справляется.
Может, кому сгодится или кто добавит чего. Кому не нравится - читать не нужно.
Вот что могу добавить в целом для крыльев и самолетов:
- Есть известная проблема с 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
- Хорошо убирает вибрации на гирах эта функция:
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, но про них расскажу отдельно, если кому интересно.
Я не в курсе по поводу OpenLRSng, но неужели приемник может возвращать модель домой? И зачем городить огород? Прошивка под MultiWii с RTH уже есть, испробована и со своей функцией полностью справляется.
Она и используется, приемник только говорит, что пора домой, когда сигнал потерян 😃
Есть еще особенности по настройкам модернизированной самолетной прошивки с RTH, но про них расскажу отдельно, если кому интересно.
Да что уж, рассказывайте 😃
Правим в 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
Видео полета
На 3:57, 4:40, 5:30, 7:48 видно как проскакивают FS и связь отрубается, самолет разворачивается домой
Парни, требуется консультация.
Сделал связку 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 вообще не будет, т.е. это сделано для ДВС?
Вот картинки ГУИ
Разобрался. Вот, чтобы другие не наступали на те же грабли.
Оказывается, на трехпиновый ряд разъемов (D2 и т.д.) питание с самой платы вообще не подается, а попадает обычно с ESC, и выходы для серв оказываются не запитаны, пока не подключишь сигнальный провод от ESC на D3.
А я, как прилежный пионер, подключал по очереди сначала серву (естественно не работает), потом ее вытащил и воткнул ESC (мотор работает). Короче, тупанул😍
Выплыл баг платы. Если эл. движка вообще нет, а есть, скажем, бензиныч, то как подать питание на сервы - вопрос, или бросать соплю с +5в платы на трехрядные пины или возить для этого на борту отдельный ВЕС:(
Добрался наконец до своего ЛК. Хочу к нему мультивий на криус SE колхозить. Пока для стабилизации, в дольнейшем если попрет под ГПС и возврат.
А, как у вас успехи с мультивием на самолетах ? Есть какие новости в плане настроек ?
Multiwii с настройками по дефолту прекрасно летает на самолете.
Вышла новая прошивка с возвратом, но я ее не тестировал, не на чем. Самолет мой улетел. Отказал мотор после того, как отрубилось управление, и самолет унесло ветром хвостом вперед. Последние координаты по видеоканалу я видел на расстоянии 7-8км и 500м высоты от места взлета. Это максимум, что пробил 200мВт передатчик на 5.8Г. Найти самолет не удалось.
Печаль.
В декабре подключил Remzibi и на этом успокоился. А на днях попытался настроить Вия, и оказалось, что работают не все сервы. Подробнее тут. Буду рад любой помощи.
это мне удачно ссылку дали 😃
вчера наконец кроме размышлений заставил себя что-то сделать - а именно подключил контроллер от коптера к самолету. Контроллер 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, наверное просто “-” добавлять для реверса
у меня затык с окончательной деталью перед запуском - с этим *** армингом двигателя
по разным причинам хочу, чтобы двигатель сразу со старта был “армирован” - у меня мотор отключается в аппе тумблером и меня более чем устраивает
но что надо для этого сделать - хз
вроде очевидный вариант - в гуи поставить “галочки” на arm для всех 3-х положений какого-нибудь AUX - а вот болт; работает один раз, после перезагрузки контроллера галки стоят, а арм не активен (не подсвечен зеленым), ну и мотор не работает естественно
Вий, с включенным армингом, при подаче питания, залипает. Он стартовать должен с выключенным армом.
Вий, с включенным армингом, при подаче питания, залипает. Он стартовать должен с выключенным армом.
инфа 100%? 😉
ибо печаль тогда 😦 у меня закончились порты ввода на контроллере - похоже я сжег D8 случайно, так что на aux повесить не получиться…
у меня закончились порты ввода на контроллере
Завести по PPM?
Вот тут я немного туплю 😃
Надо читать про этот Ваш РРМ; это вообще применимо к любой аппе? К 9rx в частности?
у меня затык с окончательной деталью перед запуском - с этим *** армингом двигателя
по разным причинам хочу, чтобы двигатель сразу со старта был “армирован” - у меня мотор отключается в аппе тумблером и меня более чем устраивает
но что надо для этого сделать - хзвроде очевидный вариант - в гуи поставить “галочки” на arm для всех 3-х положений какого-нибудь AUX - а вот болт; работает один раз, после перезагрузки контроллера галки стоят, а арм не активен (не подсвечен зеленым), ну и мотор не работает естественно
Я добавил в multiwii.cpp
#if defined(FIXEDWING)
if ((rcData[THROTTLE] < MINCHECK) && (calibratingG == 0) && f.ACC_CALIBRATED) go_arm();
#endif
Надо читать про этот Ваш РРМ; это вообще применимо к любой аппе? К 9rx в частности?
Он не мой 😃 Смысл - передача нескольких каналов(чаще 8) через один провод. Аппа не важна, важно чтобы приёмник умел его отдавать.
if ((rcData[THROTTLE] < MINCHECK) && (calibratingG == 0) && f.ACC_CALIBRATED) go_arm();
2-е и 3-е условия и так проверяются в go_arm; а в каком месте вставлять? что-то у меня пока не получается 😦
2-е и 3-е условия и так проверяются в go_arm; а в каком месте вставлять? что-то у меня пока не получается 😦
Я ставил перед
//**** PITCH & ROLL & YAW PID ****
Я ставил перед
все, получилось вроде, тупил (ненавижу этот чисто сишный код с миллиардом дефайнов)