ArduCopter Mega: порт на обычную Arduino (тестим)
Провёл серию испытаний на приёмнике D8R-IIPlus:
срабатывание FS по газу был настроен на 990, затем с помощью кривых газа был поднят сигнал до 1000, т.е. при включённой аппе подаётся сигнал по 3 каналу 1000 при выключенной 986 (так забиндил FS)
Результат:
- при отключении аппы включается РТЛ режим, канал 3 выдаёт 986
- при включении аппы (появляется сигнал) РТЛ режим продолжает работать, но режим остаётся РТЛ, ессно коптер несётся домой
- для переключения в управляемый режим достаточно переключить коптер на любой другой режим и он устанавливается (например стаб)
- при отключении аппы, когда коптер заармирован он улетает согласно п.1
Пы.сы.
Обнаружил тоже багу:
при появлении сигнала если поставить газ на 0(в самый низ), то независимо оттого, что работает РТЛ все двигатели отключаются 😦, но стоит чуть двинуть стик - всё нормально начинает работать…
это всё проведено виртуально 😃 на компе по показаниям сенсоров
Проще оттримировать газ вниз, установить FS и вернуть газ обратно.
завтра попробую 😃 спсибо
Глеб сделал эту фишку.
Что то вылетело из головы. 😒
Так может тогда проще сделать так:
uint16_t APM_RC_PIRATES::InputCh(uint8_t ch)
{
uint16_t result;
uint16_t result2;
result=readRawRC(ch);
// Limit values to a valid range
if(failsafeCnt >= 20 && ch==2) {
result=950;
}
result = constrain(result,MIN_PULSEWIDTH,MAX_PULSEWIDTH);
radio_status=1; // Radio channel read
return(result);
}
В этом случае будет врубаться штатный FS, по каналу Throttle…
В этом случае будет врубаться штатный FS, по каналу Throttle…
угу, НО НАДО на 0 1 3 каналах 1500 ставить - иначе коптер будет эти стики “слушать” и отлетать от нужной точки
upd: а constrain(result,MIN_PULSEWIDTH,MAX_PULSEWIDTH); не зарежут 950?
как то вот так
uint16_t APM_RC_PIRATES::InputCh(uint8_t ch)
{
uint16_t result;
uint16_t result2;
result=readRawRC(ch);
result = constrain(result,MIN_PULSEWIDTH,MAX_PULSEWIDTH);
if(failsafeCnt >= 20 && ch!=2 && ch<=3) {
result=1500;
} else if(failsafeCnt >= 20 && ch==2) {
result=950;
}
radio_status=1; // Radio channel read
return(result);
}
тут и резаться ничего не будет и FS штатный будет работать (для turnigy 9x)
upd: а constrain(result,MIN_PULSEWIDTH,MAX_PULSEWIDTH); не зарежут 950?
#define MIN_PULSEWIDTH 900
угу, НО НАДО на 0 1 3 каналах 1500 ставить - иначе коптер будет эти стики “слушать” и отлетать от нужной точки
Странно, разве на RTL влияют стики?
Странно, разве на RTL влияют стики?
не знаю, но кто-то писал что при отваливании пульта (FS) стики зависают и коптер летит непонятно как, к тому же там не только RTL может быть, а еще LAND
У меня всё руки не доходят до просто полетать (уже пол года не взлетал), не говоря уже о авторежимах… так что не знаю, как влияют стики на них 😃
Странно, разве на RTL влияют стики?
Влияет, при RTL коптером можно управлять, на прошлой странице обсуждали.
Влияет, при RTL коптером можно управлять
мдя, а я то думаю, отчего при подаче полного газа на приёмыш и отключении пульта моторы не сбрасывают обороты… жесть конечно, получается если на полной скорости залететь за препятствие то коптер автоматом переключится на РТЛ и на той-же скорости будет “пилить” домой?
Короче, надо провести будет полевые испытания…
Ну так полную 3D-модель местности в квадрик загружать пока не научились - в случае потери сигнала возвращаться квадрик будет по прямой.
Если есть опасение что влетит куда-нибудь - можно настроить высоту, на которой будет осуществляться RTH, поставить например 50м.
Имхо, тридцати за глаза, ты вспомни те вековые деревца 😃
Да, дерево 50м еще поискать надо, а секвойи у нас не растут 😃
в случае потери сигнала возвращаться квадрик будет по прямой
просто я хотел сделать акцент на
той-же скорости будет “пилить” домой
, т.е. если во время снижения пропадает связь - неуправляемая встреча с планетой обеспечена?
Да, думаю что после начала потери пакетов должен быть некий таймаут на восстановление связи (например 1с), при котором приемник будет выдавать последний принятый сигнал, а если сигнал так и не восстановился, тогда приемник переключится в failsafe.
Но ситуация потери связи именно в момент быстрого снижения имхо довольно маловероятна.
Да, думаю что после начала потери пакетов должен быть некий таймаут на восстановление связи (например 1с), при котором приемник будет выдавать последний принятый сигнал, а если сигнал так и не восстановился, тогда приемник переключится в failsafe.
сейчас так и есть, если 20 раз не удалось получить сигнал, то срабатывает FS
сейчас так и есть, если 20 раз не удалось получить сигнал, то срабатывает FS
хм… если сделали связь с приёмником по rx/tx можно ли оттуда взять цровень сигнала качества связи для срабатываения FS?
по rx/tx никто не делал связей, просто смотрится есть сигнал на 3 канале или нет, можно в общем то привязать и качество связи, например если за 10 периодов 3 раза не было сигнала, то 70% качество, но нужно ли?
алгоритм обнаружение сигнала
- есть прерывание - счетчик на ноль
- счетчик всегда плюсуется
- нет прерывания - счетчик плюсуется
- дошел счетчик до 20 - ставим его всегда 20 (чтобы переполнения не было) и делает какой то из вариантов FS
Такс, подкрутил я немного библиотеку входных сигналов от аппы.
- Статус рабочего приемника не отдается, пока не получим первый правильный пакет данных от приемника. Раньше всегда отдавался “работаем”. Это пришлось подправить, что бы не активировался FAILSAFE при запуске контроллера с отключенной аппой или приемником.
- FAILSAFE алгоритм детектирует пропажу сигнала по каналу THROTTLE. Если в течении 0.2сек нет сигнала, включается наш механизм FAILSAFE и выставляются значения 950,1500,1500,1500 (THROTTLE, PITCH, ROLL, YAW), Остальные каналы выдают то, что было последним валидным значением.
- В случае сработки нашего FS - вступает в работу штатный алгоритм FS? если он конечно включен и настроен через Mission Planner. Пороговое значение PWM можно оставить по умолчанию = 975
- В режиме PPM_SUM, так же отрабатывается FS.
- Добавил маленькие проверки на ширину импульса в случае PPM_SUM.
- Отключить наш FS можно в файле APM_RC_Pirates.cpp, в начале файла закоментить дефайн.
Ну и собственно сам файлик прикладываю, он от версии MPNG 2.8R3. Так же обновления залиты в SVN.
P.S. Основа взята из алгоритма Глеба (SovGVD) но я более красиво оформил его и доработал 😃
он от версии MPNG 2.8R3
А в 2.7R4 будет работать?
А в 2.7R4 будет работать?
Возможно что и заработает, если скомпилится…