Компас на ардуино.

Тема в разделе "Arduino & Shields", создана пользователем Buzhak, 28 май 2019.

Метки:
  1. Buzhak

    Buzhak Нуб

    Приветствую друзья.

    Мне ОЧЕНЬ нужна помощь с вот этим модулем.
    Может быть кто-то уже делал компас с помощью него и есть скетч?
    Меня интересует компенсация углов наклона компаса, все остальное в норме.

    Я прочитал кучу статей, посмотрел видео и форумы, даже тут были темы подобные, ничего не выходит. Мне нужен конкретный пример кода, как это все сделать.
    Я просто не могу понять, как это работает.
     
  2. Airbus

    Airbus Радиохулиган Модератор

    Как работает?Вот так!
    Видео


    и скетч.
    Код (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);
        }

     
     
  3. Asper Daffy

    Asper Daffy Иксперд

  4. Buzhak

    Buzhak Нуб



    При наклоне компаса по вертикали уезжает значение, так же как при повороте, мне вот это нужно компенсировать, в этом скетче этого нет делается или просто не работает!
     
    Последнее редактирование: 28 май 2019
  5. Buzhak

    Buzhak Нуб

    Это-то все понятно, но компас показывает верные данные только если находится параллельно "земле"
     
  6. Если кавычки вокруг "земли" лишние. то всё правильно. Компасом вертеть нельзя как попало.
     
    DetSimen и parovoZZ нравится это.
  7. Airbus

    Airbus Радиохулиган Модератор

    Вы попробуйте на охотничьем компасе.Если ему задавать крены тангажи то стрелка тоже будет гулять до +/-45граду ов.
     
  8. Asper Daffy

    Asper Daffy Иксперд

    Точно всё понятно?

    Конкретно в тот скетч я не лез, но обычно "калибровкой" называют как раз процесс построения таблиц компенсаций. Например, у квадрокоптеров часто перед полётом надо расположить его более или менее горизонтально и покрутить руками пока он не построит таблицу и не отсигналит светодиодом. Думаю и там как раз такая калибровка.

    Если нет, по лбюому ищи скетч калибровки - их как грязи и многие именно для того, что тебе нужно.
     
  9. sslobodyan

    sslobodyan Гик

    ТС - гуглить "arduino compass tilt compensation". У одного поляка есть даже готовый скетч но для mpu6050. Ссылок не дам - хватит наводки.
     
  10. Evg_M32

    Evg_M32 Нуб

    Всем привет.
    Такой вопрос. А у кого-нибудь компенсация наклона с этим модулем заработала?
    В частности, пока не понял как он азимут считает.
    Потому как кусок кода

    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() ни разу.
    Похоже, что ошибка при расчете стандартного азимута аналогична ошибке при вычислении скомпенсированного угла.