MultiWii

GraninDm

Добрый день!

Собственно, собираю потихоньку MultiWii…
Еще не летаю, борюсь со свякими проблемами.

Одна из них это HK-T6A V2
Даже при увеличении расходов не могу покрыть весь диапазон
регулировок. Постоянно приходится крутить тримы.
И к тому же центр не в центре диапазона.
Примерно так.
#define RX_THROTTLE_MIN 1155
#define RX_THROTTLE_CENTER 1575
#define RX_THROTTLE_MAX 1992

1155 1575 1992
±-------------±--------+
Min Centr Max

Короче, мне это надоело и я сделал изменения в коде rx.ino для V2.1
Код написан по-быстрому для проверки.
Мне он не нравиться, но сейчас это неважно…

/**************************************************************************************/
/*************** Standard RX Pins reading ********************/
/**************************************************************************************/

#if defined(STANDARD_RX)
// predefined PC pin block (thanks to lianj)
#define RX_PIN_CHECK(pin_pos, rc_value_pos) \
if (mask & PCInt_RX_Pins[pin_pos]) { \
if (!(pin & PCInt_RX_Pins[pin_pos])) { \
dTime = cTime-edgeTime[pin_pos]; \
if (900<dTime && dTime<2200) { \
if(RX_NORMALISE){ \
int32_t ss = dTime; \
if(rc_value_pos == THROTTLEPIN){ \
if(dTime > RX_THROTTLE_CENTER) ss = (ss - RX_THROTTLE_CENTER) * 500 / (RX_THROTTLE_MAX - RX_THROTTLE_CENTER) + 1500; \
else ss = (ss - RX_THROTTLE_MIN) * 500 / (RX_THROTTLE_CENTER - RX_THROTTLE_MIN) + 1000; \
rcValue[THROTTLEPIN] = uint16_t(ss); \
} \
else if(rc_value_pos == YAWPIN){ \
if(dTime > RX_YAW_CENTER) ss = (ss - RX_YAW_CENTER) * 500 / (RX_YAW_MAX - RX_YAW_CENTER) + 1500; \
else ss = (ss - RX_YAW_MIN) * 500 / (RX_YAW_CENTER - RX_YAW_MIN) + 1000; \
rcValue[YAWPIN] = uint16_t(ss); \
debug[2] = dTime; \
debug[3] = rcValue[YAWPIN]; \
} \
else if(rc_value_pos == ROLLPIN){ \
if(dTime > RX_ROLL_CENTER) ss = (ss - RX_ROLL_CENTER) * 500 / (RX_ROLL_MAX - RX_ROLL_CENTER) + 1500; \
else ss = (ss - RX_ROLL_MIN) * 500 / (RX_ROLL_CENTER - RX_ROLL_MIN) + 1000; \
rcValue[ROLLPIN] = uint16_t(ss); \
} \
else if(rc_value_pos == PITCHPIN){ \
if(dTime > RX_PITCH_CENTER) ss = (ss - RX_PITCH_CENTER) * 500 / (RX_PITCH_MAX - RX_PITCH_CENTER) + 1500; \
else ss = (ss - RX_PITCH_MIN) * 500 / (RX_PITCH_CENTER - RX_PITCH_MIN) + 1000; \
rcValue[PITCHPIN] = uint16_t(ss); \
} \
else rcValue[rc_value_pos] = dTime; \
} \
else rcValue[rc_value_pos] = dTime; \
} \
} else edgeTime[pin_pos] = cTime; \
}
// port change Interrupt

и добавил в config.ino констранты

/*************************************************************************************************/
/***************** ***************/
/**************** SECTION 0 - RX normalisation *******/
/***************** ***************/
/*************************************************************************************************/

#define RX_NORMALISE 1

#define RX_THROTTLE_MIN 1155
#define RX_THROTTLE_CENTER 1575
#define RX_THROTTLE_MAX 1992

#define RX_PITCH_MIN 1145
#define RX_PITCH_CENTER 1587
#define RX_PITCH_MAX 2000

#define RX_ROLL_MIN 1084
#define RX_ROLL_CENTER 1556
#define RX_ROLL_MAX 2034

#define RX_YAW_MIN 1087
#define RX_YAW_CENTER 1583
#define RX_YAW_MAX 2034

#define RX_AUX1_MIN 1000
#define RX_AUX1_CENTER 1600
#define RX_AUX1_MAX 2000

#define RX_AUX2_MIN 1000
#define RX_AUX2_CENTER 1600
#define RX_AUX2_MAX 2000

При RX_NORMALISE = 0 код работает как и раньше
При RX_NORMALISE = 1 включается нормализация

Выключаю нормализицию.
Выставляю тримы по центру (хотя можно в любых положениях сделать нормализацию),
записываю крайние и центральное значения всех каналов.
Записываю константы в config.ino.
Включаю нормализацию.
Теперь у меня диапазон регилировок в MultiWii Config от 1000 до 2000.
Центр в 1500.
Значения, конечно, плавают ±3-5 единиц но я думаю это непринципиально.

