Система стабилизации DJI для вертолетов классической схемы и не только!

alekseii

Да, коптер поворачивает за счёт (говоря просто, не учитывая “тонкостей” программы управления) изменения оборотов верхних и нижних моторов (при повороте вправо - верхние моторы уменьшают обороты, а нижние наоборот увеличивают (или наоборот)). Необходимо выделить “разностный” сигнал, без этого никак. (неужели “здесь” нет ни одного заинтересованного “контроллерищика” 😃 ).

vik500

Я разговаривал с программистом из Ростовского радио института, для начала нам надо разработать функциональную схему, (конкретно что мы хотим, это нам вроде всё понятно а человек не в теме). Это должен быть отдельный от НАЗЫ блок, так как в НАЗУ лесть они наотрез отказались, внести изменение в программу практически невозможно, потом надо отдать инженеру для изготовления принципиальной схемы а затем уже программисту.
Я тут начал немного рисовать но одна голова хорошо а десять лучше.

Я думаю что для начала нам надо выделить сигнал для сервы тарелки, это должна быть схема с входами от М1 и М4, от М2 и М5, от М3 и М6, и выходами на серво 1, серво 2, серво 3. При изменении газа на всех шести моторах сигнал одинаковый и на выходе нашей схемы он должен быть такой же, но при изменение между моторами (при развороте) он меняется на М1скважность уменьшается а на М2 увеличивается или наоборот это зависит от направления разворота, и так на всех а на выходе сигнал не должен меняться. Это для того чтобы при развороте вертолет оставался на той же высоте. По поводу рудера всё наоборот, при изменении газа сигналы на выходе моторов изменяются одинаково а на выходе нашей схемы сигнал не должен меняться и только при повороте когда сигналы на моторах становится разным он должен меняться и на выходе для сервы рудера. Тем самым будет управление хвостом.

robis

Виктор, вероятно мы сможем получить сигналы для серв на простой логике, а вот с рудером сложнее - придется учитывать все шесть каналов. Надо подумать по первой и второй части.

vik500
robis:

а вот с рудером сложнее - придется учитывать все шесть каналов.

Да это наверное так. Если мы возьмём сигнал от шести моторов то на выходе должны получать изменение сигнала (то есть сигнал управления рудером) только тогда, когда сигналы с М1, М2, М3 будут отличатся от сигнала с М4, М5, М6 и только при разнице сигнала между группами должен появляться сигнал управления рудером. При этом в группах сигналы должны быть одинаковые.

btr1209

Для того чтоб корячить это все на логике нужно знать как сигналы совпадают по фазе поэтому и нужен двухлучевой осцыл чтоб это посмотреть меняется ли фаза при изменении высоты и направления

alekseii

Надо сразу “предусмотреть” выходы на сервы не только на тарелку перекоса, но и на газ и рудер. Микроконтроллер - мега32u4 (например). У него 4-е таймера, на трёх (2-ух) таймерах легко будет организовать все (5-ть) выходы-шим (для управления сервами, с любой частотой и длительностью). И один таймер (8-ми разрядный) для определения длительностей входных сигналов. В принципе, сразу распаивать практически ничего не надо, есть маленькие платы с распаянными микроконтроллером, кварцем и всякой мелочёвкой.
Так что нужен программист (действующий, кто “в теме”) и всё (не считая заведомо и прямо пропорционально опыту программиста (инженера) потраченного времени и денег…).
Проблема в том (моё видение), что нельзя полностью смоделировать работу назы на столе. Хотя, возможно для отработки “на столе” будет достаточно ручного режима назы (автомат на столе не работает). Далее, собрав и запрограммировав, настраивается подключенный, свой, контроллер по предварительно “подключённому” маленькому экранчику (DV датавизион из чип и дипа за 300 руб или такой же экранчик но с rs232 интерфейсом) или сделанному подключению по USB к компу с интерфейсной прогой (как на назе 😃 ) и всё, на полётные испытания 😃
Размеры готового изделия (распаянного в резоните, например) будет 3-и на 4-е сантиметра и 5-ть мм толщиной (вес 10-15 гр). В работе с контроллерами есть много тонкостей, знание особенностей программы-среды разработки, знание языка программирования и наверное самое главное это знание алгоритмов работы), ничего сложного но пока в них не разберешься не получится НЕ ШИША !
Так что для начала необходимо выбрать микроконтроллер (я выбрал указанный AVR) с “наличием” аппаратных таймеров (их можно организовать и программным способом, но зачем лишний геморрои), да и встроенный USB “лишним” не будет. За частотой думаю гнаться не нужно (16 гигагерц, для выполнения данной программы будет достаточно, AVR - это сила 😃 ). Второе, нужно устройство вывода (в реальном времени) заданных параметров (длительностей входных сигналов, выводов сигналов коррекции, скорректированных сигналов, а также сигналов для оконечной настройки на верте).
Так что для начала - контроллер с подсоединённым устройством вывода и подсоединённой назой (все шесть каналов). Пишется программа с фрагментом кода который только будет распознавать длительности входных сигналов (ни какая фаза там даром не нужна, извиняюсь). В этом фрагменте необходимо правильно рассчитать частоту выборок и конкретно время на обработку подпрограммы прерывания, для программиста (без неё никак скорее всего не получится) а дальше ручку, бумагу и заниматься “обработкой” полученных данных.
(сам пока “разбираюсь” с этими особенностями, уж что то их слишком много…)

