#1 Re: Програмування Arduino » Допомога по модулю GY-86, а саме HMC5883L (магнітометр) » 2023-08-08 23:58:50

KAS

К сожаление метод не сработал, но ты меня натолкнул на мысль, что используются "сырые" значения. Взял твой калибровщик и с помощью него перевел "сырые" в калиброваные. Компас начал показывать полный круг в 360 градусов, всё же на точный север не показывает (хотя угол склонения тоже добавил). В моем проекте это не важно, мне нужно только направление. Ну и добавлю что датчик очень чувствителен к магнитным полям, телефон лежащий в 10см от датчика дает погрешность в 10-15 градусов.

Формула перевода значений:
offset = (minimum + maxmum) / 2  //minimum, maxmum - из калибровщика
value = valueRaw - offset                //valueRaw - сырое значение с датчика, value - значение для расчёта heading

Может кому понадобится код:

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "HMC5883L.h"


MPU6050 accelgyro;
HMC5883L mag;

int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t mx, my, mz;

float offsetMx, offsetMy, offsetMz;
float scaledMx, scaledMy, scaledMz;

#define LED_PIN 13
#define DA 0,146608 //Declination angle in RAD

bool blinkState = false;

void setup() {
   
    Wire.begin();
    accelgyro.setI2CMasterModeEnabled(false);
    accelgyro.setI2CBypassEnabled(true) ;
    accelgyro.setSleepEnabled(false);

    Serial.begin(38400);

    // initialize device
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    mag.initialize();
    Serial.println(mag.testConnection() ? "HMC5883L connection successful" : "HMC5883L connection failed");

    // verify connection
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

    // configure Arduino LED for
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    mag.getHeading(&mx, &my, &mz);

    // display tab-separated accel/gyro x/y/z values
    Serial.print("a/g:t");
    Serial.print(ax); Serial.print("t");
    Serial.print(ay); Serial.print("t");
    Serial.print(az); Serial.print("t");
    Serial.print(gx); Serial.print("t");
    Serial.print(gy); Serial.print("t");
    Serial.print(gz); Serial.print("t");
    
    Serial.print("mag:t");
    Serial.print(mx); Serial.print("t");
    Serial.print(my); Serial.print("t");
    Serial.print(mz); Serial.print("t");
    delay(100);

    offsetMx = (-762 + 276)/2; // Min and Max values taken from calibrator
    offsetMy = (-892 + 155)/2; // Used formula to get scaled values: offset = (minimum + maxmum) / 2; value = valueRaw - offset
    offsetMz = (-701 + 256)/2; //

    scaledMx = mx - offsetMx;
    scaledMy = my - offsetMy;
    scaledMz = mz - offsetMz;

    
// To calculate heading in degrees. 0 degree indicates North
    
    float heading = atan2(scaledMy, scaledMx);
    heading += DA;         //including declination angle
    
    if(heading < 0)
      heading += 2 * M_PI;
    Serial.print("heading:t");
    Serial.println(heading * 180/M_PI);

    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
}

#2 Програмування Arduino » Допомога по модулю GY-86, а саме HMC5883L (магнітометр) » 2023-08-05 14:11:29

Timoha_k
відповідей: 2

Всім привіт! Придбав от такий модуль датчиків (Модуль GY-86 комбінованих 10-DOF датчиків IMU - MPU6050 / HMC5883L / MS5611)
https://arduino.ua/prod1026-modyl-gy-86 … 83l-ms5611
Код взяв тут:
https://forum.arduino.cc/t/extracting-a … -86/185955
Біблітеки з того ж ресурсу:
Ця https://github.com/jrowberg/i2cdevlib/t … no/MPU6050
І ця: https://github.com/jrowberg/i2cdevlib/t … o/HMC5883L

Під'єдную до Arduino Due

Сама проблема:
Код працює, в серійний порт виводить данні, але heading (напрямок по компасу) постіно коливається в діапазоні 190-230, хоча повинен змінюватись від 0 до 360. При тому що повертаю датчик на 360 градусів навколо вертикальної осі

Дякую за допомогу!

Код:

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "HMC5883L.h"


MPU6050 accelgyro;
HMC5883L mag;

int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t mx, my, mz;

#define LED_PIN 13
bool blinkState = false;

void setup() {
   
    Wire.begin();
    accelgyro.setI2CMasterModeEnabled(false);
    accelgyro.setI2CBypassEnabled(true) ;
    accelgyro.setSleepEnabled(false);

    Serial.begin(38400);

    // initialize device
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    mag.initialize();
    Serial.println(mag.testConnection() ? "HMC5883L connection successful" : "HMC5883L connection failed");

    // verify connection
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

    // configure Arduino LED for
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    mag.getHeading(&mx, &my, &mz);

    // display tab-separated accel/gyro x/y/z values
    Serial.print("a/g:t");
    Serial.print(ax); Serial.print("t");
    Serial.print(ay); Serial.print("t");
    Serial.print(az); Serial.print("t");
    Serial.print(gx); Serial.print("t");
    Serial.print(gy); Serial.print("t");
    Serial.print(gz); Serial.print("t");
    
    Serial.print("mag:t");
    Serial.print(mx); Serial.print("t");
    Serial.print(my); Serial.print("t");
    Serial.print(mz); Serial.print("t");
    delay(500);
    
// To calculate heading in degrees. 0 degree indicates North
    //float heading = atan2(my, mx);
    float heading = atan2(mx, my);
    if(heading < 0)
      heading += 2 * M_PI;
    Serial.print("heading:t");
    Serial.println(heading * 180/M_PI);

    // blink LED to indicate activity
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
}

Скрін:
Screenshot-2023-08-05-135142.png

#3 Апаратні питання » Постійно крутиться двигун » 2023-04-08 06:50:42

Timoha_k
відповідей: 8

На гусеничному роботі (https://arduino.ua/prod5661-keyestudio-mini-caterpillar-tank-robot-v3-0-for-arduino-kit-robot-car-diy-programmable-stem-toys) замість рідної UNO встановив Due, але залишив рідний мотор шилд keyestudio. Тепер при подачі живлення (чи то від акумуляторів, чи при підключенні usb кабелю) подається живлення на порти двигунів А та А1(при живленні від двох 18650 - 8,2В). Поки мотор шилд був втстановлений на рідній UNO цього не було. Може хто знає як позбутись такої прикрості?
Заздалегідь дякую

Підвал форуму