Проект Мегапират на самик!

ViktorDoma
LeonVS:

Господа, а можно как то вызвать LAND режим, дабы протестировать кой чего?
Хочу выпустить закрылки при включении сие режима. У кого есть навыки кодинга в пирате, подскажите 😃?

case MAV_CMD_NAV_LAND:
calc_nav_roll();

if (g.airspeed_enabled == true){
calc_nav_pitch();
calc_throttle();
}else{
calc_nav_pitch(); // calculate nav_pitch just to use for calc_throttle
calc_throttle(); // throttle based on altitude error
nav_pitch = landing_pitch; // pitch held constant
}

if (land_complete){
g.channel_throttle.servo_out = 0;
Сюда вставляем допустим 8 канал отклонить на 50%
}
break;

Это нужный кусок кода???

Боюсь, что нет.
Давайте я сегодня вечером перепроверю свой вариант миксера и выложу его для пробы.

А заодно посмотрю как отрабатывается переключение режимов полета по миссии полета.

А то может Олег заглянет и подскажет ПРАВИЛЬНОЕ решение.

LeonVS

Было бы не плохо 😃 Искал как правильно обзываются доп каналы, чтот не понял толком… По основным все понятно
g.channel_throttle.servo_out
g.channel_roll.servo_out
g.channel_pitch.servo_out
g.channel_rudder.servo_out
А как обзываются допы??? Не зная имени послать туда что то проблематично 😃

ViktorDoma

Отправить конкретное значение для выходных Каналов (Значение от 1000 до 2000)

APM_RC.OutputCh(CH_3, Значение); // send to Servos // R1 Тротле
APM_RC.OutputCh(CH_4, Значение); // send to Servos // R2 Рудер
APM_RC.OutputCh(CH_1, Значение); // send to Servos // R3 РОЛЛ
APM_RC.OutputCh(CH_2, Значение); // send to Servos // R4 ПИТЧ
APM_RC.OutputCh(CH_7, Значение); // send to Servos // R5
APM_RC.OutputCh(CH_8, Значение); // send to Servos // R6
APM_RC.OutputCh(9, Значение); // send to Servos // R7
APM_RC.OutputCh(10, Значение); // send to Servos // R8
APM_RC.OutputCh(CH_5, Значение); // send to Servos // Pan
APM_RC.OutputCh(CH_6, Значение); // send to Servos // Tilt

Пользовать крайне осторожно , предварительно откатав на столе.
Лучше всего запихивать в _MIXER - в процедуру flight_mixer(void) - она вызывается после всех обработок автопилотом.

LeonVS:

servo_out

Это переменная используется в системе стабилизации и нафигации. Не стоит пользовать пока не разберетесь как она дрыгается.

LeonVS

Хм… просто выпуск закрылков надо встроить в процедуру отвечающую за режим посадки.
А servo_out как раз таки там и используется для выключения движки… Тобишь по логике туда бы надо вставить и команду выпуска закрылок…

case MAV_CMD_NAV_LAND:
calc_nav_roll();

if (g.airspeed_enabled == true){
calc_nav_pitch();
calc_throttle();
}else{
calc_nav_pitch(); // calculate nav_pitch just to use for calc_throttle
calc_throttle(); // throttle based on altitude error
nav_pitch = landing_pitch; // pitch held constant
}

if (land_complete){
g.channel_throttle.servo_out = 0;
APM_RC.OutputCh(CH_8, 1800);
}
break;

Но что то мне подсказывает, что так оно работать не будет 😃

ViktorDoma
LeonVS:

if (land_complete){
g.channel_throttle.servo_out = 0;
APM_RC.OutputCh(CH_8, 1800);
}

Раз движок вырубает, значит процедура посадки выполнена, тоесть борт уже у самой земли.
Моё ИМХО закрылки выпускать уже поздно, так как полет у заемли и так не стабилен, а закрылки могут внести дисбаланс.

Как вариант - нужно делать замедлитель канала, чтобы закрылки выходили постепенно, секунд за 5-6. Это даст время в случае не штатного поведения переключиться в мануал.

А в идеале, ЗАКРЫЛКИ выпускаютя на глисаде, до того как борт достигнет посадочной зоны (полосы).

К сожалению я так и не добрался до пирата. Завтра днюха у супруги и меня не поймут если я засяду за “самолетики”.

Так что теперь ТОЧНО только после НГ смогу занятся Пиратом вплотную.

ВСЕХ С НОВЫМ ГОДОМ !!!

LeonVS
ViktorDoma:

Раз движок вырубает, значит процедура посадки выполнена

Как показала практика это не совсем так, посмотрите мой лог полета… как только самуль заходит в точку координат автопосадки он выключает движок и следует куда летел поддерживая курс, нулевой крен и тангаж. А так как скай планирует очень не плохо, с метров 20-30 он крайне далеко умотает 😃
Поэтому и хочется сделать что при входе в точку автопосадки, он одновременно с выключением движка выпускал закрылки.

