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);}
}
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login