Smalltim OSD and autopilot (часть 2)
А как бы поточнее найти, хочется уж чтобы все в ажуре было?
В Яндексе набираем “точка магнитного склонения Елабуга”.
Вот только там может оказаться несколько вариантов…
из Википедии брал “Магнитное склонение”, там снизу ссылка на калькулятор.
у меня 8,5 градусов, в Мск грит почти 10, в Елабуге - 12-13
калькулятор для вычисления магнитного склонения
Можно вставлять значения в виде “градусы.тысячные”
из Википедии брал “Магнитное склонение”, там снизу ссылка на калькулятор.
у меня 8,5 градусов, в Мск грит почти 10, в Елабуге - 12-13
Спасибо, поставлю 12.
Тольятти 11
Кстати заметил, что в контрольной панели магнитное склонение можно ставить только целым числом градусов, а во вкладке “калибровка компаса” оно показывается с десятыми.
Ничего
Обязательно поставьте коррекцию по данным GPS.
стоит на дне по ЦТ ская, вибрации не воздействуют, горизонт стоит четко
Должна стоять наклеечкой с рисунком к небу, горизонтально в плоскости самика, стрелкой front в направлении полета самика. Желательно где-нибудь на/в фюзеляже, ближе к центру тяжести, но если будет в стороне - ничего страшного. Главное, не на самом хвосте и не на кончике крыла 😃
Меня напрягает, что горизонт у Вас как-то с непонятно с инверсией показывает.
я вообще не планирую резать штатный кабель, но вот заменить на экранированный, подлиннее и без лишних разъёмов хочу. Надо только выяснить марку разъёма на ИМУ и купить такой же.
А смысл? Там 100кГц тактовая частота I2C, ни на что не наведет помех, а если поймает помех, то встроенная проверка CRC16 в обе стороны отсечет помехи.
Но, на всякий случай, вот марка разъема: CI1110S00 10-контактный. www.smd.ru/katalog/pravyj/raz/raz/emy/
То есть, если к этим разъемам подключить напрямую серву - они будут отрабатывать горизонт?
Нет, это именно аналоговые выходы (PWM с активными фильтрами Саллена-Ки 2го порядка). Но подключать к ним нечего, они отключены. Я решил не имитировать пирометры. Без коррекции центробежных ускорений нет никакого смысла в IMU, а коррекции центробежных ускорений не сделаешь без цифрового обмена данными с АП, с одним лишь аналогом.
Должна стоять наклеечкой с рисунком к небу, горизонтально в плоскости самика, стрелкой front в направлении полета самика.
так и стоит! когда проверял дома, при подключенной КП, при крене вправо в КП иконка самолетика крениться вправо и соответственно влево также
так и стоит!
Прекрасно. Значит, выставляйте настройки по умолчанию, такие как на картинке, и в бой 😃
А смысл? Там 100кГц тактовая частота I2C, ни на что не наведет помех, а если поймает помех, то встроенная проверка CRC16 в обе стороны отсечет помехи.
Дык, главное, я хочу убрать лишние хвосты, не портя родной кабель.
А уж если пошла такая пьянка, то и экранированный провод можно засунуть, при моей компоновке как ни крути, получается заметный кусок провода параллельно антенне 1000мВт видео передатчика, хоть и не впритык, но на самолётике всё близко.
Тим, спасибо большое, сегодня облетали и настроили IMU с АП , всё как часики аж не вериться, что оно так может летать , я даволен.
Нет, это именно аналоговые выходы (PWM с активными фильтрами Саллена-Ки 2го порядка). Но подключать к ним нечего, они отключены. Я решил не имитировать пирометры. Без коррекции центробежных ускорений нет никакого смысла в IMU, а коррекции центробежных ускорений не сделаешь без цифрового обмена данными с АП, с одним лишь аналогом.
Может их тогда вообще срезать? Или же когда-нибудь пригодятся?
Тим, спасибо большое, сегодня облетали и настроили IMU с АП , всё как часики аж не вериться, что оно так может летать , я даволен.
Вам спасибо. За то, что не поставили на мне крест после пирометров 😃
Ну а я уж постараюсь и дальше оправдать доверие.
Теперь попробуйте чуть-чуть полихачить, резкие маневры, плотные круги (с запасом высоты) чтобы убедиться, что динамики IMU с запасом хватит и не нужно переходить на 2000 град/сек.
А нет в планах сделать универсальную ИМУ?
А нет в планах сделать универсальную ИМУ?
В каком смысле универсальную?
Может их тогда вообще срезать? Или же когда-нибудь пригодятся?
Если не очень сильно напрягает, то пусть болтаются. Какие-нибудь функции впоследствии можно таки прикрутить на эти выходы.
В каком смысле универсальную?
Которая бы работала независимо от автопилота смоллтим.
Если не очень сильно напрягает, то пусть болтаются. Какие-нибудь функции впоследствии можно таки прикрутить на эти выходы.
Очень бы хотелось иметь возможность что-нибудь еще от ИМУ приводить в движение, например стабилизацию подвеса камеры, чтобы ее на маневрах не колбасило. Тут и разъем для имитации пирометров очень кстати будет 😃
Андрей, для Вашего Ская настройки пирометров по стабилизации оказались сильно высокими при переходе на ИМУшку. Она быстрее и резче отрабатывает изменения в ориентации. Поставьте раза в 2 ниже чувствительность и демпфирование по крену и тангажу.
Если не секрет - какие настройки были? И какие рекомендуете?
Сегодня тоже полетал с ИМУ (настройками от пиро) на скае. На земле все было хорошо, горизонт работал отлично. В полете при работающем движке включил стабилизацию, в результате - резкий крен вправо. Успел перейти в ручной режим. (После полета посмотрел видеозапись - горизонт при работающем движке “живет сам по-себе”, хотя есть моменты, когда он отображается адекватно). При выключенном двигателе стабилизация работает отлично, хотя иногда скай “впадает” в резонанс и его начинает колбасить по горизонту - что и где убавлять?
Предполагаю, что причиной ухода горизонта в полете является работа движка (вибрация), хотя плата ИМУ расположена на днище ская под передней кромкой крыла (дальше не позволяет штатный шлеф). Как решить возникшую проблему? Может кто справился с ней?
Если не секрет - какие настройки были? И какие рекомендуете?
Обычно для Ская можно начинать с чувствительности/демпфирования в 25/25 по крену и тангажу. Дальше, если в стабилизации отрабатывает команды стика лениво, то потихоньку увеличивать.
При выключенном двигателе стабилизация работает отлично, хотя иногда скай “впадает” в резонанс и его начинает колбасить по горизонту - что и где убавлять?
Как раз убавить до 25/25.
Предполагаю, что причиной ухода горизонта в полете является работа движка (вибрация), хотя плата ИМУ расположена на днище ская под передней кромкой крыла (дальше не позволяет штатный шлеф). Как решить возникшую проблему? Может кто справился с ней?
Место хорошее. Но, таки да, это как раз вибрация, видимо винт у Вас несбалансирован совсем. IMUшка легкая, поэтому ставить ее на вибропрокладку - не сильно поможет, всё равно будет култыхаться. Хороший вариант - примерно так, как делают вертолетчики: сначала толстый скотч на корпус Ская, потом на него что-нибудь тяжелое, типа свинцовой/алюминиевой/медной(короче, немагнитной) пластинки, а потом на нее сверху уже ИМУшку.
Еще вариант - поставить ИМУшку поближе к батарее, ее масса хорошо давит вибрации.
Спасибо, Тим, за быстрый ответ. Буду задавливать чувствительность/демпфирование до рекомендуемых, а дальше - опытным путем. На счет винта: винт отбалансирован очень точно. ИМУ находится близко к аккам (3 см от торца 5000-ка). Попробую поставить ИМУ на свинцовую пластину как советуете. Вот думаю, а не влияет ли на ИМУ видеопередатчик (ИМУ как раз под ним находится?).
Сюды прикрутил, правда пришлось провод удлиннить. На крыле вибраций от двига поменьше.
Вот думаю, а не влияет ли на ИМУ видеопередатчик (ИМУ как раз под ним находится?).
Не. Вы же сами пишете, что при выключенном моторе горизонт работает отлично.
Андрей, я, скорее всего, не смогу сделать на IMU интерфейсы, совместимые со всеми подряд.
Но полностью открываю протокол общения с IMU, и готов в меру сил помочь разработчикам сторонних железок во введении поддержки IMU.
IMU smalltim/SwiftAI.
Информация для разработчиков.
- Электрические характеристики платы IMU:
- Напряжение питания: от 4 до 6В.
- Максимальный потребляемый ток: 60мА.
- Электрические характеристики интерфейса I2C IMU:
- Номинальная тактовая частота I2C: 100 кГц, допускается работа на произвольной частоте от 0 до 400 кГц.
- Подтяжка 4.7кОм к +3.3В (питание на линиях SCL и SDA на плате IMU.
- Резисторы 1кОм последовательно в линиях SCL и SDA для защиты от КЗ.
- Совместимость с 3.3 В и 5В уровнями сигнала.
- Характеристики программного обеспечения IMU:
- Частота опроса датчиков магнитного поля: 75 Гц.
- Частота опроса датчиков угловых скоростей: 400 Гц.
- Частота опроса датчиков ускорения: 400 Гц.
- Диапазон измерения величины магнитного поля: 1.9 Гс
- Диапазон измерения угловых скоростей: 500/2000 град/c
- Диапазон измерения угловых скоростей: 8 G
- Номинальный шаг интегрирования: 0.004 сек (250Гц)
- Номинальная скорость обновления данных (углы, угловые скорости, и т.д.) на интерфейсе I2C: 250 Гц.
- I2C тип и адрес устройства IMU: Slave, 0x15 (HEX).
- Проверка корректности данных на интерфейсе I2C: CRC16-CCITT
- Система координат IMU:
- Ось X соответствует продольной оси самолета, положительное направление – вперед
- Ось Y соответствует поперечной оси самолета, положительное направление – от левого крыла к правому крылу
- Ось Z соответствует вертикальной оси самолета, положительное направление – вниз
- Нулевое значение крена соответствует горизонтальной ориентации по крену, положительное значение крена соответствует левому крену
- Нулевое значение тангажа соответствует горизонтальной ориентации по тангажу, положительное значение тангажа соответствует подъему носа модели вверх
- Нулевое значение рыскания соответствует повороту модели на восток, положительное значение соответствует повороту в сторону севера.
- Положительное значение угловой скорости по крену соответствует вращению против часовой стрелки вокруг продольной оси модели при взгляде сзади
- Положительное значение угловой скорости по тангажу соответствует вращению против часовой стрелки вокруг поперечной оси модели при взгляде справа
- Положительное значение угловой скорости по рысканию соответствует вращению против часовой стрелки вокруг вертикальной оси модели при взгляде сверху
- Протокол обмена данными с IMU по I2C, общий принцип:
- Чтение данных из IMU:
- Master посылает START
- Master посылает адрес устройства Slave c командой записи в Slave: 0x15
- Master посылает байт-идентификатор типа требуемых данных: 0x01, 0x02, 0x03, 0x04 или 0x05
- Master посылает STOP
- Master посылает START
- Master посылает адрес устройства Slave c командой чтения из Slave: (0x15<<1) + 1
- Master читает из Slave некоторое число байт, определяемое типом данных
- Master посылает NACK
- Master посылает STOP
- Запись данных в IMU:
- Master посылает START
- Master посылает адрес устройства Slave c командой записи в Slave: 0x15
- Master посылает байт-идентификатор типа записываемых данных: 0xAA, 0xAB или 0xAC
- Master посылает STOP.
- Типы данных, читаемых из IMU:
- Углы ориентации и угловые скорости:
- Идентификатор типа данных: 0x01
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0x01
- Master: STOP
- Master: START
- Master: (0x15<<1) + 1
- Slave: 0x01
- Slave: Roll_low_byte
- Slave: Roll_high_byte
- Slave: Pitch_low_byte
- Slave: Pitch_high_byte
- Slave: Yaw_low_byte
- Slave: Yaw_high_byte
- Slave: Roll_Rate_low_byte
- Slave: Roll_Rate_high_byte
- Slave: Pitch_Rate_low_byte
- Slave: Pitch_Rate_high_byte
- Slave: Yaw_Rate_low_byte
- Slave: Yaw_Rate_high_byte
- Slave: CRC16_low_byte
- Slave: CRC16_high_byte
- Master: NACK
- Master: STOP
- Примечания:
- Крен (Roll) передается в радианах как 2-байтовое целое знаковое число, младший бит = 0.001 радиан
- Roll (radians) = (float)((Int16)(Roll_low_byte + Roll_high_byte*256))/1000.0f
- Нулевое значение Roll соответствует горизонтальной ориентации по крену, положительное значение Roll соответствует левому крену
- Тангаж (Pitch) передается в радианах как 2-байтовое целое знаковое число, младший бит = 0.001 радиан
- Pitch (radians) = (float)((Int16)(Pitch_low_byte + Pitch_high_byte*256))/1000.0f
- Нулевое значение Pitch соответствует горизонтальной ориентации по тангажу, положительное значение Pitch соответствует подъему носа модели вверх
- Рыскание (Yaw) передается в радианах как 2-байтовое целое знаковое число, младший бит = 0.001 радиан
- Yaw (radians) = (float)((Int16)(Yaw_low_byte + Yaw_high_byte*256))/1000.0f
- Нулевое значение Yaw соответствует повороту модели на восток, положительное значение соответствует повороту в сторону севера.
- Угловая скорость по крену (Roll Rate) передается в радианах в секунду как 2-байтовое целое знаковое число, младший бит = 0.001 радиан в секунду
- Roll Rate (radians/sec) = (float)((Int16)(Roll_Rate_low_byte + Roll_Rate_high_byte*256))/1000.0f
- Положительное значение Roll Rate соответствует вращению против часовой стрелки вокруг продольной оси модели при взгляде сзади
- Угловая скорость по тангажу (Pitch Rate) передается в радианах как 2-байтовое целое знаковое число, младший бит = 0.001 радиан
- Pitch Rate (radians/sec) = (float)((Int16)(Pitch_Rate_low_byte + Pitch_Rate_high_byte*256))/1000.0f
- Положительное значение Pitch Rate соответствует вращению против часовой стрелки вокруг поперечной оси модели при взгляде справа
- Угловая скрость по рысканию (Yaw Rate) передается в радианах в секунду как 2-байтовое целое знаковое число, младший бит = 0.001 радиан в секунду
- Yaw Rate (radians/sec) = (float)((Int16)(Yaw_Rate_low_byte + Yaw_Rate_high_byte*256))/1000.0f
- Положительное значение Yaw Rate соответствует вращению против часовой стрелки вокруг вертикальной оси модели при взгляде сверху
- CRC16 считается для всего набора данных из 13 байт (байт 0x01, являющийся идентификатором типа данных, и 12 байт данных)
- Позиция в пространстве, линейные скорости и ускорения:
- Идентификатор типа данных: 0x02
- Не реализовано в самолетном варианте
- Небработанные данные с датчиков:
- Идентификатор типа данных: 0x03
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0x03
- Master: STOP
- Master: START
- Master: (0x15<<1) + 1
- Slave: 0x03
- Slave: Acceleration_X_low_byte
- Slave: Acceleration_X_high_byte
- Slave: Acceleration_Y_low_byte
- Slave: Acceleration_Y_high_byte
- Slave: Acceleration_Z_low_byte
- Slave: Acceleration_Z_high_byte
- Slave: AngularRate_X_low_byte
- Slave: AngularRate_X_high_byte
- Slave: AngularRate_Y_low_byte
- Slave: AngularRate_Y_high_byte
- Slave: AngularRate_Z_low_byte
- Slave: AngularRate_Z_high_byte
- Slave: MagneticField_X_low_byte
- Slave: MagneticField_X_high_byte
- Slave: MagneticField_Y_low_byte
- Slave: MagneticField_Y_high_byte
- Slave: MagneticField_Z_low_byte
- Slave: MagneticField_Z_high_byte
- Slave: MagneticField_X_CALIBRATED_MIN_low_byte
- Slave: MagneticField_X_CALIBRATED_MIN_high_byte
- Slave: MagneticField_X_CALIBRATED_MAX_low_byte
- Slave: MagneticField_X_CALIBRATED_MAX_high_byte
- Slave: MagneticField_Y_CALIBRATED_MIN_low_byte
- Slave: MagneticField_Y_CALIBRATED_MIN_high_byte
- Slave: MagneticField_Y_CALIBRATED_MAX_low_byte
- Slave: MagneticField_Y_CALIBRATED_MAX_high_byte
- Slave: MagneticField_Z_CALIBRATED_MIN_low_byte
- Slave: MagneticField_Z_CALIBRATED_MIN_high_byte
- Slave: MagneticField_Z_CALIBRATED_MAX_low_byte
- Slave: MagneticField_Z_CALIBRATED_MAX_high_byte
- Slave: CRC16_low_byte
- Slave: CRC16_high_byte
- Master: NACK
- Master: STOP
- Примечания:
- Данные датчиков передаются в том виде, в каком они читаются с датчиков: 2-байтовое целое знаковое число
- Ось X соответствует продольной оси самолета, положительное направление – вперед
- Ось Y соответствует поперечной оси самолета, положительное направление – от левого крыла к правому крылу
- Ось Z соответствует вертикальной оси самолета, положительное направление – вниз
- CRC16 считается для всего набора данных из 31 байт (байт 0x03, являющийся идентификатором типа данных, и 30 байт данных)
- Шум/вибрации с датчиков:
- Идентификатор типа данных: 0x04
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0x04
- Master: STOP
- Master: START
- Master: (0x15<<1) + 1
- Slave: 0x04
- Slave: Acceleration_Noise_X_low_byte
- Slave: Acceleration_Noise_X_high_byte
- Slave: Acceleration_Noise_Y_low_byte
- Slave: Acceleration_Noise_Y_high_byte
- Slave: Acceleration_Noise_Z_low_byte
- Slave: Acceleration_Noise_Z_high_byte
- Slave: AngularRate_Noise_X_low_byte
- Slave: AngularRate_Noise_X_high_byte
- Slave: AngularRate_Noise_Y_low_byte
- Slave: AngularRate_Noise_Y_high_byte
- Slave: AngularRate_Noise_Z_low_byte
- Slave: AngularRate_Noise_Z_high_byte
- Slave: CRC16_low_byte
- Slave: CRC16_high_byte
- Master: NACK
- Master: STOP
- Примечания:
- Данные представляют собой 1/64 от суммы абсолютных значений разницы между текущим значением данных с датчика и средним значением, подсчитанным в окне шириной 64 сэмпла,
и передаются как 2-байтовое целое число без знака
- CRC16 считается для всего набора данных из 13 байт (байт 0x04, являющийся идентификатором типа данных, и 12 байт данных)
- Внутренние счетчики IMU:
- Идентификатор типа данных: 0x05
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0x05
- Master: STOP
- Master: START
- Master: (0x15<<1) + 1
- Slave: 0x05
- Slave: MainCyclesPerSecond_low_byte
- Slave: MainCyclesPerSecond_high_byte
- Slave: SensorPollingTicks_low_byte
- Slave: SensorPollingTicks_high_byte
- Slave: MathTicks_low_byte
- Slave: MathTicks_high_byte
- Slave: FusionTicks_low_byte
- Slave: FusionTicks_high_byte
- Slave: FullCycleTicks_low_byte
- Slave: FullCycleTicks_high_byte
- Slave: Second_low_byte
- Slave: Second_high_byte
- Slave: 0x00
- Slave: 0x00
- Slave: CRC16_low_byte
- Slave: CRC16_high_byte
- Master: NACK
- Master: STOP
- Примечания:
- Данные представляют собой 2-байтовое целое число без знака
- MainCyclesPerSecond – текущее число циклов интегрирования в секунду
- SensorPollingTicks – время, затраченное на опрос датчиков, младший бит = 0.00001 сек (10 мксек)
- MathTicks – время, затраченное на обработку данных от датчиков, младший бит = 0.00001 сек (10 мксек)
- FusionTicks – время, затраченное непосредственно на алгоритм интегрирования/слияния данных датчиков, младший бит = 0.00001 сек (10 мксек)
- FullCycleTicks – время главного цикла программы, , младший бит = 0.00001 сек (10 мксек)
- Second – время с помента подачи питания и включения IMU, в секундах, по внутреннему таймеру IMU
- CRC16 считается для всего набора данных из 13 байт (байт 0x05, являющийся идентификатором типа данных, и 12 байт данных)
- Типы данных, записываемых в IMU:
- Результаты калибровки компаса:
- Идентификатор типа данных: 0xAA
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0xAA
- Master: MagneticField_X_CALIBRATED_MIN_low_byte
- Master: MagneticField_X_CALIBRATED_MIN_high_byte
- Master: MagneticField_X_CALIBRATED_MAX_low_byte
- Master: MagneticField_X_CALIBRATED_MAX_high_byte
- Master: MagneticField_Y_CALIBRATED_MIN_low_byte
- Master: MagneticField_Y_CALIBRATED_MIN_high_byte
- Master: MagneticField_Y_CALIBRATED_MAX_low_byte
- Master: MagneticField_Y_CALIBRATED_MAX_high_byte
- Master: MagneticField_Z_CALIBRATED_MIN_low_byte
- Master: MagneticField_Z_CALIBRATED_MIN_high_byte
- Master: MagneticField_Z_CALIBRATED_MAX_low_byte
- Master: MagneticField_Z_CALIBRATED_MAX_high_byte
- Master: CRC16_low_byte
- Master: CRC16_high_byte
- Master: STOP
- Примечания:
- Данные передаются в том же виде, в каком читаются с датчиков магнитного поля и читаются из IMU в пакете данных с типом 0х03 : 2-байтовое целое знаковое число
- По факту успешного получения этих данных IMU записывает данные калибровки компаса в энергонезависимую память.
- CRC16 считается для всего набора данных из 13 байт (байт 0xAA, являющийся идентификатором типа данных, и 12 байт данных)
- Коррекция центробежных ускорений:
- Идентификатор типа данных: 0xAB
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0xAB
- Master: CentripetalCorrectionMode (0x00,0x01 или 0x02)
- Master: AirSpeed_low_byte
- Master: AirSpeed_high_byte
- Master: GPSCentrifugalAcceleration_low_byte
- Master: GPSCentrifugalAcceleration_high_byte
- Master: CRC16_low_byte
- Master: CRC16_high_byte
- Master: STOP
- Примечания:
- CentripetalCorrectionMode – тип коррекции центробежных ускорений:
- 0x00 – не использовать коррекцию центробежных ускорений.
- 0х01 – использовать коррекцию центробежных ускорений по GPS.
- 0x02 – использовать коррекцию центробежных ускорений по данным о скорости модели в воздухе и угловым скоростям модели.
- Начальное состоание IMU после старта: коррекция центробежных ускорений не используется.
- AirSpeed – скорость модели в воздухе, двухбайтовое целое число без знака, младший бит равен 0.01 м/сек.
- GPSCentrifugalAcceleration – центробежное ускорение, подсчитанное по данным GPS, в системе координат, связанной с моделью, т.е. горизонтальная скорость по GPS * угловая скорость в плоскости Земли по GPS. Положительное значение соответствует центробежному ускорению, направленному в положительном направлении оси Y системы координат IMU, т.е. от левого крыла к правому крылу. Двухбайтовое целое число без знака, младший бит равен 0.01 м/сек^2
- CRC16 считается для всего набора данных из 6 байт (байт 0xAB, являющийся идентификатором типа данных, и 5 байт данных)
- Коррекция параметров IMU:
- Идентификатор типа данных: 0xAС
- Содержание сообщения:
- Master: START
- Master: 0x15
- Master: 0xAС
- Master: Use_2000_DPS (0x00 или 0x01)
- Master: MARG_Beta (от 0x00 до 0xFF)
- Master: CRC16_low_byte
- Master: CRC16_high_byte
- Master: STOP
- Примечания:
- Use_2000_DPS – Выбор диапазона измеряемых угловых скоростей для датчиков угловых скоростей:
- 0x00 – Использовать диапазон 500 град/сек.
- 0х01 – Использовать диапазон 2000 град/сек.
- Начальное состояние IMU после старта: используется диапазон 500 град/сек
- MARG_Beta – параметр Beta алгоритма MARG, используемого в IMU. Беззнаковое число, байт. Младший бит MARG_Beta соответствует значению Beta 0.01, т.е., доступно изменение Beta от 0 до 2.25.
- Начальное состояние IMU после старта и инициализации: используется Beta = 0.15.
- CRC16 считается для всего набора данных из 3 байт (байт 0xAС, являющийся идентификатором типа данных, и 2 байта данных)
Процедура подсчета CRC16:
U16 Crc16_direct(U8 *pcBlock, U16 len)
{
U16 crc = 0xFFFF;
U8 i;
while (len--)
{
crc ^= *pcBlock++ << 8;
for (i = 0; i < 8; i++)
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;
}
Пример записи данных в IMU:
void IMU_send_compass_calibration_data(void)
{
U16 crc;
U8 i2c_imu_tx_data[15];
i2c_imu_tx_data[0]=0xAA;
i2c_imu_tx_data[1]=LSB0(compass_min[0]);
i2c_imu_tx_data[2]=LSB1(compass_min[0]);
i2c_imu_tx_data[3]=LSB0(compass_max[0]);
i2c_imu_tx_data[4]=LSB1(compass_max[0]);
i2c_imu_tx_data[5]=LSB0(compass_min[1]);
i2c_imu_tx_data[6]=LSB1(compass_min[1]);
i2c_imu_tx_data[7]=LSB0(compass_max[1]);
i2c_imu_tx_data[8]=LSB1(compass_max[1]);
i2c_imu_tx_data[9]=LSB0(compass_min[2]);
i2c_imu_tx_data[10]=LSB1(compass_min[2]);
i2c_imu_tx_data[11]=LSB0(compass_max[2]);
i2c_imu_tx_data[12]=LSB1(compass_max[2]);
crc = Crc16_direct((U8 *)&i2c_imu_tx_data[0], 13);
i2c_imu_tx_data[13]=LSB0(crc);
i2c_imu_tx_data[14]=LSB1(crc);
i2c_send(0x15, 15, i2c_imu_tx_data);
}
Пример чтения данных из IMU:
void IMU_get_angles(void)
{
U16 crc;
U8 i2c_imu_tx_data[1];
U8 i2c_imu_rx_data[15];
float imu_roll, imu_pitch,imu_yaw;
float imu_d_roll, imu_d_pitch,imu_d_yaw;
i2c_imu_tx_data[0]=1;
i2c_send(0x15, 1, i2c_imu_tx_data);
i2c_receive(0x15, 15, i2c_imu_rx_data);
crc = Crc16_direct((U8 *)&i2c_imu_rx_data[0], 13);
if((crc == ((U16)i2c_imu_rx_data[13] + (U16) i2c_imu_rx_data[14]*256)) && (i2c_imu_rx_data[0]==0x01))
{
imu_roll = ((float)(S16)(U16)(i2c_imu_rx_data[1] + i2c_imu_rx_data[2]*256))/1000.0f;
imu_pitch = ((float)(S16)(U16)(i2c_imu_rx_data[3] + i2c_imu_rx_data[4]*256))/1000.0f;
imu_yaw = ((float)(S16)(U16)(i2c_imu_rx_data[5] + i2c_imu_rx_data[6]*256))/1000.0f;
imu_d_roll = ((float)(S16)(U16)(i2c_imu_rx_data[7] + i2c_imu_rx_data[8]*256))/1000.0f;
imu_d_pitch = ((float)(S16)(U16)(i2c_imu_rx_data[9] + i2c_imu_rx_data[10]*256))/1000.0f;
imu_d_yaw = ((float)(S16)(U16)(i2c_imu_rx_data[11] + i2c_imu_rx_data[12]*256))/1000.0f;
// using roll, pitch, and yaw angles and rates
. . .
. . .
. . .
. . .
}
}
Должно быть 5В, если сильно в сторону
проверил напряжение на плату ИМУ, ЖПС идет 4,99 В. Настройки в КП все сделал, погода даст и внебо!!!
Тим, УРА, самолетик полетел 😎 И RTH и по точкам. Пока еще не совсем так, как хотелось бы, но я по-ходу понял почему 😃
С утра ветер стих и стало хорошо видно, что с самолетом делает АП, а что ветер. А главное меня стало меньше глючить на холоде на ветру))
В общем причина сложностей с настройкой RTH оказалась в запаздывании реакции авиагоризонта на крен на ~3секунды. АП соответственно считает, что летит в крене и ждет пока самоль повернет на базу. Через некоторое время авиагоризонт выравнивается и о-блин, надо ж поворачивать))
Интересно, что всегда именно 3секунды (специально считал). А почему не 1с или не 10? Есть предположение, что это коррекция ускорений при помощи GPS (с запаздыванием), а коррекция с компаса работает как то не так.
Это возможно? Проверил на земле - все работает отлично и мгновенно, ни видео передатчик, ни двигатель на горизонт не влияют вообще никак.
- ну и до кучи )) Почему-то АП перебирает контрольные точки в произвольном порядке, а не последовательно. В момент переключения он быстро мелькает номерами КТ (на OSD видно как меняются) и останавливается на произвольной.