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

rual
SergDoc:

полный отказ от i2c - барометр по spi, 64-лапый проц(я под него рисовал на бумажке разводку -влазит всё)

Сергей, разве с одной и2ц не влезет, с чем конфликтует?
ШИМ-входов/выходов 8/8 можно тоже отказаться, достаточно 6/6.

SergDoc

не её можно оставить свободной 😃 но датчики то быстрее читать без неё… я прикидывал 64-х лапый проц, входов -выходов хватает (а можно вход ppm только оставить), два spi, i2c, ацп только по моему один вход остаётся (на той что сейчас v1.2, 1 батарея+4 свободны и выведены)…

rual
SergDoc:

не её можно оставить свободной но датчики то быстрее читать без неё…

Дык я только ЗА!

SergDoc:

два spi, i2c, ацп только по моему один вход остаётся

Это плохо, лучше было бы 2 вывода оставить (напруга+ток), остальные вообщем и не нужны.

Ты, кстати, родную прошивку через УСБ проверял ?

SergDoc

до усб не добрался, я пока с spi застрял - разбираюсь, воткнул 6000 - в автодетект, вместо 6050, подумал пусть будет - если какой глюк с датчиком до дальше детектирования никуда не уйдёт - аппарат не заведётся 😃

oleg70
rual:

Контроллер должен вываливать вот такое

День убил, - не хочет работать, причем похоже тупо виснет Phiton при выводе графики (с виндой 7 чтоль конфликт)…
В простой версии MiniImu данные с порта бегут в окне “Shell”, но нет изображения 3D кубика.
В версии по Вашей ссылке есть картинка стрелок (статическая) но нет данных в окне “Shell”…
Невезуха …

SergDoc

сейчас спрошу глупость: когда читаю, я засылаю что-то типа 0Xff обратно получаю данные, когда записываю - шлю данные - получаю обратно данные -1?..

rual
SergDoc:

когда читаю, я засылаю что-то типа 0Xff обратно получаю данные, когда записываю - шлю данные - получаю обратно данные -1?.

Где получаешь? Через printf? Если так, то тег %x даст 0xff, а тег %d даст -1.

2mahowik Александр, прочитал аннотацию к твоей прошивке. Ты пишешь про двойное интегрирование акселя и комплементарный фильтр 99/1. Боковые ускорения тоже как то учитываешь для горизонтальной стабилизации? Как ведёт себя коптер при вибрациях?

Про себя пока сказать нечего, сочиняю более сложную матмодель ИНС (как сказал?!😎), т.к. интегрировать в аксель по простому не получается. Три попытки повисеть на дальномерах дома обернулись царапинами на дверях, жаль не заснял ранее пролёт по коридору. Щас вышел на работу, попробую снова в коридоре.

SergDoc

МПУ приехала, надо теперь запаять окуратно 😃

mahowik
rual:

Ты пишешь про двойное интегрирование акселя и комплементарный фильтр 99/1. Боковые ускорения тоже как то учитываешь для горизонтальной стабилизации? Как ведёт себя коптер при вибрациях?

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

rual
mahowik:

если интересуют наработки, пиши в личку…

Не буду (пока ) тебе морочить голову в личке, я думаю таких без меня полно:)
Вот хочу сравнить ЛСМку с МПУшкой, у тебя ведь последняя? Можешь дать лог сырых данных акселя с висящего коптера, в этом ведь ничего секретного нет, отсчётов 100?

SergDoc

Как правильно под spi переделать:

ack = i2cRead(MPU6050_ADDRESS, MPU_RA_WHO_AM_I, 1, &sig);
if (!ack)
        return false;
