Создание собственной системы стабилизации

SergDoc

я сегодня на работе плату свою убил 😦 уронил блин крокодилы 12В (вот такой вот я безрукий - и знал же что работы дофига, нет надо платку проверить побыстрому, вот и лежала на столе) - магнитометр отвалился и дорожки поотгорали, уарт не работает, что ещё сгорело не знаю MPU жива - на наклоны отзывается -светодиодик моргает 😃 так что не всё потеряно, буду блин потихоньку пересобирать - благо питатели целые - платки ещё есть, жалко наверно баро тоже в топку, а так магнитометр с мелкоплаты сниму, вот с процем косяк - даа, ну ничего переживём, главное сейчас в следующую реинкорнацию платы не удариться (есть мысли по улучшению), а то ещё один нелетающий проект получится, будем надеятся что почта России не сожгла подарок от Александра rual… да блин вообще какой-то несчастливый проект 😦

DVE

Еще год назад надо было купить за 70$ Naze32 (или за 140$ PX4 если с запасом и на вырост) и спокойненько писать софт под те же MPU и прочее, не отвлекаясь на лишнее… Тогда может и летало бы уже что-нибудь сейчас 😃 А параллельно свою версию делать, под специфические нужды если надо.
Это так, мысли вслух, у автора похоже свой путь джедая 😃

Про плату сочувствую, но как писал кто-то из ученых, приобретаемый опыт пропорционален количеству испорченного оборудования, так что дело наживное…

SergDoc
DVE:

Еще год назад надо было купить за 70$ Naze32 (или за 140$ PX4 если с запасом и на вырост) и спокойненько писать

у меня мелкоплата (барометр только вернуть) и КУК есть, летать есть на чём, всё равно пока некогда, пересоберу плату и можно будет подлетнуть почти сразу.

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


static void pwmGPIOConfig(GPIO_TypeDef *gpio, uint32_t pin, uint8_t input)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = pin;
    if (input){
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
		}
    else{
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    }
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(gpio, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_TIM2);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_TIM2);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM8);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM8);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource9,  GPIO_AF_TIM1);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_TIM1);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_TIM1);

}
rual
mahowik:

в будущих планах сделать порт baseflight (или еще чего) на discoveryF3 и напихать туда своих фенек…

Александр, мою сборку не пробовал? Интересно твоё сравнение с вием. Мне сравнить не с чем. Вообще аксель мотает жутко от вибраций. Хочется понять можно ли что то улучшить алгоритмом или нужен другой датчик.

SergDoc:

а то ещё один нелетающий проект получится, будем надеятся что почта России не сожгла подарок от Александра rual…

Да, что то долго она зависла на PCI-2, надеюсь что это обычная нерасторопность.

SergDoc

Блин тоска смертная, может начать рисовать что-нибудь, или купить что-нибудь ненужное, тита мелковия…

mahowik
rual:

Александр, мою сборку не пробовал? Интересно твоё сравнение с вием. Мне сравнить не с чем. Вообще аксель мотает жутко от вибраций. Хочется понять можно ли что то улучшить алгоритмом или нужен другой датчик.

в отпуск как маньяк прихватил с собой ф3 и ноут… т.к. в дистрибутивах был только coocox пробовал под него настроить твой проект… после некоторых мучений таки скомпилил, но hex получался нулевой… 😃 я java-ст и в сишных компиллерах/линкерах/билдерах как свиня в апельсинах 😃
под конец отпуска разжился платным инетом и таки скачал Keil, собрал твой проект и даж покрутил в вийном гуи )) кстати, почему ты выбрал вийный протокол, а не мавлинк тот же?!
по приезду работа… на этом все и закончилось…

по акселю могу посоветовать зажать его по самое не могу на 0.2-0.5 гц софтовым фильтром и соот-но дать доверия на макс. гире, т.е. так что бы только корректировать дрейф… нормально когда после дикой болтаники платы, горизонт полностью выходит в ноль через 2-4 сек…