vik500
alekseii:

Так что нужен программист (действующий, кто “в теме”)

Программиста в теме мы не найдем!!!

alekseii:

необходимо выбрать микроконтроллер

Давайте выбирать я в этом не специалист или

vik500:

отдать инженеру

alekseii:

нужно устройство вывода

Это NAZA у нас есть.

alekseii:

самое главное это знание алгоритмов работы

Вот это мы должны предоставить программисту!!!
То есть техническое задание (что мы хотим получить и как это работает)

robis
btr1209:

Для того чтоб корячить это все на логике нужно знать как сигналы совпадают по фазе поэтому и нужен двухлучевой осцыл чтоб это посмотреть меняется ли фаза при изменении высоты и направления

Сергей, Вы все верно говорите - безусловно понадобится двух лучевой осциллограф. Виктор вероятно изыщет такую возможность. Там все должно быть более-менее линейно, кроме участков с разворотами, из-за того, что Наза резко “подруливает” моторами в начале разворота. Важно понять на 100%, - в этот момент она “крутит” верхними и нижними одинаково или вернее: фазы на верхнем и нижнем моторе зеркально совпадают или нет. Если повезет и это так, то вариант на логике можно будет назвать простым и элегантным решением.

vik500

Я думаю что должны совпадать они должны работать от одного генератора а уже управляющий сигнал изменяет длительность для каждого двигателя и они должны быть одинаковые для верхних и нижних при изменении газа всё должно совпадать. Но это моё мнение надо проверять. Вы подробней описывайте а лучше и схемы рисуйте будем обсуждать а то приходится догадываться, а может я что не так понимаю.

robis

Виктор, Вы не совсем уловили - они могут не совпадать специально, если это (к примеру) требуется для поддержания ровного висения на разворотах. Например, если верхние моторы уменьшают скорость вращения, то нижние должны увеличить и возможно зависимость будет не линейной, или могут запускаться раньше или позже. В общем х.з. - лучше взять Назу и сходить туда, где есть осциллограф с двумя входами. Если фазы совпадут на 100, то с логикой проблем не будет.

btr1209

Ребята не надо забывать что любой компьютер может выполнять только одно действие в один момент времени , просто он делает это быстро и нам кажется что комп делает все сразу.
Авр пик контролеры наза и прочее это тот же комп и работают все одинаково поэтому и надо посмотреть как это все выглядит если этого не знать дальнейшее обсуждение тол ко мусорит ветку, значит засинхронизироватся надо от любого мотора можно взять и М1 и относительно его посмотреть как все выглядит.
Пример
__-__ верхний если такой вариант или __—__ такой
__–_ нижний тататататататат атататат __-___ (татата заполнитель для форматирования)
то смысл есть заморачиватся с логикой

в общем надо посмотреть что происходит в реале это если сочинять на логике

btr1209

