dragon osd gps navigation system

Zont

Виргис, а АрдуИМУ в3 еще не успели попробовать?

Virgis21
Zont:

Виргис, а АрдуИМУ в3 еще не успели попробовать?

Nope. That one is on the way to me. Should arrive anytime. Then I’ll try to adopt the firmware to work with DOSD+
Just wait few days for this.

Virgis

Zont

окей, спасибо! Очень ждем результатов 😃

freefly

Смаллтим вот вот выпустит свою ИМУ с I2C extension bus rcopen.com/forum/f90/topic205896/4008

Помню как он говорил что написание прошивки для связки с dragon osd это вопрос времени)
Так что нафиг arduIMY v3 😁

Zont

Да, тоже очень ждем, но, как я понял, никто не будет заморачиваться с прошивкой под ДОСД 😦 я поднимал этот вопрос (пост 191 на предыдущей странице), но Виргис сказал, что сейчас надо адаптировать прошивку АрдуИМУ 3 под Драгон, т.к. это должно дать хороший результат.

Если у кого-то есть время и достаточные знания, что бы сделать прошивку для ИМУ Тимофея - это было бы, конечно же, намного круче.

smalltim
Zont:

Если у кого-то есть время и достаточные знания, что бы сделать прошивку для ИМУ Тимофея - это было бы, конечно же, намного круче.

IMU умеет имитировать пирометры, у нее есть 4 аналоговых выхода для этого. Но с обменом данными туда-сюда, конечно, веселее - можно управлять параметрами работы ИМУшки и брать более полные данные от ИМУ. Когда устаканится прошивка ИМУшки, я выложу протокол обмена данными с АП по I2C, там ничего заумного нет. Прятать его смысла нет, всё равно любой желающий с головой и с нормальным железом расковыряет этот протокол за час.
Так зачем усложнять всем жизнь? Будет готово - выложу, используйте на здоровье 😃

jaan
=V=simon:

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

www.youtube.com/watch?v=TIjUNDEAXC8

Как Вы с ней справились?У меня тоже самое,и как совместить микрофон с аудио вариометром,ведь там нет (аудио ин).:unsure:

=V=simon
jaan:

Как Вы с ней справились?У меня тоже самое,и как совместить микрофон с аудио вариометром,ведь там нет (аудио ин).

я с этим не боролся пока. Заказал с беверца фильтр. Говорят нуна видео от лавмета, там уже все фильтры встроены. Микрофон в параллель и усё.

jaan
=V=simon:

я с этим не боролся пока. Заказал с беверца фильтр. Говорят нуна видео от лавмета, там уже все фильтры встроены. Микрофон в параллель и усё.

Там вариометр и так еле слышно,а если ещо и микрофон к нему.А может на аудио выход ОСД динамик повесить,а микрофон будет его принимать?

jaan
=V=simon:

я с этим не боролся пока. Заказал с беверца фильтр. Говорят нуна видео от лавмета, там уже все фильтры встроены. Микрофон в параллель и усё.

Все, справился.Только на прямую в паралель не стоит,на рц групс советовали с микрофона через резистор10к,поставил 30к и слышно оба звука,но фон всетаки остался,завтра попробую в поле,мож 4 стенки фонят.

=V=simon
jaan:

Все, справился.Только на прямую в паралель не стоит,на рц групс советовали с микрофона через резистор10к,поставил 30к и слышно оба звука,но фон всетаки остался,завтра попробую в поле,мож 4 стенки фонят.

Будем ждать
А идея с динамиком интересная

jaan
jaan:

Все, справился.Только на прямую в паралель не стоит,на рц групс советовали с микрофона через резистор10к,поставил 30к и слышно оба звука,но фон всетаки остался,завтра попробую в поле,мож 4 стенки фонят.

Полетал,но звука вариометра так и не услышал.Фон все равно есть,но шум мотора и ветра сильне,а вариометр в полной Ж…Кто знает как увеличить выходной сигнал вариометра?Ведь купил ее только ради этого,а тут такой облом.Попробую увеличить сопротивление микрофона,мож поможет.

10 days later
Moidodyr

Подскажите, пожалуйста, размер платки автопилота и, по возможности, вес.

kenig
Moidodyr:

Подскажите, пожалуйста, размер платки автопилота и, по возможности, вес.

Привет земеля … и рпавда ни где не нашел его размеров … может искал плохо … но судя по картинке см 2.5 на 5 см где то

вот тут картинки есть www.rcgroups.com/forums/showthread.php?t=1211816&h…

smalltim

ИМУ готова. Вы сможете общаться с ней по И2Ц, 3.3В, 100 кГц?

Протокол примитивный, самое сложное - посчитать CRC16, сeгодня постараюсь описать и выложить на сайт.

Moidodyr
kenig:

но судя по картинке см 2.5 на 5 см где то

Вот и я не нашел. Может кто из обладателей линейку возьмет и померит? Нужно для изготовления контейнера под фпв оборудование.

11 days later
smalltim
smalltim:

Так зачем усложнять всем жизнь? Будет готово - выложу, используйте на здоровье

IMU smalltim/SwiftAI.
Информация для разработчиков.

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
      . . .
      . . .
      . . .
      . . .
   }
}