ArduCopter Mega: порт на обычную Arduino (тестим)

Sir_Alex

Сделал новый билд 2.0.49 Beta5 с предварительной поддержкой MS5611.
Для использования 5611 надо в APM_Config.h изменить BARO_BM085 на BARO_MS5611

Alex_from_Israel
SovGVD:

у кого то есть достоверная и проверенная инфа а том, что же на приемнике будет, при отключении передатчика? код на прошлой странице предполагает что приемник перестает сигнал выдавать, а не зависат на определенной цифре
кстатии если зависает на цифре, то как вариант еще один канал сделать на котором каждые полсекунды сигнал менять и если мозги увидели что сигнал не меняется с нужной частотой (вообще не меняется, застыл), то fail

Первым делом гаснет светодиод на приемнике, если передатчик выключить. Мжно с ноги светодиода снимать логический уровень и читать на свободолм порту Ардуинки, как флаг.

SovGVD
Alex_from_Israel:

Первым делом гаснет светодиод на приемнике

кстатии отличный вариант тупо 0 или 1 и не надо гемороится, но придется 1 проводок паять или фоторезистор поставить (и приемник в черную коробку)

Sir_Alex

Проблема не в детектировании пропадания сигнала. Проблема в том, что в коде Мегапирата, всё что относится к Failsafe - закоментировано, а значит не будет работать.
Я так понял, что функцию фейлсейва в Ардукоптере реализует PPM Encoder, который стоит на дополнительной меге… 😦

SovGVD

дописать свой код =) по сути надо или газ выставлять в состояние снижения, как на multiwii, или с баро и понижать высоту (там вроде бы был вариант landing) или RTL (если гпс есть)

Syberian
Sir_Alex:

функцию фейлсейва в Ардукоптере реализует

…приемник 😃
На канале переключателя режимов настраивается ФС такой, чтобы включался режим “алт_холд”, “лоитер” или “домой” и все.
Что касается самого ппм-енкодера, в нем есть возможность перекомпилировать исходник, задав типа Throttle failsafe - фиксированные значения по каналам при определенном значении газа. Делается один раз в жизни.
Ну, также есть в нем функция жестко перенаправлять каналы мультиплексором напрямую в сервы на случай зависания главного проца. Опять же по команде приемника. На черта это в квадрике?
code.google.com/p/ardupilot-mega/wiki/Failsafe

SovGVD

короче надо 100% задетектить отсутствие сигнала с аппы, а там уже кому что нравиться - отрубать движки, медленно снижаться, лететь домой и т.д.
вопрос - как ведет себя приемник при потере сигнала (светодиод не в счет пока что), варианты ответа:

  1. застывает на последний значениях
  2. перестает выдавать какие либо импульсы
  3. я точно не знаю поэтому отвечать не буду
    и все ли приемники (тут большинство имхо с турнигой и хкшной 6каналкой) одинаково себя поведут?
Musgravehill
SovGVD:

как ведет себя приемник при потере сигнала

SovGVD:

с турнигой

у меня по газу дал максимум, отчего пропеллером получил.
FRsky после нажатия на кнопочку помнит положение ручек. Я поставил газ почти в минимум, канал режимов в Стаб и нажал кнопку на приемнике. Если отключить пульт, газ падает, коптер в Стабе.

YAN=

У меня на санве, выставляется зарание запрограммированное положение стиков.

SovGVD
Musgravehill:

после нажатия на кнопочку

это всё не то, надо софтверный вариант, чтобы тупо врубать посадку или возврат домой при потере сигнала (а при его возвращении уже куда хочешь переключайся)
а для софтверного варианта надо знать как себя ведет приемник (какой сигнал на выходах каналов) после того как пропал сигнал
“газ падает, коптер в Стабе” тоже падает? =)
вечерком поэксперементирую может быть, в наличии обе аппы (4ch 6ch и 9x)

Covax

Кнопочка на фриске (как и в других приемниках с фэилсейвом) нажимается один раз в сезон, когда надо запомнить положение стиков и тумблеров, чтобы при потере сигнала включался нужный мод, собственно что тебе и требуется. Скажем RTL будет включаться, но тут надо понять что происходит с коптером на границе связи, иначе он будет постоянно включать RTL и обратно и так и не вернется, пока аппу не выключишь)

SovGVD