В моей реализации мне нравиться то, что я могу без настройки расходов настроить
правильную регулировку для MultiWii.

Скажите, я вообще не велосипед случаем изобрел?

mataor
GraninDm:

Одна из них это HK-T6A V2

у меня аналогичный пульт FlySky CT6B, тож немного подзамучился с триммингом и с плаванием центра на 10-15 едениц…
с плаванием удалось решить проблему одновременно с дальнобойностью - заменой приемника и передатчика FrSky-евским комплектом, там похоже плывет приемник, также при этом верхняя и нижняя границы добавили по 50 примерно в каждую сторону, с диапазоном оставил так как есть - просто настроил в конфиге параметры #define MINTHROTTLE 1150 #define MAXTHROTTLE 1900 #define DEADBAND 12

ваше решение на мой счет оч даже оригинальное и имеющее право на жизнь для владельцев дешевых апп, единственно появляется небольшая нелинейность относительно центра.

GraninDm
mataor:

ваше решение на мой счет оч даже оригинальное и имеющее право на жизнь для владельцев дешевых апп, единственно появляется небольшая нелинейность относительно центра.

Спасибо за ответ… (Если полечу, то попробую на своем коде)
Только мой как раз убирает нелинейность, так как нормализация идет не по всему диапазону а по двум половинам.
Центр всегда в центре края всегда на краю диапазона 1000-2000. И настраивается в разы проще.
А MINTHROTTLE и MAXTHROTTLE я баловался - ничего хорошего не получилось 😦

mataor
GraninDm:

Только мой как раз убирает нелинейность, так как нормализация идет не по всему диапазону а по двум половинам.

нелинейность в том смысле что одинаковый сдвиг допустим вверх и вниз от центра будут различаться ненамного - у одного допустим диапазон сдвига 500 у другого 450, на аппе сдвинули один на 100 и другой на 100, на коптере получим для примера по одному сдвиг 95 по другому 90 - что-то вроде того. но в реальности при управлении коптером это наврятли будет заметно

П.С. если точнее посчитать
#define RX_PITCH_MIN 1145 - диапазон 442
#define RX_PITCH_CENTER 1587
#define RX_PITCH_MAX 2000 - диапазон 413

(1687-1587)*500/413+1500 = 1621, итого сдвиг на аппе в 100 = 121 на коптере
(1487-1145)*500/442+1000 = 1387, итого сдвиг на аппе в 100 = 113 на коптере

минтроттл влияет на значение газа для пуска моторов, у меня мин газа примерно 1120, моторы соответственно запускаются не при арминге а при небольшом смещении газа вверх…

да… еще один минус данного способа - 8 операций умножения/деления в прерывании - не очень хорошо (но имеет право на жизнь в вие - не так критично)

GraninDm
mataor:

кстати скорее всего воспользуюсь вашим кодом, решение оч даже понравилось

Будет интересно 😃 Просьба отписаться потом, а то я все еще никак не взлечу, из-за проблемы с акселерометром.
А про нелинейность я имел в виду другое.
Этим кодом восстанавливается линейная зависимость между углов наклона стика и значением полученным multiwii.
Хотя тут еще важна линейность резистора в аппе.

mataor:

да… еще один минус данного способа - 8 операций умножения/деления в прерывании - не очень хорошо (но имеет право на жизнь в вие - не так критично)

Так я же говорю - код плохой - он сделан макросом, и разворачивается 4 раза.
А по поводу деления и умножения, то во первых там целые 32-значные во-вторых компилятор должен выражение с константами упростить., либо можно принудительно упростить через переопределение промежуточных констант.

AvxMx

Подскажите, чем принципиально отличаются параметры RC Rate и Pitch/Roll Rate? Какие, в каком случае надо двигать?
Также моя Гекса Х (V2.1) в ACRO режиме делает петли по Pitch значительно меньшего диаметра, чем по Roll. Как я понимаю, если бы Pitch/Roll Rate были раздельные, это можно было исправить, но они совмещённые. Какими параметрами можно уровнять реакцию?

dROb

Подскажите, пожалуйста, если я из Bluetooth GPS выдеру Bluetooth модуль, означает ли это, что я без особой суеты смогу себе сделать Bluetooth-UART модуль для связи по Bluetooth? Модуль как бы уже настроен на прием, то есть его вроде как не надо конфигурировать. Или я чего-то недопонимаю?

kedrikov

А вы попробуйте 😃 если получится , они там как правило интегрирыванны в плату.Ну какбы можно если умеете работать с пайкой SMD компонентов…
Лучше купите вроде они сейчас не такие уж дорогие

SergDoc

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

VitaliyRU
SergDoc:

можно ли ввести какой-нибудь фильтр для неё чтоб не так резво откликалась?

