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

DVE

Вы пробовали написать хоть что-то без открытого SDK, мануалов, примеров и прочего? Очень я скажу, неперспективное занятие, когда ничего не работает, а гугл находит 0 ссылок по теме.
Но если из спортивного интереса, пробуйте конечно.

PS: Желающие использовать смартфон для коптера тут на форуме появляются раз в 2-3 месяца, но за несколько лет что-то работающее вроде сделал только 1 человек, и то потом пропал куда-то 😃

Дмитрием_меня_зовут

😁, пробовал, ещё в те времена, когда http протокол был достоянием пары тройки исследовательских центров, а Брин (гугл) только приобретал свой первый сексуальный опыт и не помышлял о гугле, да и слова такого не знал). А литературу по программированию на Турбо С обменивал я на валюту - бутылки с водкой.

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

leprud

Я писал под arm7tdmi (gameboy advance). GCC конечно же!
Кое что из перефирии было очевидно, как подключено (или перебором интерфесных портов подбиралось), но многое пришлось искать методом тыка и детрассировки платы вручную.

Неблагодарное это дело, скажу я вам.

Razek
Дмитрием_меня_зовут:

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

А имя и фамилия у этих датчиков есть?

Какая ваша цель, кстати, сделать полетный контроллер из платы потому что она есть, или нужно делать какие-то тяжелые вычисления для контроллера? Или может просто скоротать время? =))

rual
SergDoc:

Загляните code.google.com/p/afrodevices...src/kalman1D.c занятно!

Сергей, это не совсем тот калман что нужен для 3х измерений, это одномерный. Они его запустили раздельно нитками для каждого канала, ИМХО это не гуд… Это типа подать данные с ДУСов на 3 ПИДа и с последних на моторы… Летать возможно будет, но может и вывернутся. ДЛя акро пойдёт, ибо пилот сам выдит горизонт, а вот для устойчивого удержания горизонта нет.
Кста, вполне пойдёт для одномерных датчиков, типа баро и аксельЗет.

SergDoc

так я сейчас и планировал заняться, на мелкоплате именно Z, повесить ms5611 проверить, за одно проверить как DT-шки отнесутся к 12-м гефманам и вот этим пропам, взял на пробу, по предположению моему, должны тягу давать примерно как APC, подшаманил трёху, щас вроде морозик небольшой будет, подсушит выведу на прогулку, Mhovik Александра альтхолд на этой плате не работает нормально - подержит немного, а потом дёргать начинает примерно на метр ( аксель шумит и баро не к чёрту), так я и планировал попробовать ту одноосевую байду, что показывал,
а кстати кеил не переваривает переменных объявленных прямо в цикле

 float dT = cycleTime * 1e-6;

это оттуда же, или что-то не так?

Дмитрием_меня_зовут

Фамилие у датчиков такое:
lis3dh - 3-x accel,
L3G4200- 3-x гиро,
АК8973 - 3-х компас.

Хочу на этой плате дабы не иметь разумных ограничений по тому, какую часть ТАУ заложить в мозги коптера. Хоть все мыслимые и немыслимые алгоритмы.

SergDoc
SergDoc:

Загляните code.google.com/p/afrodevices...src/kalman1D.c занятно!

воткнул я этот кальманутый фильтр в мелкоплату - цикл 2000😵 и пока Дус-ы не дорабатывают:( надо смотреть алгоритмы - скорость углоавя получилась в два раза меньше чем надо 😦 копаю…

С ДУСами разобрался, если не обращать внимания на цикл, то работает пока, понаблюдаю…

5 минут - мелкоплата подвисла…

SergDoc

а какая разница - большую часть времени всё равно занимает опрос датчиков (точнее частота опроса датчиков в основном задаёт цикл) и частота проца тут как-то не особо влияет, пусть хоть 3ГГц ну цикл станет пусть 1200 - 1500мкс не меньше…

мелкоплата продолжает исправно работать, почему подвисла прошлый раз не знаю, скорей всего сам невзначай программатор дёрнул…

oleg70
rual:

Вот и моя Ф3 полетела:
Вобщем работы ещё много, но хотелось похвастаться:) Как только допилю старт и терминал с сохранением настроек выложу хекс.

Поясните (если не сложно) мне начинающему.
Я все читаю Ваш листинг (RUS_ins) как пример для изучения методики программирования под stm и возник следующий вопрос (чисто теоретический):
Неужели удобно так усложнять (как мне кажется) структуру проекта, создавать несколько отдельных *.с и *.h файлов, затем их линковать ?
Или это просто правило хорошего тона программирования на СИ ?
(все никак не могу перестроить мозги после AVR)

SergDoc

А с практической точки зрения, лучше при поиске лопатить один большОй файл с кодятником или отдельные маленькие? В моём случае мне на много удобнее держать готовые драйвера для LSM-ки, потом их просто подключать в проект, чем постоянно переписывать чужой код, ну так и с остальными файлами - захотел другое ИМУ поключил, или какой другой модуль заменил, о вспомнил слово - Модульность…

