ArduCopter Mega: порт на обычную Arduino (тестим)
он в любом случае датчики инициализирует и повисает при поиске барометра
То есть надо иметь все 4 датчика и тогда нормально подключиться во fly режиме?
Сделал новый билд 2.0.49 Beta5 с предварительной поддержкой MS5611.
Для использования 5611 надо в APM_Config.h изменить BARO_BM085 на BARO_MS5611
у кого то есть достоверная и проверенная инфа а том, что же на приемнике будет, при отключении передатчика? код на прошлой странице предполагает что приемник перестает сигнал выдавать, а не зависат на определенной цифре
кстатии если зависает на цифре, то как вариант еще один канал сделать на котором каждые полсекунды сигнал менять и если мозги увидели что сигнал не меняется с нужной частотой (вообще не меняется, застыл), то fail
Первым делом гаснет светодиод на приемнике, если передатчик выключить. Мжно с ноги светодиода снимать логический уровень и читать на свободолм порту Ардуинки, как флаг.
Первым делом гаснет светодиод на приемнике
кстатии отличный вариант тупо 0 или 1 и не надо гемороится, но придется 1 проводок паять или фоторезистор поставить (и приемник в черную коробку)
Проблема не в детектировании пропадания сигнала. Проблема в том, что в коде Мегапирата, всё что относится к Failsafe - закоментировано, а значит не будет работать.
Я так понял, что функцию фейлсейва в Ардукоптере реализует PPM Encoder, который стоит на дополнительной меге… 😦
дописать свой код =) по сути надо или газ выставлять в состояние снижения, как на multiwii, или с баро и понижать высоту (там вроде бы был вариант landing) или RTL (если гпс есть)
функцию фейлсейва в Ардукоптере реализует
…приемник 😃
На канале переключателя режимов настраивается ФС такой, чтобы включался режим “алт_холд”, “лоитер” или “домой” и все.
Что касается самого ппм-енкодера, в нем есть возможность перекомпилировать исходник, задав типа Throttle failsafe - фиксированные значения по каналам при определенном значении газа. Делается один раз в жизни.
Ну, также есть в нем функция жестко перенаправлять каналы мультиплексором напрямую в сервы на случай зависания главного проца. Опять же по команде приемника. На черта это в квадрике?
code.google.com/p/ardupilot-mega/wiki/Failsafe
короче надо 100% задетектить отсутствие сигнала с аппы, а там уже кому что нравиться - отрубать движки, медленно снижаться, лететь домой и т.д.
вопрос - как ведет себя приемник при потере сигнала (светодиод не в счет пока что), варианты ответа:
- застывает на последний значениях
- перестает выдавать какие либо импульсы
- я точно не знаю поэтому отвечать не буду
и все ли приемники (тут большинство имхо с турнигой и хкшной 6каналкой) одинаково себя поведут?
как ведет себя приемник при потере сигнала
с турнигой
у меня по газу дал максимум, отчего пропеллером получил.
FRsky после нажатия на кнопочку помнит положение ручек. Я поставил газ почти в минимум, канал режимов в Стаб и нажал кнопку на приемнике. Если отключить пульт, газ падает, коптер в Стабе.
У меня на санве, выставляется зарание запрограммированное положение стиков.
после нажатия на кнопочку
это всё не то, надо софтверный вариант, чтобы тупо врубать посадку или возврат домой при потере сигнала (а при его возвращении уже куда хочешь переключайся)
а для софтверного варианта надо знать как себя ведет приемник (какой сигнал на выходах каналов) после того как пропал сигнал
“газ падает, коптер в Стабе” тоже падает? =)
вечерком поэксперементирую может быть, в наличии обе аппы (4ch 6ch и 9x)
Кнопочка на фриске (как и в других приемниках с фэилсейвом) нажимается один раз в сезон, когда надо запомнить положение стиков и тумблеров, чтобы при потере сигнала включался нужный мод, собственно что тебе и требуется. Скажем RTL будет включаться, но тут надо понять что происходит с коптером на границе связи, иначе он будет постоянно включать RTL и обратно и так и не вернется, пока аппу не выключишь)
*facepalm* мне иногда кажется что надо найти и сходить на курсы - “как объяснить чтобы поняли вообще все”…
если на приемнике ЕСТЬ хардверный фейлсейв, то проблем особых нет (за исключением “передергивания” сигнала, но и тут проблем нет, можно поставить таймер в коде)
нам же надо задетектить этот фейл софтверно (без кнопочек и приемников с фейлсейвом)
т.е. нам надо чтобы в коде флаг FAILSAVE менялся с false на true, при пропадании (или не устойчивом) сигнала на приемнике и вот вариант со светодиодом мне очень понравился, хоть и костыльный он немного
Да все тебя поняли, в отличие от тебя) Чем тебя реализация фаилсейва в мультивие не нравится в таком случае?
P.s. Экономия менее 10% от стоимости всего коптера, а фриска с доставкой стоит гдето 40 долларей, может в легкую привести к опусу на страницах темы rcopen.com/forum/f134/topic253939 … Так стоит ли экономить?
Чем тебя реализация фаилсейва в мультивие не нравится в таком случае?
дык из него родимого и передрал код на пару страниц раньше… просто не тестил - одни говорят что на приемнике остается тот же сигнал, другие что сигнал пропадает - это 2 совершенно разных варианта кода
Так стоит ли экономить?
экономить не стоит, но и покупать еще (если можно без этого обойтись и даже сделать лучше) тоже не стоит
пойду в общем паять и тестить… а то так ничего и не узнаю =)
Давай, ждем результатов.
при пропадании (или не устойчивом) сигнала на приемнике и вот вариант со светодиодом мне очень понравился, хоть и костыльный он немного
Да не надо никаких костылей. Пропадание связи с передачиком, легко детектится в APM_RC. Вопрос в том, что дальше с этим делать, как я уже сказал, весь код закоментирован, возможно с ним были проблемы.
…приемник На канале переключателя режимов настраивается ФС такой, чтобы включался режим “алт_холд”, “лоитер” или “домой” и все.
Олег, речь идет про случай, если в приемнике нету FS!
затестил =) код прерывания всеравно вызывается если на приемник идет питание, но если следить за одним пином, то failsave отлично детектится (пробовал с выдранным multiwii кодом и hk 6ch)
if (mask & 1<<0) {
некий_счетчик=0;
}
внтури прерывания отлично обнуляется счетчик, внутри основного цикла плюсуем, если значение перевалило за 10…20 (число циклов плюсования), то явно fail
легко детектится в APM_RC
легко, но там нет кода для детекта
Вопрос в том, что дальше с этим делать
добавить дефайн действия - какой режим врубать после нескольких циклов без данных с аппы (в идеале еще задетектить временные провалы) - ALT_HOLD, LOITER или RTL… в идеале конечно найти режим посадки (по сути ALT_HOLD и уменьшать значение высоты удержания или например пока не начнет сонар работать)
как вариант - не обнулять, а минусовать внутри прерывания (некий_счетчик–; if (некий_счетчик<0) некий_счетчик=0; ), тогда если много потерь (или вообще отрубились) - значение будет увеличиваться и сработает FAIL, если всё отлично, то значение будет постоянно у нуля держаться
еще вариант дальнейший, как только сработал failsave сделать значение счетчика например 100 циклов, минусовать и не выходить из цикла пока нулем не станет - чтобы “дребезга” не было, а то будет скакать между режимами и еще хуже выйдет
Глеб, это все есть в пирате, но закоментировано 😃 от APM_RC требуется отдавать GetState = 1 если все нормально и 0 если пропала связь.
GetState
APM_RC.GetState() == 1
имхо это готовность радио системы, а не флаг фейла
ну и вообще функция доставляет:
uint8_t APM_RC_Class::GetState(void)
{
return(1);// always 1
}
в APM_RC:
счетчике добавить в uint16_t APM_RC_Class::InputCh(uint8_t ch) (плюсовать когда ch=3 (или кто там газ?))
в прерывании счетчик=0 внутри if (!(pin & 1<<3)) {
сам счетчик я бы пихнул внутрь rcPinValue, например rcPinValue[8] (и в массив расширить и дефайн для CH_9 добавить)
и потом узнать его состояние можно будет через g.rc_9.set_pwm(APM_RC.InputCh(CH_9));
а вот throttle_failsafe(uint16_t pwm); я чето не осознал пока что… имхо это не совсем то что нам надо
upd: осознал… нам бы только поменять pwm < (unsigned)g.throttle_fs_value на pwm>fs_value (fs_value например 10 циклов) и throttle_failsafe(g.rc_9.radio_in);
upd2: ну и раскоментить set_failsafe, а потом в events.pde прописать нормальные действия