MultiWii на самолете
Зачем? Поставьте на фэйлсейф переключение режима на возврат домой и дело в шляпе.
В том-то и дело, что у меня ппсум без фэйлсефа настраиваемого… При пропадании каналов он тупо выдает последние значения. А мне нужно как-то дернуть AUX для RTH . В ГУИ этого я не нашел, вот и не могу додуматься, как сделать. При добавлении той схемки, отключающей ппсум, у меня хоть сам мультивий становится в фэйлсэйф и через пару секунд сбрасывает газ до нуля. Может, где-то в коде это можно привязать к возврату домой, но я не настолько силен в понимании этого кода, чтобы не напортачить… 😦 Может, я Вас не совсем понял, тогда объясните, пожалуйста, по шагам, что и куда.
Написал небольшое дополнение для тех у кого при пропадании сигнала приемник остается в последнем состоянии на момент пропадания сигнала. Работает и по PPM_SUM и PWM.
MultiWii.cpp
было
int16_t rcData[RC_CHANS]; // interval [1000;2000]
int16_t rcSerial[8]; // interval [1000;2000] - is rcData coming from MSP
int16_t rcCommand[4]; // interval [1000;2000] for THROTTLE and [-500;+500] for ROLL/PITCH/YAW
uint8_t rcSerialCount = 0; // a counter to select legacy RX when there is no more MSP rc serial data
int16_t lookupPitchRollRC[5];// lookup table for expo & RC rate PITCH+ROLL
int16_t lookupThrottleRC[11];// lookup table for expo & mid THROTTLE
добавить
int16_t rcData[RC_CHANS]; // interval [1000;2000]
int16_t rcSerial[8]; // interval [1000;2000] - is rcData coming from MSP
int16_t rcCommand[4]; // interval [1000;2000] for THROTTLE and [-500;+500] for ROLL/PITCH/YAW
uint8_t rcSerialCount = 0; // a counter to select legacy RX when there is no more MSP rc serial data
int16_t lookupPitchRollRC[5];// lookup table for expo & RC rate PITCH+ROLL
int16_t lookupThrottleRC[11];// lookup table for expo & mid THROTTLE#if defined(FAILSAFE_CHANEL_NO_CHARGE)
int16_t rcData_last[RC_CHANS]; // interval [1000;2000]
#endif
Это нужно вставить
#if defined(FAILSAFE_CHANEL_NO_CHARGE)
int rcData_temp = 0;
static int16_t rx_no_charge[8] = FAILSAFE_RX;for(i=0; i<RC_CHANS; i++)
{
rcData_temp = rcData_temp + (rcData_last[i]-rcData[i]) ;
rcData_last[i]=rcData[i];
}if (abs(rcData_temp) < FAILSAFE_NO_CHARGE_DEADBAND)
{
failsafeCnt_charge++;
}else{
failsafeCnt_charge = 0;
}if ( failsafeCnt_charge > (5*FAILSAFE_NO_CHARGE_DELAY))
{
for(i=0; i<RC_CHANS; i++) rcData[i] = rx_no_charge[i];
}
#endif
после родного FAILSAFE
#if defined(FAILSAFE)
if ( failsafeCnt > (5*FAILSAFE_DELAY) && f.ARMED) { // Stabilize, and set Throttle to specified level
for(i=0; i<3; i++) rcData[i] = MIDRC; // after specified guard time after RC signal is lost (in 0.1sec)
rcData[THROTTLE] = conf.failsafe_throttle;
if ((failsafeCnt > 5*(FAILSAFE_DELAY+FAILSAFE_OFF_DELAY)) && !f.FAILSAFE_RTH_ENABLE) { // Turn OFF motors after specified Time (in 0.1sec)
go_disarm(); // This will prevent the copter to automatically rearm if failsafe shuts it down and prevents
f.OK_TO_ARM = 0; // to restart accidentely by just reconnect to the tx - you will have to switch off first to rearm
}
failsafeEvents++;
}
if ( failsafeCnt > (5*FAILSAFE_DELAY) && !f.ARMED) { //Turn of "Ok To arm to prevent the motors from spinning after repowering the RX with low throttle and aux to arm
go_disarm(); // This will prevent the copter to automatically rearm if failsafe shuts it down and prevents
f.OK_TO_ARM = 0; // to restart accidentely by just reconnect to the tx - you will have to switch off first to rearm
}
failsafeCnt++;
#endif
config.h добавить в любое место
#define FAILSAFE_CHANEL_NO_CHARGE
#define FAILSAFE_NO_CHARGE_DELAY 50 // Guard time for failsafe activation after signal lost. 1 step = 0.1sec - 1sec in example
#define FAILSAFE_NO_CHARGE_DEADBAND 10
// #define FAILSAFE_RX {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}
#define FAILSAFE_RX {1500, 1500, 1500, 1300, 1500, 2000, 1000, 1000}
// ROLL PITCH YAW THR AUX1 AUX2 AUX3 AUX4
FAILSAFE_NO_CHARGE_DELAY время срабатывания файлсейфа 1 это 0,1 с .
FAILSAFE_NO_CHARGE_DEADBAND проверка на небольшое изменение сигнала .
Гена, приветствую. Попробовал скомпилировать, ругается на необъявленную переменную failsafeCnt_charge++ . Какой тип нужен для этого?
Да забыл написать . Сюда добавить
multiwii.cpp
int16_t failsafeEvents = 0;
volatile int16_t failsafeCnt = 0;
volatile int16_t failsafeCnt_charge = 0;
Спасибо, скомпилил, ошибок нет. Завтра залью в мультик и буду настраивать
Что-то не понимаю… Прошил с этими изменениями. Когда армлю, газ управляется с пульта, но через секунд 5-10 начинаются хаотичные включения возврата домой, газ сам увеличивается до максимума, потом сбрасывается до середины и опять в максимум… При ручке газа в ноль газ уменьшается до нуля, но тоже примерно через 5-10 сек самостоятельно включается на 50 процентов… Т.е. поведение, как будто бы выключился пульт и сработал фэйлсэйф, но мультивий “видит” сигналы с пульта… Может, что-то коряво вставил в коде?
Если нужны мои файлы мультивия с исправлениями, то я выложил их на my-files.ru/uga6jp . Может, я чего-то начудил с фэйлсэйфом…
Я кое что подправил . Позвони мне завтра
Вопрос. На руках две arduino pro mini , модули neo-6m и gy-87. Вопрос, по какой схеме собирать все вместе, дабы получить полный автопилот для самолета, нужен полет по точкам, возвращение домой при потере связи и прочие плюшки. Прошивать надо простым вием 2.4, или пойдет только прошивка Патрика?
Как выходной, так и дождь - так что я себе от нечего делать придумал мороку:
Втулил на тренер ардуину и 2 датчика, компас и акселерометр; спаял датчики как проще, друг над другом на общие “штырьки”, но из-за этой простоты плата компаса получилось повернутой на 90 и " вверх ногами" 😃
Не я то помнил что дефайн есть и можно переназначить оси, но дошло до дела и я в каком то затыке 😄
Ни у кого опыта не было такого? Ссылки которые нашёл по быстрому как то не очень помогают
Вообще говоря компас то не очень и нужен сейчас, емнип это для жпс важно, а для жпс места уже все равно нет, да и самолёт не тот, чтоб жпс нужен был… Так что буду испытывать без компаса - но просто из интереса уже интересно…
multiwiifaq.ts9.ru/3----------------------.html
внизу страницы. оси можно не только переназначать с + и -, но и менять их местами (предупреждаю, т.к. когда то долго с этим мучался, пока не дошло, что их тоже можно переназначать.
www.multiwii.com/wiki/index.php?title=Config.h#sen… - тут описано, как должны себя вести датчики при изминении положения платы
ну вот как вести я уже видел, дефайны тоже; но методом тыка практически меняя что-то получаю не совсем тот результат, какой должен быть согласно вики… ну та поборю
хз, вчера позапускал “тренер” с мультивием (практического смысла нет, вот просто приспичило… ну если настроить, то можно ребенку давать полетать) - в “пасстру” он какой-то тормозной, рули/элероны за стиком “вдогонку” двигаются, из-за чего получается хрень а не полет 😃
это 2.4… может что-то поменялось, надо попробовать будет пред. версии
я методом тыка на мелком коптере пытался настроить и ничего не вышло. а с вики настроил и коптер сразу полетел
чтото в этот раз с мультивием и его настройкой у меня фигня полная; как такое может быть:
- самолет стоит на ровной поверхности, делаю “калибровать АСС”, ролл/питч в гуе на 0;
- включаю англе/горизон - и значение в канале элеронов начинает медленно плыть с 1498 до 1470 - и там останавливается; но самолет то не шевелился, показания акселерометра/гироскопа не меняются, какого ж?? элероны от этого естественно пытаются накренить самолет…
что это могло бы быть? на 2.4 и 2.3 пробовал; даже пробовал - кренил на 45 примерно градусов, калибровал асс, потом включаю angle - и опять “подкренивание”
в config.h изменений минимум - только тип датчика там, стоп_моторс и все
А как питается мозг? Не импульсником?
У меня были похожие проблемы (дерганье машинок из-за самопроизвольного изменения угла в гуи). При этом к регулю не был подсоединен двигатель. Запитал от обычного блока питания на 5 В - все проблемы исчезли!!! Потом на осциллографе посмотрел на регуль - без нагрузки в виде двигателя его бэк “засирает” по питанию так, что мама не горюй 😉
Вообще это происходит даже при “лабораторном” питании, когда мотор не работает (питание вообще от юсб)… Не думаю, что это из за питания 😕
В гуе видно, что датчики ничего не показывают; ни аксель, ни гироскоп…а цифирки в канал элеронов почему то растут
может оси датчиков не правельно выставлены. у меня было, что самопроизвольно рудер разворачивало постепенно, как раз из-за датчиков
Руддер понемногу поворачивается -это известная “фича” вроде, уменьшением I до 0 лечится
А калибровка акселерометра и должна же учесть кривизну установки датчика?
Похоже openpilot раньше приедет, чем я поборю эту фигню 😦
Здравствуйте, уважаемые.
Прошу потом рассказать о поборении “этой фигни”, ибо имею её же в точности. Спаял два аппарата на ардуино мини. Один работает безупречно (датчики 9DOF 9axis degree of freedom IMU sensor ITG3200/ITG3205 ADXL345 HMC5883L Module), другой занимается вышеописанной фигнёй (датчики 10DOF Module 9-axis Attitude Indicator L3G4200D ADXL345 HMC5883L BMP085 Module). Причём иногда всё нормально, иногда - опаньки… Перезагружаешь, вроде работает. Заморковил самолётку. Но я, конечно, сам был неаккуратен в построении схемы: 3,3в для питания блютуски взял с платки датчиков. Может, она датчикам в линию 3,3в накакала? Без блютуски пока летать не пробовал.
Может, она датчикам в линию 3,3в накакала
или мощности встроенного в датчик стабилизатора 3.3 не хватило для платы с блутузом? я бы на это грешил скорее
Прошу потом рассказать о поборении “этой фигни”
ох чтото мне кажется, я скорее забью на это в конце концов…
но есть мысли - 1) к датчику акселерометра подпаян и датчик компаса, но в прошивке он выключен в config.h - может из-за него? проверить проверю - отпаяю все и присоединю только датчик акселя 2) плата с акселерометром стоит неправильно и “поворачивается” дефайном в config.h - вдруг при этом из-за округлений каких-то накапливается ошибка?..
- к датчику акселерометра подпаян и датчик компаса, но в прошивке он выключен в config.h - может из-за него? проверить проверю - отпаяю все и присоединю только датчик акселя
Но у меня-то он не выключен, а фигня та же, в точности.
- плата с акселерометром стоит неправильно и “поворачивается” дефайном в config.h - вдруг при этом из-за округлений каких-то накапливается ошибка?..
А у меня - абсолютно правильно, т. к. без какого-либо камлания, с настройками по умолчанию все сервушки отрабатывают в нужную сторону, и в полете (когда у вия хорошее настроение) самолетка идет (шла), как по рельсам. А когда плохое - здравствуй, фигня!
мощности встроенного в датчик стабилизатора 3.3 не хватило для платы с блутузом?
А вот это вполне может быть. Безблютусовый полет покажет. Кстати, тут из Кетая пришёл другой такой же датчик. Надо попробовать с ним тоже будет. Интересно же разобраться, где собака зарыта.