Телеметрия (часть 1)

smalltim

Гуру, простите. Пошел убиваться об стену. Надо читать доки: оказывается, специально для таких идиотов, как я, у Атмеги128 есть специально обученные ноги в количестве 8 штук, которые могут генерить прерывания при изменении состояния на входе.
Впрочем, эти ноги частично пересекаются по функциям с SPI, так что вопрос остается в силе. Впрочем, атмега128 и USART свой в режиме SPI может использовать. Пойду всё-таки искать подходящую стену.

Dikoy
smalltim:

у Атмеги128 есть специально обученные ноги в количестве 8 штук, которые могут генерить прерывания при изменении состояния на входе.

Ну дык пол года лежит уже мой недоделок в инете, где это всё уже реализовано 😃 www.narod.ru/guestbook/?owner=13456664
Правда, там ошибка в математике вычисления периода, но это уже мелочи.

Ещё у атмеги есть прерывания PCINT. Оно одно, появляется при любом изменении на одной из ввереных лапок. В прерывании нужно понять, где и что произошло, это основное отличие от INTx. А лапок вверять можно много 😉

smalltim:

Теперь вот думаю такую мысль: у нас на борту будет акселерометр и 3 гироскопа. Так почему бы не заставить плату работать просто как 3 гироскопа, когда
автопилот не задействован? Гироскопы “включать”, разумеется, не всегда, а по команде с пульта.

Можно. Это избавляет от необходимости постоянной коррекции - состояние в момент включения и есть ноль.

belkinnn:

День добрый, мужики подскажите пожалуйста почему при расчете расстояния и азимута между двумя координатами один и тот же код на компе работает а в контроллере выдает всякую хрень причем через раз.

float 16-и битный, как считается тригонометрия ещё надо смотреть, возможно, ошибки в алгоритмах.
Эту математику МК будет просчитывать пол года 😃

belkinnn:

if ((StartLat < EndLat) && (StartLon < EndLon)) Bearing = abs(fAlpha * R2D);else
if ((StartLat < EndLat) && (StartLon > EndLon)) Bearing = 360 - abs(fAlpha * R2D);else
if ((StartLat > EndLat) && (StartLon > EndLon)) Bearing = 180 + abs(fAlpha * R2D);else
if ((StartLat > EndLat) && (StartLon < EndLon)) Bearing = 180 - abs(fAlpha * R2D);

Что за компилятор? Функция abs может быть некорректна. Просто пишешь (int)(fAlpha * R2D); или какой там тип Bearing.
И зачем там else?.. 😃

dikoy44.narod.ru/piros.html - более прямая ссылка.
Насчёт разноса по времени, Кузнецов, в своё время, со свойственной ему экспрессией довольно внятно объяснил историческую суть вопроса: на борту стоял тупой счётчик, который выделял канальные импульсы из потока данных радиоканала. А там не могут быть выделены импульсы одновременно, только последовательно.
То есть, если приёмник работает в “том” стндарте, что канальные импульсы возникают последовательно. Но сейчас половина аппаратуры на AVR делается, так что не факт… PCM точно может одновременно молотить, PPM, наверное, таки до сих пор последовательно. Одновременно передать состояния всех каналов в аналоговой системе радиопередачи невозможно.
Точнее возможно, но никто таким извратом заниматься не будет в цифровую эру.
Отсюда вывод: если радиоканал аналоговый, а у ППМ оно обычно так, то импульсы 100% последовательны. Если цифровой - скорее всего одновременны.
Был бы у меня приёмник, мог бы посмотреть осциллом. У меня он 4 канальный запоминающий 😃

Володимир
Dikoy:

Отсюда вывод: если радиоканал аналоговый, а у ППМ оно обычно так, то импульсы 100% последовательны. Если цифровой - скорее всего одновременны.

У цифровых передача информации все равно идет последовательно, а чтобы не расходовать много времени на один пакет, применяют разные ухищрения.