если уж это не поможет, подруби mpu6050 и сравни… благо они сейчас на развес по 4-5$

mahowik

Еще вот вспомнил. Некоторые аксели плохенькие, с уменьшением частоты среза внутреннего НЧ фильтра банально уменьшают самплинг (имел дело когда то и намучался с ADXL345). В итоге получается к примеру на 10гц всего 20 самплов и при вибрациях, результат только хуже, т.к. выборки идут из всплесков шума. Потому надо поднимать самплинг хотя бы до 100гц (лучше 200гц) и забить на внутренний НЧ, точнее установить его так, что бы было честных 100 самплов. А далее уже читать эти raw самплы и давить софтовым НЧ фильтром. Как писал выше на ~0.2-0.5гц и отдавать в ИМУ…
Ну а в нормальных акселях, при уменьшении внутреннего НЧ фильтра, самплы не режутся и делается честное усреднение заданного кол-ва самплов на выбранный НЧ фильтр. В частности переход на bma020 тогда дал совсем другую картинку…
Также надо не забывать, что диапазон должен быть не менее 8g, дабы избежать переполнения на внутреннем АЦП акселя.
И последний печальный момент. У некоторых акселей, есть свои внутренние физические резонансы, которые ну никак не убрать. Тогда только менять на другой… mpu6050 ну просто песня в этом плане! 😃

SergDoc

да я уже описывал, мпу против лсм330 небо и земля, в лсм задушенном фильтрами acc_lpf_factor = 250, в мпу - это практически сырые данные… гиры работают примерно одинаково - не взлетал на мпу…

oleg70

Если кто нибудь имеет “инфу” по NMEA0183 поделитесь пожалуйста… Погуглив нашел массу ссылок и англ. и русскоязычных, но для построения алгоритма парсера в них не хватает важных тонкостей типа свойства конкретного поля изменять длину, или “вес” символа до и после точки…
Например в $GPVTG поле скорости км/ч имеет вид ,0.00, (?.??), это что до сотых долей что ли выдается?
Понял только что версий много (ну уж не одна), а где взять документацию? (не ужели опять за деньги, как где то встречал?)

SergDoc

Т.к. платы пока нет и программировать пока нечего (даже пытаться не хочется), начал рисовать реинкорнацию мелкоплаты. Из названия - размер 36X36, ну если удастся то ещё и меньше.
проц stm32F405(407)RGT6
гироаксель MPU6050 - из-за размера не смогу позволить SPI да и дешевле
барометр MS5611
компас HMC5883 подключен через MPU
вход один
выходов 8-10 (как выйдет)
2 UART
1 -2 SPI
АЦП
флешка (25P16)
Разъём сонара
возможны дополнительно свободные i2с и can
Пожелания имеются?

rual
mahowik:

почему ты выбрал вийный протокол, а не мавлинк тот же?!

мавлинк мне сильно сложным показался по началу, вий проще было портировать. Тем более ранее возможности мавлика были на пару голов выше моих потребностей. Теперь нахожу мавлинк весьма продуманным и удобным, кроме того есть полное описание. Но пока цейтнот из-за конкурса и дачных проблем. Как будет время буду портировать мавлика.

mahowik:

если уж это не поможет, подруби mpu6050 и сравни…

Так и сделаю, только вот нет у меня девплаты под МПУ, почта ходит хреново, а самому делать лень.

SergDoc:

Пожелания имеются?

Для мелких особых расширений не нужно, может только СПИ для сурагатного ОСД или под оптикфлоу.

oleg70:

Если кто нибудь имеет “инфу” по NMEA0183 поделитесь пожалуйста…

yug-gps.narod.ru/docs/000x/st007.htm все величины в десятичных дробях , кроме градусов долготы-широты

SergDoc
rual:

Для мелких особых расширений не нужно, может только СПИ для сурагатного ОСД или под оптикфлоу.

