Одним из приборов, необходимых на различных судах, является кренометр-дифферентометр. Нужен он для того, чтобы знать, как именно качается судно, и не пора ли что-то предпринять для уменьшения этой качки (ну или сделать вовремя ноги с корабля, уподобившись корабельной крысе). Разработка таких устройств довольно редкая задача, но я с ней всё-таки столкнулся, и решил попробовать сделать свою реализацию прототипа такого кренодифферентометра. Под катом я предложу вам вариант изготовления такого электронного кренометра-дифферентометра, как я сейчас вижу его возможную реализацию.

Как я указал выше, полезность кренодифферентометра для корабля очевидна. А это значит, что крендодифферентометры (ну или только кренометры) давным-давно выпускаются. Причём, как механические, так и электронные.


Механический кренометр.


Электронный кренодифферентометр.

Я, по понятным причинам, буду делать прототип электронного кренодифферентометра.

Для построения электронного кренодифферентометра нам в общем случае нужно знать крен и дифферент корабля в текущий момент времени. Хотелось бы, конечно, использовать для этого обычные механические гироскопы с электронным устройством списывания угла, но стоимость такого устройства окажется весьма и весьма большой. Между тем, стоимость электронного кренометра Delta 401 (на картинке выше его блок индикации) со всей необходимой сертификацией составляла (сколько сейчас составляет, я не знаю) около 350 тыс. рублей. Это слишком мало для кренометра с механическими гироскопами. Да и габариты датчика у этого кренометра очень небольшие. Так что же там внутри могло бы быть? Вариант купить это устройство и посмотреть, увы, отпадает – мне будет сильно жалко 350 тыс. рублей. Тем не менее, мы можем предположить, что внутри датчика как минимум установлены микромеханические акселерометры и гироскопы. Так это или нет, я сказать не берусь, но свой вариант кренометра я решил попробовать построить именно на таких штуках.

Из широкодоступных (и по цене и по наличию) любителю на алиэкспресс присутствует модуль GY-521 на известной микросхеме MPU6050. Микросхема эта представляет собой сборку трёх микромеханических гироскопов и акселерометров с дополнительным термодатчиком.

Параметры микросхемы MPU6050 следующие:

  • Диапазоны работы акселерометра: ±2g, ±4g, ±6g, ±8g, ±16g;
  • Диапазоны работы для гироскопа: ±250°/с, ±500°/с, ±1000°/с, ±2000°/с.

Подключается эта микросхема по шине I2C.


Модуль GY-521 с MPU6050.

Для кренодифферентометра я выбрал диапазон работы акселерометра как ±2g, а гироскопа ±250°/с. Думаю, этого вполне будет достаточно для относительно медленно качающегося корабля.

Микромеханический гироскоп имеет заметный дрейф и без акселерометра не позволит точно измерять угол, поэтому чтобы на основании трёх акселерометров и гироскопов получить углы крена и дифферента, потребуется каким-то образом выполнять совмещение показаний акселерометров и гироскопов. Иными словами, нам нужен какой-то алгоритм выработки угловой информации. Такие алгоритмы, естественно, существуют. Например, AB-фильтр, фильтры Махони, Маджвика или Калмана. Для своего устройства я взял фильтр Маджвика, благо существует готовый пример простой программы тут. Я не скажу, что понимаю, как именно работает этот фильтр, но, к счастью, приведённая по ссылке программа фильтра этого и не требует. Перед подачей показаний акселерометров на фильтр их стоит откалибровать (узнать смещение ноля и масштабные коэффициенты), например, по данной методике. Испытания на качающемся стенде показали, что после калибровки акселерометров фильтр даёт корректные углы крена и дифферента.

Результатом работы фильтра будут два необходимых нам угла. Почему два, а не три? А всё дело в том, что третий угол (рысканье) нельзя получить только по акселерометрам и гироскопам – у фильтра нет вектора, по которому он мог бы корректировать курс. Для крена и дифферента такой вектор даётся акселерометром, показывающим направление действия силы тяжести в моменты, когда движения с ускорением не происходит. А вот для рысканья акселерометры никакой информации не дают, поэтому без датчика курса фильтр рысканье выдать не может. Таким датчиком можно взять магнитный компас, но в MPU6050 его нет (но он есть в других моделях серии MPU). Так как рысканье мне не требуется, то я с магнитным компасом не заморачивался.


Углы сразу после фильтра Маджвика.

Так как корабль не должен качаться чаще, чем с частотой 1 Гц, полученные углы отправляются на цифровой ФНЧ с частотой среза 1 Гц. И вот уже углы после ФНЧ используются в определении параметров колебаний по следующему алгоритму.

Имея два угла, просто ищем для каждого верхние максимумы и нижние минимумы и время их нахождения. При этом я считаю, что корабль будет при качке переходить через ноль по углам (но я могу и ошибаться — для этого случая я делал и вариант с учётом колебаний относительно вычисленного текущего статического значения угла), что позволяет мне, находясь в нижней половине по углу (угол отрицательный), обновлять текущий минимум, сбросив текущий максимум (он в другой половине по углу) в ноль (как минимальное значение максимума), а, находясь в верхней половине (угол положительный), обновлять максимум, сбросив текущий минимум в ноль. Возможно, звучит путано, но, на самом деле, всё очень просто. Таким образом, половины чередуются, и в момент перехода через ноль (с некоторым гистерезисом в 0.5 градуса) достигнутые максимум/минимум обновляют запомненные значения максимумов и минимумов и время, когда они были найдены. Полусумма этих запомненных значений даёт статический угол, полуразность даёт амплитудное значение, а интервалы времени (для максимумов свой, для минимумов, соответственно, свой) период колебаний. Может случиться ситуация, когда корабль вдруг перестал колебаться через ноль. В этом случае спустя 50 секунд показания периода, амплитуды и статического угла обнуляются.