ViktorDoma:

закрылки могут внести дисбаланс.

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

Всех с НАСТУПАЮЩИМ!!!

LeonVS
ViktorDoma:

Отправить конкретное значение для выходных Каналов (Значение от 1000 до 2000)

Нароооодд!!! Хватит уже бухать!!! 😃 Давай те все же победим отправку определенного значения на доп каналы из процедуры автопосадки. Тестить можно используя “автовзлет”, его можно тестить дома, вызвать гораздо проще, счелкнув тумблером 😃
Моск ужо сломал, не хочет реагировать ващще никак…
Самое смешное при замене:
g.channel_throttle.servo_out = g.throttle_max;
На:
g.channel_throttle.servo_out = 0;
При включении автовзлета эта хрень все равно газует!!! Может не там копаю, в общем хрень какая то нездоровая… 😦

case MAV_CMD_NAV_TAKEOFF:
if (hold_course > -1) {
calc_nav_roll();
} else {
nav_roll = 0;
}

if (g.airspeed_enabled == true)
{
calc_nav_pitch();
if (nav_pitch < (long)takeoff_pitch) nav_pitch = (long)takeoff_pitch;
} else {
nav_pitch = (long)((float)g_gps->ground_speed / (float)g.airspeed_cruise * (float)takeoff_pitch * 0.5);
nav_pitch = constrain(nav_pitch, 500l, (long)takeoff_pitch);
}

g.channel_throttle.servo_out = g.throttle_max; //TODO: Replace with THROTTLE_TAKEOFF or other method of controlling throttle
APM_RC.OutputCh(10, 1800); // попытка победить закрылок 😃

// ******************************

break;

К стати при вклячивании сей команды в миксер, оно отрабатывает!!!

APM_RC.OutputCh(CH_1, chm_out[0]+1500); // send to Servos
APM_RC.OutputCh(CH_2, chm_out[1]+1500); // send to Servos
APM_RC.OutputCh(CH_3, chm_out[2]+g.channel_throttle.radio_min); // send to Servos
APM_RC.OutputCh(CH_4, chm_out[3]+1500); // send to Servos
APM_RC.OutputCh(CH_7, chm_out[4]+1500); // send to Servos
APM_RC.OutputCh(CH_8, chm_out[5]+1500); // send to Servos
APM_RC.OutputCh(10, 1500); // Установка сервы 8 канала в нужное положение.

Почему же тогда эта команда не пашет в функции автовзлета допустим??? Походу я чего то упускаю…

Думаю можно пойти через переменную, и в функции автопосадки присваивать ей нужное значение, отсюда вопрос, как задекларировать переменную чтоб она работала во всех “закладках” 😃?

ViktorDoma

Глобальные переменные объявляются в MegaPiratePlane.pde, но Вам это не нужно.

LeonVS:

g.channel_throttle.servo_out = g.throttle_max; //TODO: Replace with THROTTLE_TAKEOFF or other method of controlling throttle
APM_RC.OutputCh(10, 1800); // попытка победить закрылок

Команда отрабатывает, но поскольку эта команда вставлена в процедуру, которая вызызывается в сложном цикла, ее скорее всего перебивает какая то другая.
Где именно её перебивает нет смысла искать. Проще выдать команду после всех обработок и процедур.

Попробуйте следующее:

Зайдите во вкладку _MIXER.

После строк APM_RC.OutputCh(CH…) вставьте:

if(control_mode == AUTO){ // Если включен режим полета AUTO
if(command_must_ID == MAV_CMD_NAV_LAND) { // Если ВЫПОЛНЯЕТСЯ АВТО КОМАНДА ПОСАДКА
if (land_complete){ ЕСЛИ ПОСАДКА ВЫПОЛНЕНА
APM_RC.OutputCh(10, 1500); // Установить значение 8 канала в 1500
}
}
}

Можно доработать команду на 8-ю ногу с замедлением, если нужно, но тогда потребуется промежуточная переменная.

Вроде гульбища заканчиваются, скоро займёмся полётами. У нас туман и дожжжжи. Иногда выходит солнце, но сЦукко не вовремя всегда.

LeonVS

Все гениальное просто! И что я сразу об этом не подумал… Остальное дело техники, по крайней мере на режим авто уже реагирует адекватно 😃 Пошел искать как в арду языке выглядит оператор “иначе” 😃

Гы, как и в бейсике “else” 😃

LeonVS

Хм… чтот опять уперся в стену, вроде все правильно, режим авто отрабатывает как надо, а вот команды автопосадки и авто взлета не ловит… Вроде все правильно, дайте наводку 😃?