короче, пока получается всё наоборот, i2c оно же uart3 выведены в отдельный порт, датчики по SPI (маг через MPU6000, лапу прерывания с магнитометра наверно нет смысла выводить? всё равно всё в регистрах MPU будет) всё лишнее (eeprom flash) убрал нафиг, СПИ выведен но не для ОСД, а скорей для управления этой крохой (малина или ещё что), платка в принципе самодостаточная, но задумка есть использовать её как спинной мозг с мозжечком, а управление отдать чему-то другому.
8 выходов, 2 из которых могут быть i2c, а ещё 2 can, вход один, 2 входа АЦП, разъём под сонар, выход на пищалку, USB (наверно придётся ставить микро, мини полплаты занимает 😦 ), ну и вездессущий вездесущий uart1, контактные площадки под ST Link, всё больше ничего. рисую просто так, для занятся чем - нибудь, до изготовления когда дело дойдёт - незнаю, по готовности выкину всё в гит, может кому интересно будет…

rual
SergDoc:

задумка есть использовать её как спинной мозг с мозжечком

На Ф4 увесистый мозжечек получается))) Ф1 конечно скучно, но мож Ф3?

SergDoc

Ну во первых, платы хочу совместимые, что маленькая, что большая, во вторых - не оставляет надежда на полный фильтр Калмана, а там Ф4 придётся как нельзя лучше, ну и третье ф3 - не видел и не знаю, а с Ф4 более менее познакомился 😃 чесно - я так устал, у меня на протяжении всей этой истории косяк за косяком, как буд-то злой рок какой-то, всё чёрт знает как: управление отказывало, микросхемы ломал, жег, то вышлют то не вышлют, то вообще запрет на штатовские детали (полупроводники), как следствие доставать всё (все комплектующие) сложнее, да и штатных (нештатных) ситуаций сколько, батарейки дохнут, моторы отказывают. Тут наверно в пору бросит всё, но нет - доведу до конца, надо, да и упрямство сильнее 😃

SergDoc

для большей платы вот эту штуку взять или дорого? не 80 см маловать, но вместо сонара для автопосадки пойдёт?

DVE

И Наза и Х4 отлично садятся без каких-либо внешних датчиков, по изменению высоты с барометра наверно.

Имхо интереснее копать в сторону программной реализации.

SergDoc

Ну если медленно и аккуратно, то можно и по барометру, а если экстренно, то при быстром снижении надо притормозить перед касанием, а по барометру разброс показаний около земли будет около 30-40см - не хотелось бы впилить в планету со всей дури… ещё на мелкоплате экспериментировал с сонаром - катался на экране 10-15 см лапами от поверхности - прикольно катится как по льду - высоту не меняет 😃

rual
DVE:

И Наза и Х4 отлично садятся без каких-либо внешних датчиков, по изменению высоты с барометра наверно. Имхо интереснее копать в сторону программной реализации.

Если аксель и баро адекватны, то для самого процесса посадки достаточно управлять вертикальной скоростью. Сонар больше нужен просто для определения самого наличия поверхности под аппаратом, что важно для полной автоматизации полёта. Или для автопосадки самолётов, там мягкой посадки без него не реализовать.

SergDoc

Ну вот к примеру - пусть таже наза, как известно спускается она с трудом, имеем разбежку высот старта и посадки ну метров 15-20, ветер - что мы видим аппарат спустился до высоты точки старта - из-за ветра скорость спуска =0 - о да мы сели!!! и с 20 метров в асфальт, или что там под аппаратом…

DVE

Не, замеряется наверно именно скорость снижения, т.е. текущая дельта по барометру, а не разность давлений взлет/посадка.

rual
DVE:

Не, замеряется наверно именно скорость снижения, т.е. текущая дельта по барометру, а не разность давлений взлет/посадка.

Как там делается я не знаю, но при старте надо бы засекать высоту места, только вот теоретически за время полёта может измениться давление и дрейф ГПС и баро. Посему нужно снижаться до тех пор, пока интегральная составляющая вертикального ПИД не уйдёт существенно в минус, т.е. упёрлись в планету.