Определение параметров углов.

Для построения прототипа кренодифферентометра я взял палату STM32F407 Discovery, подключил к ней по I2C модуль GY-521 и дисплей с разрешением 320x240.

Выглядит дисплей вот так:


А работает всё это вот так:

Видео работы прототипа кренодифферентометра.

Исходный код программы прототипа кренодифферентометра.

В целом, мой прототип оказался вполне работоспособным, хотя реальные испытания на корабле я не проводил за отсутствием у меня в наличии корабля. Также непонятно, сможет ли фильтр Маджвика правильно выдавать углы при реальном движении судна (ведь акселерометры могут всё время вносить постоянное смещение).

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

Комментарии (23)


  1. Jury_78
    15.03.2022 18:25

    На корабле и так должен быть гирокомпас. Казалось бы до измерителя крена и дифферента один шаг и совместить в одном?

    p.s. не понял зачем для измерения угла акселерометр?


    1. da-nie Автор
      15.03.2022 18:32

      Насколько мне известно, «ПРАВИЛА ПО ОБОРУДОВАНИЮ МОРСКИХ СУДОВ» требуют отдельных устройств.

      p.s. не понял зачем для измерения угла акселерометр?


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


  1. vadimr
    15.03.2022 18:40

    Корабль совершенно не обязательно дифферентуется в ноль (да и с креном в некоторых ситуациях может получиться по-разному).


    1. da-nie Автор
      15.03.2022 18:43
      +1

      А вот для этого я и сделал отдельный вариант с колебаниями относительно текущих значений статического крена и дифферента.


  1. throwaway_crt
    15.03.2022 19:16

    По идее можно запилить приложение для смартфона и положить его на стол.


    1. da-nie Автор
      15.03.2022 19:18

      Тут вся штука в том, что должно быть отдельное устройство. Причём, сертифицированное. А эта статья — намётки возможности такое устройство сделать. Тут больше вопросов, чем ответов (при приведённой рабочей реализации).


  1. Jury_78
    15.03.2022 19:34
    +1

    Из любопытства поискал еще по теме, может вы уже видели тут есть статья. Там еще один датчик указан ADIS16488A, но похоже он попал под санкции.


    1. da-nie Автор
      15.03.2022 20:00
      +1

      Да, их теперь не купишь. Увы.


      1. Jury_78
        16.03.2022 09:00

        Раз вы уже погрузились в это дело, может подумаете об изготовлении датчика?


        1. ILYA_Dm
          16.03.2022 13:34
          +1

          Миландр уже делали ради эксперимента аналог датчика от аналога
          habr.com/ru/company/milandr/blog/542336


          1. da-nie Автор
            16.03.2022 17:53

            Спасибо! Очень интересная статья.


        1. da-nie Автор
          16.03.2022 17:53

          Дома? :-D


          1. Jury_78
            16.03.2022 19:54

            Не боги горшки обжигают :)


            1. da-nie Автор
              16.03.2022 20:46

              К сожалению, уровень капиталовложений для входа в клуб производителей MEMS сильно превышает мой бюджет. :)


              1. Jury_78
                16.03.2022 21:19

                Так то для производства, зато без капиталовложений есть возможность придумать прорывную идею, а это половина дела.


                1. da-nie Автор
                  16.03.2022 21:21

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


  1. Sensimilla
    15.03.2022 20:30

    Существуют MEMS-инклинометры, с ними не было бы проще?


    1. da-nie Автор
      15.03.2022 20:34

      А как он себя ведёт в движении корабля с ускорением? Там, наверное, просто акселерометр внутри?


      1. dimas_sar
        16.03.2022 14:14

        Mems-инклинометры обычно имеют весьма небольшую частоту выборки, зато на порядки лучшую точность и меньший дрейф. Но, как я понял из статьи, частота выборки здесь требуется очень низкая - так что, видимо, вам лучше присмотреться к инклинометрам, например: https://www.te.com/usa-en/products/sensors/position-sensors/tilt-sensors-inclinometers.html?tab=pgp-story


        1. ProLimit
          16.03.2022 16:16
          +1

          Инклинометры все же расчитаны на статику, а тут колебательный процесс. Нет, MEMS акселерометры по точности и отклику отлично подходят. За счет ФНЧ на такой низкой частоте шумов практически не будет, а точность выше десятых долей градуса вряд ли нужна. Скорее, основные претензии к MPU6050 это плохие заводские калибровки, датчик обязательно надо калибровать после установки в устройство. И еще, сейчас есть следующее поколение от того же производителя: ICM-20608G, а ICM-42688-P вообще один из самых лучших MEMS на рынке, у него заводские калибровки очень приличные.


        1. da-nie Автор
          16.03.2022 17:44

          У меня тут 125 Гц частота опроса. Внутри MPU6050 на 1000 Гц вроде как работает.


  1. p07a1330
    17.03.2022 11:05

    А гайка на веревочке с поставленной задачей не справляется?
    Автору за исполнение респект, но на лицо явный оверинженеринг
    И для опеределения крена в пределах условно 20 градусов (Если больше, то полгаю - кренится уже нечему) с шагом в 1 градус хватило бы пары десятов SW200D, по 11 рублей за штуку.


    1. da-nie Автор
      17.03.2022 15:33

      Нет, не справляется. При движении судна возникают дополнительные ускорения.

      Если больше, то полгаю — кренится уже нечему


      Требования к кренометрам указывают угол в 90 градусов.

      но на лицо явный оверинженеринг


      Да вот нет. В том-то и дело, что механические кренометры имеют большую погрешность при движении судна.