|
本帖最后由 yshihyu 于 2015-12-27 22:54 编辑
MPU9150 DMP , 我在 6050使用DMP 可以取得精确度 pitch and roll angle , 只是 yaw angle 有问题, 所以需要 magnetometer 修正 yaw angle , 所以我想使用 MPU9150 gyroscope accelerometer magnetometer 让 DMP 整合计算出来
mpu9150test.ino 里面 loop 函数里面
mpu.dmpGetMag(mag, fifoBuffer);
取出来 mag都是0
MPU9150_9Axis_MotionApps41.h 跟 dmp 有关
里面的 dmpInitialize 函数跟 magnetometer 有关系的函数是下面几段程式码 ,
- uint8_t dmpInitialize() {
- DEBUG_PRINTLN(F("Setting magnetometer mode to power-down..."));
- //mag -> setMode(0);
- I2Cdev::writeByte(0x0E, 0x0A, 0x00);
- DEBUG_PRINTLN(F("Setting magnetometer mode to fuse access..."));
- //mag -> setMode(0x0F);
- I2Cdev::writeByte(0x0E, 0x0A, 0x0F);
- DEBUG_PRINTLN(F("Reading mag magnetometer factory calibration..."));
- int8_t asax, asay, asaz;
- //mag -> getAdjustment(&asax, &asay, &asaz);
- DEBUG_PRINTLN(F("Setting magnetometer mode to power-down..."));
- //mag -> setMode(0);
- DEBUG_PRINTLN(F("Setting AK8975 to single measurement mode..."));
- //mag -> setMode(1);
- I2Cdev::writeByte(0x0E, 0x0A, 0x01);
- }
复制代码
但是 MPU9150.cpp 使用 magnetometer 使用getMotion9函数取raw data可以取到 , 而里面的 MPU9150_RA_MAG_ADDRESS是 0x0C 跟DMP 使用的 0x0E 为什么不同? 我有试过把 0x0E 改成 0x0C 不过DMP 还是得不到 magnetometer 资料
- void MPU9150::getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz) {
- //get accel and gyro
- getMotion6(ax, ay, az, gx, gy, gz);
- //read mag
- I2Cdev::writeByte(devAddr, MPU9150_RA_INT_PIN_CFG, 0x02); //set i2c bypass enable pin to true to access magnetometer
- delay(10);
- I2Cdev::writeByte(MPU9150_RA_MAG_ADDRESS, 0x0A, 0x01); //enable the magnetometer
- delay(10);
- I2Cdev::readBytes(MPU9150_RA_MAG_ADDRESS, MPU9150_RA_MAG_XOUT_L, 6, buffer);
- *mx = (((int16_t)buffer[0]) << 8) | buffer[1];
- *my = (((int16_t)buffer[2]) << 8) | buffer[3];
- *mz = (((int16_t)buffer[4]) << 8) | buffer[5];
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|