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

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

  1. geher

    geher Гуру

    В библиотеках Arduino IDE константа PI есть, объявлена в wiring.h, которая цепляется к программе неявным образом.

    А по проблеме.
    Гляжу я на плату и вижу уну, если мне зрение не изменяет.
    А в уне I2C на других пинах, надо цеплять к A4 и A5, а не к цифровым 2 и 3. Последнее характерно для леонардообразных плат, вроде искры нео, под которую картинка в амперковской вики и нарисована.
    Оно, конечно, предупреждать надо (это к тем, кто писал ту статью в Вики), но все же знать, к какому интерфейсу подключается модуль, и где именно на имеющейся в руках плате расположены пины данного интерфейса, бывает полезно.
     
    Последнее редактирование: 7 ноя 2015
    Roman Koff нравится это.
  2. Спасибо, конечно, но - не помогло.
    спасибо, пока оставлю попытки..
    С уважением, Владимир.
     
  3. Все, понял.
    Сделал тут урок №7 - бегущий огонек, и все сразу стало ясно:
    из 12 проводков папа-папа 3-4 постоянно отлипали!!! и рвали связь. (шатать приходилось)
    вывод - ((( надо искать качественные провода или самому делать!
    поэтому и SD, думаю, не читалась - из 6 проводов уж 1 да подсирал....
    :mad:
    С уважением, Владимир.
     
  4. andrey_m454

    andrey_m454 Нуб

    У меня на UNO пример imu работает только если отключить чтение показаний барометра и других датчиков, кроме компаса. Включение гиро (или др.) приводит к остановке цикла. Показания компаса внятны на магнит.
    Ешё. Пример, работающий на UNO, на M0 не компилируется.
    Андрей.
     
  5. Товарищи!
    А за такое в приличном обчестве кандилябром бы надо!
    PB080001.JPG PB080005.JPG
    -@#@@@, только на макро увидел!!
     
    Последнее редактирование: 8 ноя 2015
  6. -решил, называецца, сэкономить! на 444 рубля за нонэйм УНУ повелся...
    теперь зато освоил паяльник, взял паяльную станцию за 8 тыр и микровэйф за 1.7...:eek:
    канешно, все в подлунном мире взаимосвязано, скАжете...
    С уважением, Владимир.
     
  7. -так что у себя тоже лучше все прозвоните..и с лупой поглядите...
    кабы не пресловутая "проблема контакта" была.
    С уважением, Владимир.
     
  8. Спаял с 3-го раза, зачистил, собрал и т.п...
    Ну разумеется, все сразу пошло!
    (подключал по совету Гуру - через А4 и А5)
    так что andrey_m454 - проверьте контакты..
    Спасибо всем за решение проблемы.
    С уважением, Владимир.
     
  9. вот и славно:
    пример.jpg
    С уважением, Владимир
     
  10. Dragal

    Dragal Нуб

    Купил IMU! После подключения и заливки скетча проходила инициализация и один круг измерений на это останавливалось! Удалил из скетча считывание барометра и все работает отлично! Возможно ли, что просто не работает Барометр???


    Также я попытался применить Complementary filter, но мне выдается вот такая вот ошибка

    IMU.ino.ino: In function 'void loop()':
    IMU.ino:35: error: expected ',' or '...' before '.' token


    вот часть моего кода:
    void loop()
    {
    float pitch = 0;
    float pitchAcc;
    float coef = 0.98;
    void ComplementaryFilter (int accel.readX_G(),int accel.readY_G(), int accel.readZ_G(), int gyro.readY_DegPerSec(),int gyro.readZ_DegPerSec())
    long squaresum = (long)accel.readY_G()*accel.readY_G() + (long)accel.readZ_G()*accel.readZ_G();
    pitch += ((-gyro.readY_DegPerSec())* dt);
    pitchAcc = atan(accel.readX_G()/sqrt(squaresum))* 180 / M_PI;
    pitch = coef*pitch + (1.0-coef)*pitchAcc;



    // вывод угловой скорости относительно оси Y
    Serial.print(pitch);
    Serial.println("");
    delay(300);
    }


    подскажите, что неправильно?
     
    Последнее редактирование: 12 ноя 2015
  11. void ComplementaryFilter (int accel.readX_G(),int accel.readY_G(), int accel.readZ_G(), int gyro.readY_DegPerSec(),int gyro.readZ_DegPerSec()) - тут ";" в конце забыли имхо.

    надо
    void ComplementaryFilter (int accel.readX_G(),int accel.readY_G(), int accel.readZ_G(), int gyro.readY_DegPerSec(),int gyro.readZ_DegPerSec());
     
  12. Dragal

    Dragal Нуб

    Спасибо!
     
  13. Dragal

    Dragal Нуб

    Кстати, Гироскоп показывает градусы в секунду! Если мы хотим применить все тот же комплементарный метод нам нужны просто градусы ? как это сделать подскажите пожалуйста!
     
  14. имхо, гироскоп всегда по 1-й производной работает... если я понятно объясняю.
    в смысле, только в динамике. в статике нет...
    гироскоп - это прецессия вблизи точки равновесия. (нет?)\
    С уважением, Владимир
     
  15. Dragal

    Dragal Нуб

    А как тогда воспользоваться этим методом при программировании? Теоретически нам нужно, чтобы два ближайших измерения с гироскопа вычитались и частное делилось на промежуток времени между двумя измерениями? как это оформить в ардуино???
     
  16. "два ближайших измерения с гироскопа вычитались и частное делилось на промежуток времени"
    нелогично надо:
    два ближайших измерения с гироскопа вычитались и результат делился на промежуток времени-правильнее
    но мне кажется, даже этого не нужно нужно чтобы знак менялся (+ / -) наверное. если знак не меняется - падаем в одну сторону... но вообще не использовал сам, гугл как говориться, в помощь... смотрите самплы у людей!
    С уважением.
     
  17. Tal

    Tal Нуб

    Здравствуйте! Я столкнулся со следующей проблемой: подключил датчик к UNO через Troyka Sheild, как указано в вики, загрузил скетч-пример imu, но датчик выдает сигнал только по акселерометру и гироскопу. Датчики компаса и барометра не работают, в том числе при загрузке их отдельных примеров.
    При этом при компиляции кода выдаются ошибки:
    Код (C++):
    D:\progs\arduino-1.6.7\libraries\Troyka-IMU-master\lis3mdl.cpp: In member function 'int16_t LIS3MDL_TWI::readAxis(uint8_t)':

    D:\progs\arduino-1.6.7\libraries\Troyka-IMU-master\lis3mdl.cpp:160:30: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default]

         Wire.requestFrom(_addr, 1);

                                  ^

    In file included from D:\progs\arduino-1.6.7\libraries\Troyka-IMU-master\lis3mdl.cpp:3:0:

    D:\progs\arduino-1.6.7\hardware\arduino\avr\libraries\Wire/Wire.h:64:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)

         uint8_t requestFrom(int, int);

                 ^

    D:\progs\arduino-1.6.7\hardware\arduino\avr\libraries\Wire/Wire.h:61:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)

         uint8_t requestFrom(uint8_t, uint8_t);

                 ^

    D:\progs\arduino-1.6.7\libraries\Troyka-IMU-master\lis3mdl.cpp:168:30: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default]

         Wire.requestFrom(_addr, 1);

                                  ^

    In file included from D:\progs\arduino-1.6.7\libraries\Troyka-IMU-master\lis3mdl.cpp:3:0:

    D:\progs\arduino-1.6.7\hardware\arduino\avr\libraries\Wire/Wire.h:64:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)

         uint8_t requestFrom(int, int);

                 ^

    D:\progs\arduino-1.6.7\hardware\arduino\avr\libraries\Wire/Wire.h:61:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)

         uint8_t requestFrom(uint8_t, uint8_t);

                 ^

    Исследование библиотеки показало, что код останавливается при попытке считать данные с датчика, то есть в коде

    Код (C++):
    int16_t LIS3MDL_TWI::readAxis(uint8_t reg)
    {
        Wire.beginTransmission(_addr);
        Wire.write(reg);
        Wire.endTransmission();
        Wire.requestFrom(_addr, 1);
        while (Wire.available() < 1) ;
        uint8_t lowByte = Wire.read();
        ++reg;

        Wire.beginTransmission(_addr);
        Wire.write(reg);
        Wire.endTransmission();
        Wire.requestFrom(_addr, 1);
        while (Wire.available() < 1)  ;
        uint8_t highByte = Wire.read();

        return ((int16_t)highByte << 8) | lowByte;

    }
    зацикливается оператор while
    Может ли быть, что часть датчиков на сенсоре бракованная, или имеет не тот адрес, который указан в спецификации?
     
  18. Roman Koff

    Roman Koff Нерд

    Так нужно на гитхабе писать в Issues. Если нет учетки на гитхабе, могу написать запрос разработчикам, пусть фиксят...
     
  19. Unixon

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

    Если висит в этом цикле, значит датчик не отвечает. В библиотеке не реализованы таймауты на опрос I2C, вот на это багу стоит повесить.