Compass Data from M5stack Fire
-
I have the M5Stack fire (Version:2018.2A) but having difficulties in getting magnometer data.
Previously uiflow had the block get Z but it is removed at a later stage.
I tried below Arduino code but readings are incorrect.
Could anyone assist?#include <M5Stack.h>
#include "utility/MPU9250.h"MPU9250 IMU;
void setup()
{
M5.begin();
Wire.begin();IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
IMU.initMPU9250();
IMU.initAK8963(IMU.magCalibration);
}void loop()
{
// If intPin goes high, all data registers have new data
// On interrupt, check if data ready interrupt
if (IMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01)
{
IMU.readAccelData(IMU.accelCount);
IMU.getAres();IMU.ax = (float)IMU.accelCount[0] * IMU.aRes; // - accelBias[0]; IMU.ay = (float)IMU.accelCount[1] * IMU.aRes; // - accelBias[1]; IMU.az = (float)IMU.accelCount[2] * IMU.aRes; // - accelBias[2]; IMU.readGyroData(IMU.gyroCount); // Read the x/y/z adc values IMU.getGres(); // Calculate the gyro value into actual degrees per second // This depends on scale being set IMU.gx = (float)IMU.gyroCount[0] * IMU.gRes; IMU.gy = (float)IMU.gyroCount[1] * IMU.gRes; IMU.gz = (float)IMU.gyroCount[2] * IMU.gRes; IMU.readMagData(IMU.magCount); // Read the x/y/z adc values IMU.getMres(); // User environmental x-axis correction in milliGauss, should be // automatically calculated //IMU.magbias[0] = +470.; // User environmental x-axis correction in milliGauss TODO axis?? //IMU.magbias[1] = +120.; // User environmental x-axis correction in milliGauss //IMU.magbias[2] = +125.; // Calculate the magnetometer values in milliGauss // Include factory calibration per data sheet and user environmental // corrections // Get actual magnetometer value, this depends on scale being set IMU.mx = (float)IMU.magCount[0] * IMU.mRes * IMU.magCalibration[0] - IMU.magbias[0]; IMU.my = (float)IMU.magCount[1] * IMU.mRes * IMU.magCalibration[1] - IMU.magbias[1]; IMU.mz = (float)IMU.magCount[2] * IMU.mRes * IMU.magCalibration[2] - IMU.magbias[2]; int x=64+10; int y=128+20; int z=192+30; M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextColor(GREEN , BLACK); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(0, 0); M5.Lcd.print("MPU9250/AK8963"); M5.Lcd.setCursor(0, 32); M5.Lcd.print("x"); M5.Lcd.setCursor(x, 32); M5.Lcd.print("y"); M5.Lcd.setCursor(y, 32); M5.Lcd.print("z"); M5.Lcd.setCursor(0, 64 * 2); M5.Lcd.print((int)(IMU.gx)); M5.Lcd.setCursor(x, 64 * 2); M5.Lcd.print((int)(IMU.gy)); M5.Lcd.setCursor(y, 64 * 2); M5.Lcd.print((int)(IMU.gz)); M5.Lcd.setCursor(z, 64 * 2); M5.Lcd.print("o/s"); M5.Lcd.setCursor(0, 80 * 2); M5.Lcd.print((int)(IMU.mx)); M5.Lcd.setCursor(x, 80 * 2); M5.Lcd.print((int)(IMU.my)); M5.Lcd.setCursor(y, 80 * 2); M5.Lcd.print((int)(IMU.mz)); M5.Lcd.setCursor(z, 80 * 2); M5.Lcd.print("mG"); float headingRadians = atan2((IMU.my), (IMU.mx)); float headingDegrees = headingRadians * 180 / PI;
if (headingDegrees < 0) {
headingDegrees += 360;
}
M5.Lcd.setTextColor(YELLOW , BLACK);
M5.Lcd.setCursor(0, 48 * 2); M5.Lcd.print(headingDegrees);delay(100);
}
}