Приветствую друзья. Мне ОЧЕНЬ нужна помощь с вот этим модулем. Может быть кто-то уже делал компас с помощью него и есть скетч? Меня интересует компенсация углов наклона компаса, все остальное в норме. Я прочитал кучу статей, посмотрел видео и форумы, даже тут были темы подобные, ничего не выходит. Мне нужен конкретный пример кода, как это все сделать. Я просто не могу понять, как это работает.
Как работает?Вот так! Видео и скетч. Код (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); }
Так по твоей же ссылке, есть ссылка на скетч калибровки - http://wiki.amperka.ru/продукты:troyka-compass_calibration
При наклоне компаса по вертикали уезжает значение, так же как при повороте, мне вот это нужно компенсировать, в этом скетче этого нет делается или просто не работает!
Вы попробуйте на охотничьем компасе.Если ему задавать крены тангажи то стрелка тоже будет гулять до +/-45граду ов.
Точно всё понятно? Конкретно в тот скетч я не лез, но обычно "калибровкой" называют как раз процесс построения таблиц компенсаций. Например, у квадрокоптеров часто перед полётом надо расположить его более или менее горизонтально и покрутить руками пока он не построит таблицу и не отсигналит светодиодом. Думаю и там как раз такая калибровка. Если нет, по лбюому ищи скетч калибровки - их как грязи и многие именно для того, что тебе нужно.
ТС - гуглить "arduino compass tilt compensation". У одного поляка есть даже готовый скетч но для mpu6050. Ссылок не дам - хватит наводки.
Всем привет. Такой вопрос. А у кого-нибудь компенсация наклона с этим модулем заработала? В частности, пока не понял как он азимут считает. Потому как кусок кода float Compass::readAzimut() { int16_t x, y, z; readXYZ(x, y, z); float mx = x, my = y, mz = z; _calibrate(mx, my, mz); float heading = atan2(mx, my); if (heading < 0) { heading += TWO_PI; } float headingDegrees = heading * RAD_TO_DEG; return headingDegrees; вообще не тождественен команде readAzimut() ни разу. Похоже, что ошибка при расчете стандартного азимута аналогична ошибке при вычислении скомпенсированного угла.