nokpblwkuH

2smalltim
система становиться все более и более навороченее, пора вводить интерактивные настройки, меню: какой-то канал отвечает за режим работы: меню или управление. в режиме меню, дальше меги ничего из сигналов не отдаем а ручки используем для навигации по меню.
второй вариант - постоянно отдаем 2 канала на меню. Двух каналов (т.е. двух кнопок) для меню достаточно.

belkinnn

Компилятор CodeW. abs работает коректно.А вот математа не лезет во float а double я так понял чтов МК ничем не отличается от float. А какая у вас математика, просто я пробывал просто по через теорему Пифагора ничего толкогово не получилось.Буду благодарен если поделитесь кодом или хотябы формулами.А растояния я не планирую больше 10 км от место старта.

Dikoy
belkinnn:

Компилятор CodeW.

Кодевижн чтоли? Он с плавающей точкой вообще через зад работает…
Переведи вычисления на дабл, должно помочь.

smalltim
Dikoy:

>Гироскопы “включать”, разумеется, не всегда, а по команде с пульта.

Можно. Это избавляет от необходимости постоянной коррекции - состояние в момент включения и есть ноль.

А подробнее можно? Что и где в момент включения есть ноль?

belkinnn
Dikoy:

Кодевижн чтоли? Он с плавающей точкой вообще через зад работает…
Переведи вычисления на дабл, должно помочь.

Пробывал таже песня при маленьких расстояниях происходит переполнение.При больших работает как часы.

Psw
Володимир:

У цифровых передача информации все равно идет последовательно

Да вот в том-то и дело, что Серж как-то жаловался на НЕ последовательную Футабу ПЦМ номер не вспомню.
Так что самое правильное но быть может не самое дешёвое - взять состояние принятых каналов по UART из хакнутого или самодельного приёмника типа Вад64, и туда же в приёмник отдать состояние выходных каналов по тому-же UART.
Но это так - мечты/мечты.
А использовать не дешёвые бортовые гиры для стабилизации модельки (особенно такой как верт) по 3м осям в нормальном полёте очень даже не помешает и полёт по камере могет значительно облегчить. Хотя математически и тут всё не так уж и просто, особенно если делать ПИ(Д) алгоритмы - я что-то плохо себе представляю, как будет лететь самаль, которому задали крен 30 градусов и кабрирование 1 градус, он же будет иметь угловую скорость вокруг вертикальной оси к примеру, при этом хвост станет пытаться эту скорость убрать и сохранять первоначальный азимут полёта. Что будет дальше - не представляю, но наверняка придётся сводить команды самалю к высоко уровневым согласованным манёврам. Потому как взаимо проникновение каналов гир будет ещё и через полётные свойства модели идти.

pvp
Dikoy:

Насчёт фьюзов через флип…

Вот ссылочка на соответсвующий документ: www.atmel.com/dyn/resources/…/doc7769.pdf.
На странице 12, п. 7 FAQs, читаем 3-ий вопрос-ответ:

  1. Can I modify the fuse bits using Flip?
    • No, Flip cannot modify the fuse bits. To modify the fuse bit you can use either the JTAG ICE
    MKII, the AVRISP MKII, or parallel programming.
smalltim

>3. Can I modify the fuse bits using Flip?
>• No, Flip cannot modify the fuse bits. To modify the fuse bit you can use either the JTAG ICE
>MKII, the AVRISP MKII, or parallel programming.

Да, я это уже успел увидеть. Ну, пока дефолтное состояние фьюзов меня устраивает.

belkinnn:

Компилятор CodeW. abs работает коректно.А вот математа не лезет во float а double я так понял чтов МК ничем не отличается от float. А какая у вас математика, просто я пробывал просто по через теорему Пифагора ничего толкогово не получилось.Буду благодарен если поделитесь кодом или хотябы формулами.А растояния я не планирую больше 10 км от место старта.