*facepalm* мне иногда кажется что надо найти и сходить на курсы - “как объяснить чтобы поняли вообще все”…
если на приемнике ЕСТЬ хардверный фейлсейв, то проблем особых нет (за исключением “передергивания” сигнала, но и тут проблем нет, можно поставить таймер в коде)
нам же надо задетектить этот фейл софтверно (без кнопочек и приемников с фейлсейвом)
т.е. нам надо чтобы в коде флаг FAILSAVE менялся с false на true, при пропадании (или не устойчивом) сигнала на приемнике и вот вариант со светодиодом мне очень понравился, хоть и костыльный он немного

Covax

Да все тебя поняли, в отличие от тебя) Чем тебя реализация фаилсейва в мультивие не нравится в таком случае?
P.s. Экономия менее 10% от стоимости всего коптера, а фриска с доставкой стоит гдето 40 долларей, может в легкую привести к опусу на страницах темы rcopen.com/forum/f134/topic253939 … Так стоит ли экономить?

SovGVD
Covax:

Чем тебя реализация фаилсейва в мультивие не нравится в таком случае?

дык из него родимого и передрал код на пару страниц раньше… просто не тестил - одни говорят что на приемнике остается тот же сигнал, другие что сигнал пропадает - это 2 совершенно разных варианта кода

Covax:

Так стоит ли экономить?

экономить не стоит, но и покупать еще (если можно без этого обойтись и даже сделать лучше) тоже не стоит
пойду в общем паять и тестить… а то так ничего и не узнаю =)

Sir_Alex
SovGVD:

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

Да не надо никаких костылей. Пропадание связи с передачиком, легко детектится в APM_RC. Вопрос в том, что дальше с этим делать, как я уже сказал, весь код закоментирован, возможно с ним были проблемы.

Syberian:

…приемник На канале переключателя режимов настраивается ФС такой, чтобы включался режим “алт_холд”, “лоитер” или “домой” и все.

Олег, речь идет про случай, если в приемнике нету FS!

SovGVD

затестил =) код прерывания всеравно вызывается если на приемник идет питание, но если следить за одним пином, то failsave отлично детектится (пробовал с выдранным multiwii кодом и hk 6ch)

if (mask & 1<<0) {
        некий_счетчик=0;
}

внтури прерывания отлично обнуляется счетчик, внутри основного цикла плюсуем, если значение перевалило за 10…20 (число циклов плюсования), то явно fail

Sir_Alex:

легко детектится в APM_RC

легко, но там нет кода для детекта

Sir_Alex:

Вопрос в том, что дальше с этим делать

добавить дефайн действия - какой режим врубать после нескольких циклов без данных с аппы (в идеале еще задетектить временные провалы) - ALT_HOLD, LOITER или RTL… в идеале конечно найти режим посадки (по сути ALT_HOLD и уменьшать значение высоты удержания или например пока не начнет сонар работать)

как вариант - не обнулять, а минусовать внутри прерывания (некий_счетчик–; if (некий_счетчик<0) некий_счетчик=0; ), тогда если много потерь (или вообще отрубились) - значение будет увеличиваться и сработает FAIL, если всё отлично, то значение будет постоянно у нуля держаться

еще вариант дальнейший, как только сработал failsave сделать значение счетчика например 100 циклов, минусовать и не выходить из цикла пока нулем не станет - чтобы “дребезга” не было, а то будет скакать между режимами и еще хуже выйдет

Sir_Alex

Глеб, это все есть в пирате, но закоментировано 😃 от APM_RC требуется отдавать GetState = 1 если все нормально и 0 если пропала связь.

SovGVD
Sir_Alex:

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 прописать нормальные действия

Sir_Alex
SovGVD:

имхо это готовность радио системы, а не флаг фейла

Нет, это как раз и есть тот самый флаг. Посмотри код failsafe в остальных местах и собственно обрати внимаение, как он активируется. 😃

Тем временем, ArduCopter’овцы выпустили 2.0.50, с множеством правок… правда, судя по всему пока хватает багов 😃 Подождем чуть чуть.

SovGVD

посмотрел, код счетчика реагирует на определенный уровень на 3 канале, если счетчик доходит до 10(11), врубается set_failsafe(), который запускает event в events.pde, который выставляется RTL (как то специфично выставляет)
или я не ту версию смотрю? (сужу по тому что в svn)

Sir_Alex:

с множеством правок…

че нить полезного добавили?