I2c를 통해 Raspberrypi 2에 연결된 MPU9150을 사용하여 Acc, Gyro, 자기 센서 값을 얻으려면 다음 프로그램을 코딩했습니다. 올바른 acc 및 자이로 값을 얻을 수 있지만 자기 센서 값이 올바르지 않습니다.MPU9150에서 자력계 센서 오류
자기 X 축 (16 비트)의 레지스터 값을 표시했습니다. 상위 바이트는 0x00 또는 0xff이고 하위 바이트는 결과 값 [0x00,0xff]입니다. 그래서 자성의 상위 바이트에는 문제가 있다고 생각합니다. 해결 방법을 알려주십시오.
[출력] 예 1 LSB = 0E, MSB = 00 예 2 LSB = 12, 00 = MSB, LSB = 하심을 뜻 1D, MSB = FF
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define MPU9150_ADDRESS (0x68)
#define MPU9150_REG_PWR_MGMT_1 (0x6b)
#define MPU9150_INT_PIN_CFG (0x37)
#define MPU9150_GYRO_CFG (0x1b)
#define MPU9150_REG_DATA_START (0x3b)
#define M_I2C_ADDRESS (0x0c)
#define M_CNTL (0x0A)
#define M_REG_DATA_START (0x03)
int main(int argc, char *argv[]) {
printf("MPU9150 starting\n");
// Setup Wiring Pi
wiringPiSetup();
// Open an I2C connection
int fd = wiringPiI2CSetup(MPU9150_ADDRESS);
// MPU6050_REG_PWR_MGMT_1
wiringPiI2CWriteReg8(fd, MPU9150_REG_PWR_MGMT_1, 0x00);
wiringPiI2CWriteReg8(fd,MPU9150_INT_PIN_CFG, 0x02);
wiringPiI2CWriteReg8(fd,MPU9150_GYRO_CFG, 0x10);
int fd2 = wiringPiI2CSetup(M_I2C_ADDRESS);
wiringPiI2CWriteReg8(fd2,M_CNTL, 0x01);
while(1) {
uint8_t msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START);
uint8_t lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+1);
float accelX = (msb << 24 | lsb << 16) >> 16;
msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+2);
lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+3);
float accelY = (msb << 24 | lsb << 16) >> 16;
msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+4);
lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+5)
float accelZ = (msb << 24 | lsb << 16) >> 16;
msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+6);
lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+7);
float temp = (msb << 24 | lsb << 16) >> 16;
msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+8);
lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+9);
float gyroX = (msb << 24 | lsb << 16) >> 16;
msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+10);
lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+11);
float gyroY = (msb << 24 | lsb << 16) >> 16;
msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+12);
lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+13);
float gyroZ = (msb << 24 | lsb << 16) >> 16;
wiringPiI2CWriteReg8(fd2,M_CNTL, 0x01);
delay(10);
lsb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START);
msb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+1);
float magX = ((int16_t msb << 8)| lsb ;
lsb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+2);
msb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+3);
float magY = ((int16_t msb << 8)| lsb ;
lsb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+4);
msb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+5);
float magZ = ((int16_t msb << 8)| lsb ;
printf("lsb=%x,msb=%x\n",lsb,msb);
}
}
답장을 보내 주셔서 감사합니다. – kkj
나는 지구 자기장의 자속 밀도에 대한 정확한 크기 순서를 오해했다. msb는 항상 2 가지 유형의 값 (0xff 또는 0x00)이므로,이 값은 corect가 아니라는 오해가 있습니다. 그러나 msb는 지구 자기장의 값을 바꾸지 않아야합니다. 왜냐하면 아주 작은 값이기 때문입니다. – kkj
@kkj이 질문에 대한 답변이 되었습니까? – Tim