Устраиваем систему координат на плоскости в точке старта так: ось Х - с запада на восток, ось Y - с юга на север.

Расстояния от базы до самика по этим осям будет равно:

DX ~ Rземли*(разница долгот между стартом и самиком выраженная в радианах)*cos(широта точки старта)
DY ~ Rземли*(разница широт между стартом и самиком выраженная в радианах)

При этом используется известный факт, что для маленьких углов a
sin(a) ~ tg(a) ~ a

Дальше считайте азимуты как Вам угодно 😃

Artie
Psw:

Так что самое правильное но быть может не самое дешёвое - взять состояние принятых каналов по UART из хакнутого или самодельного приёмника типа Вад64, и туда же в приёмник отдать состояние выходных каналов по тому-же UART.
Но это так - мечты/мечты.

Я давно предлагаю Тимофею свои доработки мультиплексовских приемников (именно для этого), но он пока не хочет… 😛

leliksan

Добавлю свои три копейки по гироскопам в каналах управления эроплана. Пробовал вкорячивать вертолётную гиру по очереди на все каналы. На крен и тангаж очень полезно-летит как по рельсам даже в ветер.А вот на хвост противопоказано-при полёте с небольшим креном модель поворачивает в сторону крена а хвост пытается противодействовать этому. В результате модель начинает лететь со всё большим боковым скольжением и увеличивающимся креном, теряет скорость и управляемость и валится в штопор. Единственная полезность от гиры на хвосте-хорошее удержание курса при пробежке по земле, но после взлёта нужно отключать.
С уважением.

smalltim

>А вот на хвост противопоказано-при полёте с небольшим креном модель поворачивает в сторону крена а хвост пытается противодействовать этому.

+1
Тоже думал об этом, но не так живо представлял себе поведение модели. Ну и отлично, мне же меньше работы будет 😃

lodeworx
smalltim:

Гуру, простите. Пошел убиваться об стену. Надо читать доки: оказывается, специально для таких идиотов, как я, у Атмеги128 есть специально обученные ноги в количестве 8 штук, которые могут генерить прерывания при изменении состояния на входе.
Впрочем, эти ноги частично пересекаются по функциям с SPI, так что вопрос остается в силе. Впрочем, атмега128 и USART свой в режиме SPI может использовать. Пойду всё-таки искать подходящую стену.

Ну вот типа: например. Из моего декодера PPM. Использует ICP. Если по каналам, я использовал “подключатель” на hct125d- лишний драйвер тоже не помешает, для выравнивания фронтов. Что касается самих импульсов, я думаю, что если с контроллера выводятся напрямую к машинкам(в приемнике)- то одновременно стартуют…(все включил, по счетчику отключил)
[codebox]
//////////////////////////////////////////////////////////////
#define PULSEZ 32
#define RC_SEQ_PRESENT 0
#define RC_SEQ_ACKQ 1
#define TURN_LED_ON PORTB|=_BV(LED_0)
#define TURN_LED_OFF PORTB&=~_BV(LED_0)
volatile uint16_t MeasuredIcpz[PULSEZ*2], RcvdData[8], cntz;
uint8_t ChnlCnt, SYS_LOGIC_BITS, pulse_Piece;
//////////////////////////////////////////////////////////////
void InitCapture (void) {
cli();
TCCR1B=0;
TCNT1=0;
TCCR1B |=_BV(CS11) |_BV(ICES1);// Период измерения равен 8*65536/XTAL
TIMSK |=_BV(TICIE1) |_BV(TOIE1);
sei();
}
ISR (TIMER1_CAPT_vect){
TCCR1B&=~_BV(CS11);//стоп таймер
TCNT1=0; //счетчик в ноль
if (bit_is_clear(TCCR1B,ICES1)) TCCR1B|=_BV(ICES1);// переключаем полярность срабатывания
else TCCR1B&=~_BV(ICES1);
TCCR1B|=_BV(CS11);// таймер старт
if (ICR1<5555) {// мин. значение длительности на которое следует реагировать (для JR при кварце 12mhz в моем случае)
//TURN_LED_OFF;
SYS_LOGIC_BITS|=_BV(RC_SEQ_PRESENT); // последовательность присутствует!
MeasuredIcpz[pulse_Piece]=ICR1;// сохраняем все данные???
if (MeasuredIcpz[pulse_Piece]>777) {// канальный синхро ~550 не нужен
///////////////////////////////////////////////////////
RcvdData[ChnlCnt]=(RcvdData[ChnlCnt]+MeasuredIcpz[pulse_Piece])>>1;// усредняем???
///////////////////////////////////////////////////////
if (ChnlCnt++>=7) ChnlCnt=7;// сохраняем 8 каналов
}
if (pulse_Piece++==(PULSEZ*2)-1) pulse_Piece=0;
} else {
cntz=pulse_Piece;
ChnlCnt=0;
pulse_Piece=0;
SYS_LOGIC_BITS|=_BV(RC_SEQ_ACKQ);// если больше 5555 - посылка принята!
}
}
ISR (TIMER1_OVF_vect){// при переполнении таймера сбрасываем бит наличия и счетчики
cntz=pulse_Piece;
pulse_Piece=0;
SYS_LOGIC_BITS&=~_BV(RC_SEQ_PRESENT);
SYS_LOGIC_BITS&=~_BV(RC_SEQ_ACKQ);
//TURN_LED_ON;
}
[/codebox]
Типа, вот. просто и понятно. Работает шикарно. Input Capture Noise Canceler -не пробовал, за ненадобностью
MeasuredIcpz и cntz можно выкинуть

