Купил датчик IMU-сенсор для выполнения задачи, связанной с балансирующим роботом(машинкой). Открыл пример из библиотеки, ни в примере, ни в файле .h ничего не менял, датчик паяльником не трогал и никак не портил, только что вынул из коробки. Суть в том, что по показаниям в COM порту видно, что показания с акселерометра по оси Z никак не меняются, при том, что все остальные показания, а именно у гироскопа по всем 3 осям, у акселерометра по 2 осям, у компаса и у барометра, все показания так или иначе изменяются. Не понимаю в чём проблема. Код: Код (C++): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулями IMU #include <TroykaIMU.h> // создаём объект для работы с гироскопом Gyroscope gyro; // создаём объект для работы с акселерометром Accelerometer accel; // создаём объект для работы с компасом Compass compass; // создаём объект для работы с барометром Barometer barometer; // калибровочные значения компаса // полученные в калибровочной матрице из примера «compassCalibrateMatrix» const double compassCalibrationBias[3] = { 524.21, 3352.214, -1402.236 }; const double compassCalibrationMatrix[3][3] = { {1.757, 0.04, -0.028}, {0.008, 1.767, -0.016}, {-0.018, 0.077, 1.782} }; void setup() { // открываем последовательный порт Serial.begin(115200); // выводим сообщение о начале инициализации Serial.println("Begin init..."); // инициализация гироскопа gyro.begin(); // инициализация акселерометра accel.begin(); // инициализация компаса compass.begin(); // инициализация барометра barometer.begin(); // калибровка компаса compass.calibrateMatrix(compassCalibrationMatrix, compassCalibrationBias); // выводим сообщение об удачной инициализации Serial.println("Initialization completed"); Serial.println("Gyroscope\t\t\tAccelerometer\t\t\tCompass\t\tBarometer"); } void loop() { // вывод угловой скорости в градусах в секунду относительно оси X Serial.print(gyro.readDegPerSecX()); Serial.print("\t"); // вывод угловой скорости в градусах в секунду относительно оси Y Serial.print(gyro.readDegPerSecY()); Serial.print("\t"); // вывод угловой скорости в градусах в секунду относительно оси Z Serial.print(gyro.readDegPerSecZ()); Serial.print("\t\t"); // вывод направления и величины ускорения в м/с² по оси X Serial.print(accel.readAX()); Serial.print("\t"); // вывод направления и величины ускорения в м/с² по оси Y Serial.print(accel.readAY()); Serial.print("\t"); // вывод направления и величины ускорения в м/с² по оси Z Serial.print(accel.readAZ()); Serial.print("\t\t"); // выводим азимут относительно оси Z Serial.print(compass.readAzimut()); Serial.print(" Degrees\t"); // вывод значения абсолютного давления Serial.print(barometer.readPressureMillibars()); Serial.print("\t"); // вывод значения температуры окружающей среды Serial.print(barometer.readTemperatureC()); Serial.print("\t"); Serial.println(""); delay(100); } Библиотеку скачивал отсюда: https://github.com/amperka/Troyka-IMU Прошу помочь.
Ещё вот, что интересно, у данного сенсора в описании на http://wiki.amperka.ru/продукты:troyka-imu-10-dof, не используются 2 пина. Тогда возникает вопрос: Зачем их придумали, раз если он есть на плате, то они зачем-то да нужны. Может ли проблема стоять в том, что один из "ненужных" пинов(их всего 2) отвечает как раз за показания с акселерометра по оси Z?
Все датчики данного модуля сидят на шине i2c - два провода это необходимо и достаточно. Пример с углами не пробовали загружать для определения крена тангажа и рысканья Madgwick6DOF.ino? У меня все заработало сразу - думаю что у вас просто бракованный датчик... Пишите в техподдержку через обратную форму на сайте.
Спасибо огромное ещё раз! Попробовал только щас, просто предыдущие дни паял моторный драйвер для машинки. Всё отлично заработало.