if(control_mode == AUTO){ // Если включен режим полета AUTO
switch(command_must_ID){
case MAV_CMD_NAV_TAKEOFF:
APM_RC.OutputCh(10, 1100); // Установить закрылки на взлетный режим
break;
case MAV_CMD_NAV_LAND:
APM_RC.OutputCh(10, 2000); // Установить закрылки на режим посадки
break;
default:
APM_RC.OutputCh(10, 800); // Закрылки убраны
break;
}

} else {
APM_RC.OutputCh(10, 800); // Закрылки убраны
}

LeonVS

Только с поля вернулись, ну что сказать мое довольное 😃 Код работает!!! И взлетный режим и посадочный отрабатывают отлично 😃
А дома не работало, так как ГПС спутников не видел, соответственно авторежим не активировался со всеми вытекающими 😃
В общем работает следующим образом, взлетный режим включается когда в программе задан автовзлет, автопилот врубает двиг на полную и выпускает закрылки на взлетный режим. После окончании программы автовзлета закрылки убираются. Далее выпуск закрылок на посадочный режим происходит когда самуль проходит последнюю точку маршрута (соответственно ее ставим чтоб самуль шел против ветра ну и высоту метров 10) Далее оно на холостом с закрылками пытается лезть на точку автопосадки, сегодня был ветерок 6-8 метров, самуль с закрылками почти стоял на месте 😃 когда достигает точки автопосадки отключает двиг и походу по курсу уже не управляется… держит внуле тангаж и крен ну а по курсу куда бог пошлет, у нас метров с 5 улетал метров на 50 максимум 😃 Нужен датчик бароскорости, при этом было бы управление тангажом, садился бы думаю вообще на пяточок 😃
В общем кто хочет активировать закрылки надо вставить вот этот код в закладку “_MIXER” как посоветовал Виктор после строк:
APM_RC.OutputCh(CH…)

if(control_mode == AUTO){ // Если включен режим полета AUTO
switch(command_must_ID){
case MAV_CMD_NAV_TAKEOFF:
APM_RC.OutputCh(10, 1200); // Установить закрылки на взлетный режим
break;
case MAV_CMD_NAV_LAND:
APM_RC.OutputCh(10, 2000); // Установить закрылки на режим посадки
break;
default:
APM_RC.OutputCh(10, 950); // Закрылки убраны
break;
}

} else {
APM_RC.OutputCh(10, 950); // Закрылки убраны
}

Данный код 2 раза пролетел по точкам в полной автономке с авто взлетом и автопосадкой, так что вполне жизнеспособен 😃
Циферы соответственно подобрать свои для нужного положения закрылок. Закрылки висят на 8 канале у вортекса.

Походу все бухают, а я тихо сам с собой веду беседу 😁

Syberian

Леонид и Виктор, спасибо за закрылки 😃 Я молчал, т.к. умного сказать было нечего.

Код сейчас включу в 2.24, только причешу дефайнами. Еще нужно повыковыривать из кода и библиотек все команды управления этим портом, чтобы больше никто не оверайдил.

Ну, еще есть вариант включить как субканал в сам миксер. Чтобы “бабочку” делать можно было.

LeonVS
Syberian:

Чтобы “бабочку” делать можно было.

Лишним конечно не будет, хотя если рассматривать скай, то там такая лопата, хватает за глаза, при полном выпуске самуль практически уже парашютирует 😃 А элероны пусть лучше стабилизируют, без отклонения вверх, полагаю это у них лучше должно получаться 😃 А для других ЛА где закрылки отсутствуют, будет пользоваться спросом 😃

Syberian

Проект обновлен. Пока просто причесал. В миксере надо тестировать сначала.

ViktorDoma

Леонид, рад что у Вас заработало.
Я, пля, никак не доберусь до кода, к компу урывками прорываюсь.
И это при всем при том что я ВАЩЕ не бухаю.

LeonVS

Народ, Е-ОСД кто нить пробовал от 4 банок питать? В доках 2-3… Погорит, аль есть шанс что будет пахать?

ViktorDoma

Шансы довольно велики. 50/50 или по простому 1 к 2-м 😃

Или сгорит или будет работать.

Я сегодня получил с Е-БЭЯ стэпАПстэпДАУН регулируемы. Сегодня проведу эксперимент, на предмет стабилизированных 12В под видео-передатчик.

Ценник 300-400 рублей.

LeonVS

Вспоминается анекдот про женскую логику 😃))))
Что за спепдаун еще такой, заделись сцилкой 😃?

Syberian

от 4 банок еосд будет работать, а вот вортексу п…да придет от перегрева.

Я вот вортекс от еска запитал, все меньше греться будет.
А для высоковольтных применений хорошо работает turnigy ubec HV 7A. С него можно и 12 снимать, подкрутив встроенный делитель. Работает до 42В проверено.

LeonVS

Вортекс у меня от ДСДС питается 😃 ЕОСД точно будет пахать? Просто встала дилема как подрубить, так же через ДСДС, но тогда не будет видна реальная напруга, или напрямую, но боюсь что не выдержит…