Уменьшить P и I(Но так что бы соотношение I/P стало меньше) увеличить D для YAW, ну конструкцию сделать по жестче.
Еще может шуметь D. На тормозных моторах просто у него шуметь не получается.
вот это
delta = gyroData[axis] - lastGyro[axis]; // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
lastGyro[axis] = gyroData[axis];
deltaSum = delta1[axis]+delta2[axis]+delta;
delta2[axis] = delta1[axis];
delta1[axis] = delta;

перепаравить на примерно это
delta = gyroData[axis] - lastGyro[axis]; // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
lastGyro[axis] = gyroData[axis];
deltaSum = delta1[axis]+delta2[axis]+delta3[axis]+delta4[axis](ну и т.д…)+delta;
delta4[axis] = delta4[axis];
delta3[axis] = delta2[axis];

delta2[axis] = delta1[axis];
delta1[axis] = delta;

Тогда D шуметь перестает. На не перепрошитых регулях этот, код вообще добро, нет переодических осциляций.

mahowik
SergDoc:

можно ли ввести какой-нибудь фильтр для неё чтоб не так резво откликалась?

увеличить вес гиры в ИМУ… гира меньше шумит, а при к=400…500 она все еще в состоянии компенсировать своы дрейф по магнитометру…

/* Set the Gyro Weight for Gyro/Magnetometer complementary filter
       Increasing this value would reduce and delay Magnetometer influence on the output of the filter
       Comment this out if you want to set a specific coeff (non default)*/
    #define GYR_CMPFM_FACTOR 400.0f
VitaliyRU:

перепаравить на примерно это

для начала просто D поднять до 40…50

SergDoc

Спасибо вечером поэкспериментирую 😃

Ага он у меня 200.0f

VitaliyRU
mahowik:

для начала просто D поднять до 40…50

Чем больше D тем больше от этого D осциляций.
D он P “тормозит”, но из-за вибраций ему ничто не мешает самому осциляции устраивать(но с бОльшей частотой чем от P c перерегулированием).
Прежде чем этот костыль дописать, я пробовал и так и сяк.
Я к тому, что если не поможет просто D увеличить(PI уменьшить)…
Тряска сервы может быть и от пинков в гиру от люфтов в хвостовом приводе, грубо говоря тоже самое что по гире ключем на 17 постучать 😃
D это этого с ума сойдет.

mahowik
VitaliyRU:

Чем больше D тем больше от этого D осциляций. D он P “тормозит”, но из-за вибраций ему ничто не мешает самому осциляции устраивать(но с бОльшей частотой чем от P c перерегулированием). Прежде чем этот костыль дописать, я пробовал и так и сяк. Я к тому, что если не поможет просто D увеличить(PI уменьшить)… Тряска сервы может быть и от пинков в гиру от люфтов в хвостовом приводе, грубо говоря тоже самое что по гире ключем на 17 постучать D это этого с ума сойдет.

в целом согласен… НО у каждого конфига есть свой порог D, у меня на двух квадрах с длинной луча ~ равной размеру пропа (в моем понятии пропорциональная квадра 😉 ) при D=40…50 осциляций нет… но все правилно, т.к. Д уменьшает влияние П, то П как правило поднимается пропорционально Д и тогда мега плавно все + ветер держит + на спусках не трясет почти…

ну и многочисленние отзывы по а0, а1 сами за себя говорят 😉
хотя сейчас я уже немного “вырос” и мне Д=40 многовато, т.к. слишком тупой уж коптер выходит, а вот 35 само то…

devv:

MultiWii AllinOne (Alpha) play.google.com/store/apps/d...multiwii&hl=tr This app displays important information from MultiWii. (it works with MultiWii 2.0 and 2.1)

mahowik:

вот еще бы кто написал offline map tracking

походу добавили карту
play.google.com/store/apps/details?id=com.ezio.mul…

VitaliyRU
mahowik:

Д=40 многовато, т.к. слишком тупой уж коптер выходит

Угу, на замедленной съемке(раз в 100) это хорошо видно. Видео чуть позже выложу.
Маленький D - перелет, потом обратно возвращается и т.д.
Большой D как бы тормозит раньше времяни и скорость к нулю еле доползает отсюда и тупой.
Лучше всего очень точно настраивать.

SergDoc

Опишусь, попробовал различные варианты - серва “зудеть” не перестала, но пак паралитик уже не бьётся (GYR_CMPFM_FACTOR выставил 400.0f) и к изменению D никакого отношения не имеет, пробовал попрыгать ведёт себя адекватно - надо на улице выгулять, вывод напрашивается простой - не надо было эту серву ставить, или же через демпфер к лучу прикрутить - она сама некислые вибрации создаёт…

vikingua

цифровая серва бесшумно практически не работает - всегда в поисках нуля - посему и зудит, просто подключи к приемнику на столе - будет тоже

DVE

Их менеджеров давно разогнать надо.

Плата устарела примерно на год 😃 Нет смысла брать это чудо по 45$, когда за 58$ есть All In One с более качественными датчиками и процом, нормальным сериал-портом и полноценным USB-разъемом.

Voldemaar

… да и дешевле на том же Dealextreme можно купить, причем, с фришиппингом 😉