oleg70:

все никак не могу перестроить мозги после AVR

а взять ардупилот или мультивий, да даже в КУКе три файла отдельных по моему…

oleg70

Всякие “мультивии” пишет много людей, а тут вроде для себя…
Ну в общем понял: чисто дело вкуса.
Спасиб…

SergDoc

Не так у Александра проект тоже на каком-то другом проекте (из примеров) собран…

oleg70

Мысли вслух по поводу Cortex и т.п.:
Так и заставляют абстрагироваться от железа и привязать все к библиотекам, поэтому и по регистрам в даташите практически ничего.
Не так ли?

SergDoc

Мои соображения ARM патентованая технология и за неё надо платить Cortex - ядро Грарвардской архитектуры, и с ним надо работать - так-то и так-то (библиотеки), а остальное обвязка по желанию производителя, по ней и даташит и написан… надеюсь ничего не напутал 😃

rual
SergDoc:

а кстати кеил не переваривает переменных объявленных прямо в цикле Код: float dT = cycleTime * 1e-6;это оттуда же, или что-то не так?

Это вполне нормально для “нормального” Ц, переменные объявляются и инициализируются до кода модуля. ГЦЦ не строго придерживается правил , посему можно писать на смеси Ц и Ц++. Чтоб не париться с переписыванием, измени файлу расширение на *. cpp

SergDoc:

воткнул я этот кальманутый фильтр в мелкоплату - цикл 2000 и…

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

oleg70:

Так и заставляют абстрагироваться от железа и привязать все к библиотекам, поэтому и по регистрам в даташите практически ничего. Не так ли?

Не так, все биты найдете в соответсвующем пдфе на стшном сайте, но писать всё (особенно первый проект) в прямом обращениии к регистрам нереальный гемор, и смысла нет, т.к. компиллер всё оптимизирует к “чтение-модификация-запись”, да и вызво подпрограмм в СТМ очень быстрый.

oleg70:

Поясните (если не сложно) мне начинающему. Я все читаю Ваш листинг (RUS_ins) как пример для изучения методики программирования под stm и возник следующий вопрос (чисто теоретический): Неужели удобно так усложнять (как мне кажется) структуру проекта, создавать несколько отдельных *.с и *.h файлов, затем их линковать ?

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

SergDoc
rual:

Чтоб не париться с переписыванием, измени файлу расширение на*. cpp

там их пять штук было, объявил вначале и всё, на счёт как летает, на Naze32 говорят, что лучше чем комплиментарный, одно только не догнал, аксель я вообще без проблем добавил а вот ДУС какой-то косяк, пришлось MPU3050 в коде автодетекта пристрелить тут добавилось без проблем:

 // Autodetect gyro hardware. We have MPU3050 or MPU6050.
    if (mpu6050Detect(&acc, &gyro, cfg.mpu6050_scale)) {
        // this filled up  acc.* struct with init values
        haveMpu6k = true;
    } else if (l3g4200dDetect(&gyro)) {
        havel3g4200d = true;
    } else if (lsm330gyroDetect(&gyro)) {
        haveLSM330 = true;
    }	else if (!mpu3050Detect(&gyro)) {
        // if this fails, we get a beep + blink pattern. we're doomed, no gyro or i2c error.
        failureMode(3);
    }

а тут - настройки фильтра:

 // todo: this is driver specific :(
      if (havel3g4200d) {
        l3g4200dConfig(cfg.gyro_lpf);
    } else {
        if (haveLSM330)
            lsm330gyroConfig(cfg.gyro_lpf);
           }
		//else {
   //     if (!haveMpu6k)
   //         mpu3050Config(cfg.gyro_lpf);
   // } 

пришлось убрать MPU3050 иначе ругется что lsm330gyroConfig не объявлена почему-то и переменная haveLSM330 объявлена но не используется…
сколько не копал не нашел причину…

oleg70
rual:

Не так, все биты найдете в соответсвующем пдфе на стшном сайте,

Ткните меня носом пожалуйста на ссылку, ну ни как не найду…😃

SergDoc
rual:

Когда полетишь?

Не поверишь, дожди 😦 а дома негде… , а так трёха приведена в порядок, платка вроде не глючит, пиды подкрутить и можно пробовать… сонар пока не вклинивал…

дааа, поковырялся я в этой штуке, в общем фильтрует он сырые данные с датчиков, а потом скармливает их мультивийному иму на комплиментарном фильтре, где глубинный смысл? проц нагрузить? про барометр (BMP085) молчу если даже сказать груди, сиськи от этого лучше не станут скорость(вертикальная) как не фильтруй, а всё равно до 10см/с добегает - коэффициенты пока умолчательные…