Bosch Sensortec Community

    Showing results for 
    Search instead for 
    Did you mean: 

    Reading BMM150 head

    Occasional Visitor

    Reading BMM150 head


    I'm using the BMM150 to get earth compass read

    How to convert the X,Y,Z values to 0-360 compass heading read?

    Do I need to calibrate the BMM150 to improve the readout values?


    I set the following configuration using i2c:


    Register 0x4B Value 0x01 (Power)

    Register 0x4E Value 0x87 (Enable Data Ready bit)

    Register 0x4E Value 0x4C(Normal mode)


    Reading  sequnse + parsing raw data:

    When Data Ready Status bit is 1 read 6 byte from register 42 into buffer 

    x_raw[0] = (buffer[1] << 5) | (buffer[0] >> 3); // x
    y_raw[1] = (buffer[3] << 5) | (buffer[2] >> 3); // y

    xyHeading = atan2(x_raw[0], y_raw[1]);

    if(xyHeading < 0)
        xyHeading += 2*PI;
    if(xyHeading > 2*PI)
        xyHeading -= 2*PI;

    deg = xyHeading * 180/PI;

    I getting the same problem with every read call and the deg is alyaws 45 degrees regardless  the location of the sensor in space.

    Appreciate any help

    1 REPLY 1
    Community Moderator

    Re: Reading BMM150 head


    Thanks for your inquiry.

    If you want to implement an eCompass in 3D space, then you need a 3-axis accelerometer to work with BMM150. If you only rotate the eCompass on a flat leveled surface in 2D, then you don't need the accel.

    For 2D eCompass, you can do the following:

    (1) Get BMM150 x/y/z values in the unit of uT from the API source code online at Or you can refer to the attached "bmm150-step-by-step-temperature-compensation-sample.pdf" about how to convert BMM150 raw signed integers to uT values.

    (2) After you get BMM150 x/y/z values in the unit of uT, then you can rotate your device clockwise or counterclockwise a few rounds slowly to collect BMM150 data.

    (3) Then you can plot BMM150 x/y data in x-y plane. It should look like a circle shifted from the origin. Now you can determine the offset x0 and y0 so that you cam move the shifted circle to the center.

    (4) Now you can use your formula below every time when you get the new BMM150 x/y/z data in the unit of uT:

    xyHeading = atan2[(x_raw-x0), (y_raw-y0);

    if(xyHeading < 0)
    xyHeading += 2*PI;
    if(xyHeading > 2*PI)
    xyHeading -= 2*PI;

    deg = xyHeading * 180/PI;

    For 3D space tilt compensated eCompass, you can find a lot of articles online about how to do it.