belkinnn

Мужики спасибо.Мне както даже стыдно в сложных расчетах разобрался а на простых завис.
Теперь мой простенький автопилот работает.

Dikoy
smalltim:

А подробнее можно? Что и где в момент включения есть ноль?

Текущее положение есть ноль. Его автопилот и поддерживает дальше.

Dikoy
pvp:

Вот ссылочка на соответсвующий документ: www.atmel.com/dyn/resources/…/doc7769.pdf.
На странице 12, п. 7 FAQs, читаем 3-ий вопрос-ответ:

Да, я нашёл уже.
В принципе, так и есть - бутлодер работает внутри чипа, а запись фьюзов из приложения невозможна.
Мой программер работает через ISP, посему ему пофиг.
Впрочем, кроме делителя на 8, который можно подправить из софта, и маленького периода вачдога, котрый от туда же правится, претензий к фьюзам нет.

smalltim

Коллеги, на плате автопилота не предполагается делать какое-то меню настроек, кнопки и т.д. Все настройки - с компука, через USB.
Это приемлемо?

Сейчас еще есть время подумать и решить, надо ли настройки кнопками на плате и экранное меню поверх видеосигнала, или не надо.

И еще вопрос: а где лучше хранить собственно пользовательские настройки автопилота, телеметрии и т.д.? В EEPROM Атмеги или во внешней памяти?

BigDaddy

С одной стороны заманчиво подстраивать автопилот пямо в поле кнопками, поглядывая через очки в меню. А с другой стороны, не усложнит ли это конструкцию?
У меня вот другое немного предложение: а не замутить ли простенькую систему автослежения для патч антенки приемника, как пан-титл у камеры? Чтоб антенка сама доворачивалась по максимуму сигнала.

nokpblwkuH
BigDaddy:

С одной стороны заманчиво подстраивать автопилот пямо в поле кнопками, поглядывая через очки в меню. А с другой стороны, не усложнит ли это конструкцию?

Как программист могу сказать точно - написать код, отвечающий за отрисовку и функционал меню (меню сразу должно подразумевать многоуровневость) очень просто.
Т.е. сейчас меню - функция желательная, но не обязательная (а через пол-года год вполне может стать очень и очень нужной).
Если здесь демократия и можно голосовать, 😃 то я “за” меню.