if (sig != (MPU6050_ADDRESS & 0x7e))
        return false;

    // determine product ID and accel revision
    i2cRead(MPU6050_ADDRESS, MPU_RA_XA_OFFS_H, 6, tmp);
    rev = ((tmp[5] & 0x01) << 2) | ((tmp[3] & 0x01) << 1) | (tmp[1] & 0x01);
    if (rev) {
        /* Congrats, these parts are better. */
        if (rev == 1) {
            mpuAccelHalf = 1;
        } else if (rev == 2) {
            mpuAccelHalf = 0;
        } else {
            failureMode(5);
        }
    } else {
        i2cRead(MPU6050_ADDRESS, MPU_RA_PRODUCT_ID, 1, &sig);
        rev = sig & 0x0F;
        if (!rev) {
            failureMode(5);
        } else if (rev == 4) {
            mpuAccelHalf = 1;
        } else {
            mpuAccelHalf = 0;
        }
  • оно надо, ибо это и автодетект, и определение ревизии акселя (потом для настройки нужно)… остался только этот кусочек и можно пробовать с mpu общатся…
SergDoc

Натворил чего-то, завтра даст бог, запаяю мпу, буду пробовать читать…

mahowik
rual:

Не буду (пока ) тебе морочить голову в личке, я думаю таких без меня полно

да без проблем! теребят то в основном по фигне всякой, а тут приятный мужской разговор 😃

rual:

Вот хочу сравнить ЛСМку с МПУшкой, у тебя ведь последняя? Можешь дать лог сырых данных акселя с висящего коптера, в этом ведь ничего секретного нет, отсчётов 100?

У меня AIOP 1.0 контроллер с mpu6050 на борту… наверное последняя… а их было несколько версий?
с логами сложнее… я в основном в рантайме на графики смотрю в ГУях, но вроде как андроид прилага EZ-GUI позволяет писать… посмотрю…

rual
mahowik:

а их было несколько версий?

Я имел ввиду что у тебя МПУшка, а не другой датчик.

mahowik:

EZ-GUI позволяет писать… посмотрю…

Хорошо, жду… Если можно побольше отсчётов, а то боюсь для статистики не хватит.

SergDoc:

Как правильно под spi переделать

ДОстаточно заменить все функции i2cRead(MPU6050_ADDRESS, MPU_RA_XA_OFFS_H, 6, tmp) аналогичной для СПИ.

SergDoc
rual:

тебя МПУшка, а не другой датчик

их несколько ревизий было с разными акселями, а единственное, я так понял, что-бы узнать ревизию надо читать регистры MPU_RA_WHO_AM_I и MPU_RA_PRODUCT_ID, а там ревизий 5+6 в зависимости от модификации какой-то…

SergDoc

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

rual

Сергей, когда планируешь прошивку доделать? Разъем ПРОГ это усарт1?

SergDoc
rual:

Разъем ПРОГ это усарт1?

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

rual
SergDoc:

gps - 3-й выведен сверху на верхнюю плату

т.е. на 2м этаже у тебя свой ГПС будет?

oleg70
SergDoc:

Ну вот наконец-то нижняя плата в сборе

Я сейчас изучаю углы, рассчитанные IMU со своей самоделки, и вдруг задумался (!): а правильно ли я разместил относительно друг друга гиру и аксель+маг на плате ? Одноименные оси (по даташиту) получились совмещены в одном направлении… правильно?
Есть ли правило или методика их установки, а то похоже что у мня присутствует взаимное влияние X на Y…

SergDoc

вообще-то без разницы, потом просто оси переназначить программно и всё
типа:

static void mpu6050AccAlign(int16_t *accData)
{
    int16_t temp[2];
    temp[0] = accData[0];
    temp[1] = accData[1];


    // official direction is RPY
    accData[0] = temp[1];
    accData[1] = -temp[0];
    accData[2] = accData[2];
}
oleg70
SergDoc:

просто оси переназначить

Так вот и вопрос, то КАК,… по идее ось “X” гиро. и ось “Х” акселя должны быть в одном направлении, а с другой стороны вращение (и угловая скорость) у гиры не вдоль оси “Х” а перпедикулярно… что то я совсем запутался.

SergDoc

ну да, всё правильно показания по оси x гироскопа показывают скорость угловую - убегания оси y от чего-то там что мы считаем горизонтом, у меня аксель программно развёрнут на 90градусов относительно гиры…