Если применить АВР тогда не надо заниматься ерундой нужно все это поручить компьютеру.
И так что мы знаем
1 с назы выходит управляющий сигнал с изменяемой скважностью диапазон приблизительно от 800 до 2100 мили секунд с частотой 400 гц
2 середина для серв приблизительно 1500 мс так же бывает 760 мс и еще один не помню но это сейчас не важно
3 используем схему три коптера по 2 мотора на луч
4 наза поворачивает моторами
5 цифровая серва жрет 200 Гц АП, 300 Гц хвост

теперь что нам нада

1 превратить сигнал с каждого луча для управления сервой
2 газ проще пустить в обход назы
3 добыть сигнал для рудера
4 установка конечных точек АП, для хвоста обычно есть в гироскопе

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

vik500
btr1209:

цифровая серва жрет 200 Гц

Цифровая серва прекрасно работает на 400 Гц. Я подключал сервы напрямую к NAZA-M и летал. NAZA-M прекрасно подходит к вертолету и цена в три раза дешевле NAZA-H но есть одно НО не работает автопилот.

robis:

Важно понять на 100%, - в этот момент она “крутит” верхними и нижними одинаково или вернее: фазы на верхнем и нижнем моторе зеркально совпадают или нет.

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

btr1209

1 присваиваем значение переменным элерон=800
2 элеватор=800
3 пич=800
4 рудер=1500
5 лимит низ=800
6 лимит верх=2100
8 М1=лимит низ
9 М2=лимит низ
10 М3=лимит низ
11 М4=лимит низ
12 М5=лимит низ
13 М6=лимит низ
14 считываем длительность импульса с канала М6 и присваиваем значение переменой М6 и переменой а М6=а
15 считываем длительность импульса с канала М3 и присваиваем значение переменой М3 и переменой б М3=б переход в подпрограмму расчета длительности импульса переход на 43 строку
16 присваиваем новое значение пич=с
17 открываем выходной порт для пич настраиваем скорость выдачи 200Гц и передаем значение переменой пич

18 считываем длительность импульса с канала М5 и присваиваем значение переменой М5 и переменой а М5=а
19 считываем длительность импульса с канала М2 и присваиваем значение переменой М2 и переменой б М2=б переход в подпрограмму расчета длительности импульса переход на 43 строку
20 присваиваем новое значение элерон=с
21 открываем выходной порт для элерон настраиваем скорость выдачи 200Гц и передаем значение переменой элерон

22 считываем длительность импульса с канала М4 и присваиваем значение переменой М4 и переменой а М4=а
23 считываем длительность импульса с канала М1 и присваиваем значение переменой М1 и переменой б М1=б переход в подпрограмму расчета длительности импульса переход на 43 строку
24 присваиваем новое значение элеватор=с
25 открываем выходной порт для элеватор настраиваем скорость выдачи 200Гц и передаем значение переменой элеватор

26 сравниваем значение М6 и М3 вычисляем кто больше если М3 значит правый поворот и переход на строку 27 если М6 левый переход на строку 28
27 М3-М6=Хправ1 также присваиваем значение переменой поворот=1 переход строка 29
28 М6-М3=Хлев1 также присваиваем значение переменой поворот=2

29 сравниваем значение М5 и М2 вычисляем кто больше если М2 значит правый поворот и переход на строку 27 если М5 левый переход на строку 31
30 М2-М5=Хправ2 также присваиваем значение переменой поворот1=1 переход строка 32
31 М5-М2=Хлев2 также присваиваем значение переменой поворот1=2

32 сравниваем значение М4 и М1 вычисляем кто больше если М1 значит правый поворот и переход на строку 27 если М4 левый переход на строку 34
33 М1-М4=Хправ3 также присваиваем значение переменой поворот2=1 переход строка 35
34 М4-М1=Хлев3 также присваиваем значение переменой поворот2=2

35 если поворот+поворот1+поворот2=3 то переход на строку 38 пр
36 если поворот+поворот1+поворот2=6 то переход на строку 40 лев
37 рудер=1500 переход на 42 строку
38 (Хправ1+Хправ2+Хправ3)/3=угол.пов
39 1500+угол.пов=рудер переход на 42 строку
40 (Хправ1+Хправ2+Хправ3)/3=угол.пов
41 1500-угол.пов=рудер переход на 42 строку
42 открываем канал рудера настраиваем скорость передачи 300Гц и передаем переменную рудер переход на 14 строку

