IMU-сенсор на 10 степеней свободы (Troyka-модуль)

Тема в разделе "Arduino & Shields", создана пользователем RomanMIIT, 24 авг 2015.

  1. RomanMIIT

    RomanMIIT Нуб

    Компас и акселерометр не выдают данные в сериал порт. библиотеку создал, скетч загрузился. провод от пина D подключен к 4 входу уно
     
    Последнее редактирование: 24 авг 2015
  2. Unixon

    Unixon Оракул Модератор

    Модуль работает по I2C, выводы SCL и SDA на Iskra/Leonardo на пинах 3 и 2, а на Uno на пинах A5 и A4.
     
  3. RomanMIIT

    RomanMIIT Нуб

    Подключил верно. Залил скетчи,но в сериал порт ничего не идёт. Может нужно что то дописать в коде?
     
  4. Unixon

    Unixon Оракул Модератор

    С=SCL=A5, D=SDA=A4, V=+5V, G=GND ?
     
  5. Unixon

    Unixon Оракул Модератор

    Инициализация хотя бы проходит?
     
  6. RomanMIIT

    RomanMIIT Нуб

    Один раз выдало что то по инициализации и все. Подключено верно
     
  7. RomanMIIT

    RomanMIIT Нуб

    я не знаю почему, но заработало. спасибо)
     
  8. geher

    geher Гуру

    Там в примере для IMU в setup есть строки:
    Код (Text):

    while (!Serial.available()) {
      // ждём
      }
     
    Оно просто ждет данные с последовательного порта для запуска. Надо в строке ввода что-то ввести и нажать Enter (или просто нажать Enter).
     
  9. geher

    geher Гуру

    С показаниями датчика давления, акселерометра и гироскопа все нормально. С компасом пока непонятно. Выдает какую-то абстракцию. На повороты реагирует однозначно, в смысле в одном положении выдает плюс минус лапоть одно значение, но значения выдаваемых градусов с реальностью никак не связываются.
    Так ориентируем ось X (по акселерометру) на север-юг. 57 градусов. Поворачиваем на 180 градусов - 75 градусов.
     
    Последнее редактирование: 25 авг 2015
  10. Unixon

    Unixon Оракул Модератор

    Помучайте его постоянным магнитом с известными полюсами.
     
  11. geher

    geher Гуру

    Помучил. С магнитом все нормально. А с магнитным полем Земли как-то не очень. При этом в той же точке магнитометр смартфона направление на север показывает стабильно.
     
  12. geher

    geher Гуру

    Магнит, кстати, нужно подносить очень близко для правильной ориентации. На смарте компас перестраивается уже на более дальней дистанции. Такая низкая чувствительность?
     
  13. Unixon

    Unixon Оракул Модератор

    Чувствительность через функцию setRange() меняли?
     
  14. geher

    geher Гуру

    Пробовал. Ничего не меняется.
    Кроме того, насколько я понял, там по умолчанию наиболее узкий диапазон включается (-4 - +4) и, следовательно, наибольшая чувствительность.
     
  15. geher

    geher Гуру

    Сейчас попробовал получать данные в Гауссах по осям.
    Получается интересный результат.
    Если поднести магнит, то достаточно прогнозируемо от ориентации магнита напряженность меняется по соответствующей оси от примерно -4 до 4.
    Если же магнит далеко, то показывает значение от 0.2 до 0.6. Корелляция с ориентацией магнитного поля Земли прослеживается отчетливо, но абсолютные значения какие-то неадекватные.
    Возникает вопрос. Это помехи такие сильные у меня, но магнитометр смартфона просто считает по какой-то более умной формуле, или что-то не так с калибровкой магнитометра в модуле?
    Есть ли где-то умный, но доходчивый текст, по которому можно было бы понять, как магнитометр можно "поправить", что за калибровочная матрица и что за вектор bias в исходнике библиотеки, и каков их физический смысл?
     
  16. Unixon

    Unixon Оракул Модератор

    Смысл то понятен - выполняется приведение к началу системы координат и ортогональному ортонормированному базису. А вот откуда именно такие значения и почему они одинаковые для всех сенсоров - это вопрос к автору библиотеки.
     
  17. geher

    geher Гуру

    Издевательства над магнитным сенсором привели к следующим результатам (пишу совершенно ненаучным языком, дабы не пугать людей словами "ортонормированный" и прочими подобными, так что извините за использованные выражения):
    Вектор bias предназначен для коррекции показаний магнитометра в относительно неискаженном поле Земли с целью приведения их к шкале с равноотстоящими от нуля минимумом и максимумом.
    Матрица калибровки предназначена для того, чтобы значения максимума и минимума по всем осям совпадали.
    Т.е. то самое приведение системы координат к параллельно-перпендикулярному состоянию, когда центр облака показаний (показаний при разных ориентациях модуля) в нуле по всем осям, а облако показаний размещается равномерно шариком вокруг означенного нуля.
    В результате получилось, что по осям х и у (z не рассматривал вообще) моего конкретного экземпляра bias врет для х на где-то на 200, для у где-то на -1000. Матрицу пока даже не пытался рассчитать.
    Примерно правильный компас получился, когда я откинул в сторону функцию библиотечного класса, и написал свою, отличие которой от оригинальной заключается в использовании очень грубой (зато более верной для данного конкретного экземпляра) "центровки" системы координат и отсутствии приведения к единому масштабу по осям (благо, разброс минимумов и максимумов по осям с учетом переноса нуля оказался невелик):
    Код (Text):

    float getCompassAngle(Compass *compass)
    {
      float res=atan2(compass->readY()-3000.0, compass->readX()-1000.0);
      if(res < 0)
      res += 2*PI;

      if(res > 2*PI)
      res -= 2*PI;

      return (res * 180/M_PI);

    }
     
    Оно, конечно, врет преизрядно (на градусы как минимум), но всяко выходит точнее имеющегося в библиотеке.
    Если будет время, как-нибудь займусь расчетом правильных и точных значений вектора bias и калибровочной матрицы для библиотечной функции под свой экземпляр модуля.
    Если совсем будет достаточно времени, то можно будет даже попробовать нарисовать калибровочную процедуру, чтобы можно было рассчитать все это добро, повертев некоторое время модуль по всем осям.

    А еще я не понял, зачем в примере перез вызовом read_Yaw вызывается readXYZ_Calib, если внутри read_Yaw в самом начале опять вызывается readXYZ_Calib.
     
    Последнее редактирование: 29 авг 2015
  18. Купил тот же датчик. С компасом такая же беда. Да и честно говоря все библиотеки надо перерабатывать чтоб добиться человеческих результатов, они очень сырые. Честно говоря покупая 3 в одном с готовыми библиотеками не очень рассчитываешь на подобные результаты.
     
    issaom нравится это.
  19. Хм, купил вчера, подключил сегодня ;)
    инициализируется, но не идут данные в сериал...
    воткнул в ардуино шилд в.5.0 аналогично, как на тройке шилд показано было...
    (цветом обозначил на картинке):
    1.jpg
    и в сериал цифры разные посылал и на линию S второй разъем перетыкал - ноль эмоций.
    чего не так? ((


    п.с. полез с горя в исходники библиотеки..lis3mdl.cpp
    и что вижу (кусок):

    f(heading < 0)
    heading += 2*PI;

    if(heading > 2*PI)
    heading -= 2*PI;

    float headingDegrees = heading * 180/M_PI;

    -ребята, в С нет числа PI ! а есть только M_PI (ниже то правильно написано)
    надо бы поправить!
     
  20. PB070001.JPG PB070002.JPG и еще, попробовал напрямую подключить-тот же фефект ((