MultiWii
Можно-то все, только нужно ли? 😃 I-ветка нужна, чтобы батарейку к одному лучу вешать и потом хвастаться, что не кренится. Управление с ней получается дифференциального типа: любое отклонение “тарелки” будет постепенно сведено к нулю. Причем, при отклоненном стике! А при возврате стика в 0 , как бы сказать, “отдача замучает”.
Я уже тут писал, что нужно в режиме level не плюсовать level PID и RC command, а суммировать Angle и RC непосредственно перед ПИДом. Т.е. ручкой задавать угол “тарелки” непосредственно.
С другой стороны, IMU организован сам по себе криво, и не стоит пока его как-то преобразовывать. Путного выйдет мало. Лучше подождать MARG.
У тебя I автолевела сейчас на нуле или в каком значении?
Ну ты подскажи все-таки как повесить I на крутилку, хотя бы мельком, если не ломает 😃
Ты езе в ветер не летал? там свои замороки, поэтому все может понадобится, не хочется в поле все время лазить в ноут и корректировать I.
Я пока сам разбираюсь:
Значение I для автолевела хранится в переменной ILEVEL8,
щас придумаю как ее обработать.
Ну, хватит выводов, смотрите видос.
дааа, однако летает! прийдется не выкидывать а настраивать, я уже перестал верить что оно летает нормально.
а моторчики то детцл, а такие пропы таскают.
Олег, какой вес аппарата на видео летает? (с учетом батарейки.)
а моторчики то детцл, а такие пропы таскают.
Ничего себе децл )) эти моторы тягают до 1.2кг, DT700, весят 78гр.
У Олега аппарат может пару кило сахара через границу с молдавией таскать только так 😃
менялось значение I автолевела
www.arduino.cc/en/Reference/map
long custommap(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
соответственно например I = custommap (то_что_получаем_от_приемника, минимум_который_можем_получить_от_приемника, максимум_который_можно_получить_от_приемника, минимум_для_I, максимум_для_I);
и еще внутрь функции custommap можно запихнуть что-то вроде:
if ((nunchukPresent == 1 || accPresent == 1) && то_что_получаем_от_приемника>пороговое_значение) accMode = 1; else accMode = 0;
будет менять I на лету и включать стабилизацию
Глеб, это все не то,
Мне не автолевел нужно включать, а подмешивать значение крутилки AUX1 в значение переменной ILEVEL8, причем до того как ILEVEL8 уйдет в расчет **** PITCH & ROLL & YAW PID **** или еще куда, пока не разобрался
Ну ты подскажи все-таки как повесить I на крутилку, хотя бы мельком, если не ломает Ты езе в ветер не летал? там свои замороки, поэтому все может понадобится, не хочется в поле все время лазить в ноут и корректировать I.
Прошу не обижаться, но мне кажется что это из той же серии, что и “не было у бабки проблем, купила козу”. 😃
Может лучше приделать LCD, чтобы было легко настраивать, там ведь в новой версии 1.претер7 есть поддержка новых дешевых LCDшек.
не автолевел нужно включать
значит без этой строчки if ((nunchukPresent == 1 || accPresent == 1) && то_что_получаем_от_приемника>пороговое_значение) accMode = 1; else accMode = 0;
а подмешивать значение крутилки AUX1 в значение переменной ILEVEL8
ну примерно тоже самое, будет что-то вроде:
defILEVEL8=ILEVEL8; - где то переопределяем, чтобы всегда было
ILEVEL8 = custommap (rcData[AUX1], 1000, 2000, минимум_для_I, максимум_для_I) + defILEVEL8; до того как оно в расчет уйдет (и хз + или нет, смотря как надо подмешивать)
и еще надо поковырять writeParams() - чтобы в память записывать новый параметр, чтобы оно вернулось после ребута ардуинки
Завистники! )) Никаких LCD, еще я буду коптер нfстраивать аппой чеpеp LCD, вот делать мне нечего! )
и еще надо поковырять writeParams() - чтобы в память записывать новый параметр, чтобы оно вернулось после ребута ардуинки
Зачем вернулось, не надо, пусть зашито будет что зашили через комп, крутилку же я не кручу все время.
Попробуем…
ILEVEL8 это тысячные от 0 до 0.255
Процедурка от Глеба очень полезная в нашем случае.
Нижеуказанное вставить перед просчетом level PID после этого:
//**** PITCH & ROLL & YAW PID ****
#define i_zero 1300 // мин. уровень крутилки для I=0 (макс пусть будет 2000)
#define ilevel_max 56 // макс уровень level I
if (rcData[YAW]>=i_zero)
ILEVEL8=custommap(rc_data,i_zero,2000,0,ilevel_max);
else ILEVEL8=0;
Ну вот, обогнали… 😦
Ага, нафлудили вон скока пока я сексом занимался с нунчаком, пойду в разрез публике- Мулти вии с нунчаком-гуано и маст дай!!! но с гирой-ласковый и предсказуемый аппарат 😃
Вкратце-протрахался ВСЮ прошлую неделю! Дергается коптер как паралитик!!Причем настройкиPID особо не сильно влияли на эту колбасню! ЧТо я тока не делал, три бубна пробил до дыр,прошивал-перепрошивал всеми прошивками, расхерачил руку до крови, на обоях теперь следы от пропеллеров, на паркете следы от валов и цанг пропеллеров, в минусе куча времени, нервов и бабла потраченного на дополнительные мозги, регули и моторы(на которые я грешил по очереди) плюсе-ТРИ коптера собранные в процессе околонаучных экспериментов которые впрочем ни один нормально не полетели до тех пор пока я не отпаял и не выкинул нах нунчак этот гребаный!!! кароче похоже что с циклом больше 3000-4000 коптер нормально не летит а чтоб добиться такого цикла на безмозглой нано/мини ардуине нужен аксель отдельный но никак не нунчак, не оно конечно летит и висит но при подпаяном нунчаке все равно присутствуют мелкие непредсказуемые подергивания и рывки(даже с отключеной стабилизацией)
Теперь я понял почему Warthox летает только с гирами без нунчаков
if (rcData[YAW]>=i_zero) ILEVEL8=custommap(rc_data,i_zero,2000,0,ilevel_max); else ILEVEL8=0;
Олег, почему rcData[YAW]?
Вот кусок кода pretor:
//**** PITCH & ROLL & YAW PID ****
for(axis=0;axis<3;axis++) {
if (accMode == 1 && axis<2 ) { //LEVEL MODE
errorAngle = rcCommand[axis]/2 - angle[axis]/2;
PTerm = (errorAngle)*PLEVEL8/50 - gyroData[axis]*dynP8[axis]/10;errorAngleI[axis] += errorAngle;
errorAngleI[axis] = constrain(errorAngleI[axis],-5000,+5000); //WindUp
ITerm = errorAngleI[axis] *ILEVEL8/2000;
Нам же надо вмешаться в Iterm, нет?
ааа тьфу11111 перепутал с AUX1 (или 2)
Вмешиваться именно в ILEVEL8
код втыкать между //**** PITCH & ROLL & YAW PID ****
и for(axis=0;axis<3;axis++)
В Гуи поубирать галочки, чтобы выделенным каналом ничего другого не включалось.
Олег, ну ты крут 😃 Буду сегодня пробывать вечером!
А у меня и нет пока ничего другого, это Алил у нас закупился сенсорами по самые небалуйся 😃
это Алил у нас закупился сенсорами по самые небалуйся
У меня только 1 плата с сенсорами ❗ 😆
(3 заказанных мною акселя от Норберта еще не дошли)
У меня уже был опыт получения безтрековой посылки через 3 месяца, т.что еще жду (то же самое относится к Вийю от дилэкстрим)
А с 3205 кто либо нормально полетел ?
Пара есть - а делать плату под них или нет - решаю .
А кто как крепит между собой нунчак и моушен плюс? вопрос к тем у кого дергается.
Сегодня наконец-то заберу регуль и запущу своего малыша))))
У мну связка нунчак+MP на прошлом коптере нормально работала… Если и эта будет работать, то буду думать что мне помогают сторонние силы))))))
А кто как крепит между собой нунчак и моушен плюс?
Я их спаял один над другим и склеил термоклеем
Если и эта будет работать, то буду думать что мне помогают сторонние силы)))))
Я вот вчера уже начал думать что мне мешаю потусторонние как раз 😃
Димка не сцать, нормально с нунчаком летать должно, позвонил бы, решили что там у тя не летает.
вопрос к остальным- все что то улучшают прошивки улучшают, а никто не выкладывает промежуточные готовые результаты
Вот решился написать. Прочитал всю тему начиная с трикоптера. Все собрал, настроил. Но мне кажется можно выжать большего. Обратите внимание на видео, небольшая болтанка, может я где-то проглядел, это излечимо?
И вот ещё! В ходе настройки и прыганья приложил аппарат об пол, немного выгнул держатель мотора или как его назвать. Решил попробовать установить все двигатели таким образом. Каракатица стала на порядок устойчивей!
Вот такую “Маму” развел себе, кому надо пользуйтесь.
Размеры 59х59мм
В архиве небольшой ридмик.
Сделана под Arduino Nano V3.0 + Wii + BMA-020, в принципе ставить можно что угодно, i2C пины есть, остальное дело фантазии.
Пойду “фаршировать” 😇