43 подпрограмма расчета длительности импульса
здесь высчитываем значение для луча (а+б)/2=с
здесь сравниваем результат с лимитами с <= лимит низ если истина присваиваем значение с=лимит низ если лож ничего не делаем
здесь сравниваем с >= лимит верх если истина присваиваем значение с=лимит верх если лож ничего не делаем
возврат

btr1209

недосмотрел нужно заменить на вот эти строки
29 сравниваем значение М5 и М2 вычисляем кто больше если М2 значит правый поворот и переход на строку 30 если М5 левый переход на строку 31
32 сравниваем значение М4 и М1 вычисляем кто больше если М1 значит правый поворот и переход на строку 33 если М4 левый переход на строку 34
39 рудер+угол.пов=рудер переход на 42 строку
40 (Хлев1+Хлев2+Хлев3)/3=угол.пов
41 рудер-угол.пов=рудер

alekseii

Всё таки не понимаю, зачем цепляться к фазе сигналов управления, моторы (сервы) управляются шим-сигналом, в котором информацию несёт именно длительность единичного уровня (зная частоту удобнее применять термин скважность)…
Устройство вывода - это то устройство на который будет выводиться информация со своего микроконтроллера. По алгоритму самой программы, всё в целом так, но когда вы увидите сами, что выходит с назы многие вопросы отпадут (а также добавятся новые) сами собой.
Многие моменты, таких как установка частоты сигналов управления серв делается очень просто, “автоматически”, так что на эти моменты можно внимания не уделять вообще.
(как хорошо, что на сайте заработала проверка лингвических ошибок 😃 )

btr1209

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

зачем видеть что с неё выходит если она сама следит за горизонтом и делает нужные коррекции конкретней что вас смущает в алгоритме данной программы
наша задача из 6 каналов сделать 4

alekseii

Сергей здравствуйте !
Я противник “логики” (в смысле, собирать на отдельных логических элементах, в тоже время, в специализированных микросхемах, например шим контроллеры в блоках питания, логика уже встроена, без неё ни как), по поводу замены длительности на скважность, это да, кому как удобнее.
Зачем видеть что выходит с контроллера, да, в принципе это даром не надо. Но как удастся отстроить программу, не видя что приходит на контроллер, как выполнить масштабирование (соизмерение входных и выходных значений) сигналов. Безусловно, это всё можно просчитать (при достаточном практическом опыте), но на практике (говоря прямо, любителю-самоделкину) без этого “экранчика”, лично я не представляю как это можно сделать.
В программе не то что смущает, (мне знаком язык ассемблер и Си, у Вас другой язык, так мне кажется по “построению” и Вашему написанию, хотя это не важно). Я до конца не понимаю некоторые “тонкости” работы назы. Да, моторы в паре (при развороте) работают - один уменьшил обороты другой наоборот увеличил. Но это при “идеальных” условиях, то есть когда наза находится в “горизонте”. Если идёт болтанка и (или) резкое изменение высоты (например и режим автомат, не ручной) происходят не понятные мне процессы, У одного мотора обороты уменьшаются до одного предела (например -80 единиц) а у другого увеличивается на +130 (а не на +80, как можно было бы предположить) и ещё идёт поправка от крена итд. Предполагаю, это происходит (от части) не корректная отработка (на столе), а в полёте такого происходить не будет или же сама наза в ведёт свои дополнительные поправки. На счёт увеличения на +130 или уменьшения (-80) единиц, это нужно для получения сигнала корректировки на сервы автомата перекоса (и сигнала рудера). Для себя решил, на все эти “мелочи” не обращать, будут “полевые” испытания, они всё и покажут 😃

btr1209

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

vik500

Алексей
Всё управление происходит синхронно то есть если летим в перёд передние двигатели верхний и нижний уменьшают обороты одинаково а задние увеличивают (длинна импульсов на верхних и нижних двигателях одного луча одинаковые на все 100%) изменение происходит при развороте длительность меняется на всех и тоже линейно (одинаково).
Если возьмем горизонтальное висение при идеальных условиях за 100 единиц то при полете вперёд передние верхние и нижние будут 90 ед. а задние 110 ед. если туда добавляем разворот то передние верхние 100 ед. задний верхний 120 ед. и соответственно передние нижние 80 ед. задний нижний 100 ед. так мы летим по кругу.