Categories

Arduino and BMM150 digital geomagnetic sensor example

In this article we look at a digital geomagnetic sensor – this time its the BMM150

BMM150 is a low power and low noise 3-axis digital geomagnetic sensor to be used in compass applications. The 12-pin wafer level chip scale package (WLCSP) with a footprint of 1.56 x 1.56 mm² and 0.60 mm height provides highest design flexibility to the developer of mobile devices. Applications like virtual reality or gaming on mobile devices such as mobile phones, tablet PCs or portable media players require 9-axis inertial sensing including magnetic heading information. Due to the stable performance over a large temperature range, the BMM150 is also especially suited for supporting drones in accurate heading.

BMM150 can be used with an inertial measurement unit (IMU) consisting of a 3-axis accelerometer and a 3-axis gyroscope like Bosch Sensortec’s BMI055.

 

Features

ParameterTechnical data
PackageCSWLP- (12 pin)
1.56×1.56×0.6 mm³
0.4 mm diagonal ball pitch
Temperature range-40°C … +85°C
Digital interfacesI²C and SPI
(2 interrupt pins)
Resolution0.3μT
Supply voltageVDD: 1.62V to 3.6V
VDDIO: 1.2V to 3.6V
Zero-B offset±50μT
Non-linearity<1% FS
Magnetic range typ.±1300μT (x,y-axis)
±2500μT (z-axis)
Average current consumption170 μA (low power preset)
500 μA (normal mode)
InterruptsNew data, magnetic threshold high / low

Parts Required

 

NameLink
Arduino UnoUNO R3 CH340G/ATmega328P, compatible for Arduino UNO
BMM150BMM150 Geomagnetic Sensor Breakout Board
Connecting wireFree shipping Dupont line 120pcs 20cm male to male + male to female and female to female jumper wire
sensor shieldExpansion IO Board Sensor Shield

Schematic/Connection

 

arduino and BMM150

arduino and BMM150

 

Code Example

This uses the library from https://github.com/Seeed-Studio/Grove_3_Axis_Compass_V2.0_BMM150

#include <Arduino.h>
#include <Wire.h>
// libraries
#include "bmm150.h"
#include "bmm150_defs.h"
BMM150 bmm = BMM150();
void setup()
{
Serial.begin(9600);
if(bmm.initialize() == BMM150_E_ID_NOT_CONFORM) {
Serial.println("Chip ID can not read!");
while(1);
} else {
Serial.println("Initialize done!");
}
}
void loop()
{
bmm150_mag_data value;
bmm.read_mag_data();
value.x = bmm.raw_mag_data.raw_datax;
value.y = bmm.raw_mag_data.raw_datay;
value.z = bmm.raw_mag_data.raw_dataz;
float xyHeading = atan2(value.x, value.y);
float zxHeading = atan2(value.z, value.x);
float heading = xyHeading;
if(heading < 0)
heading += 2*PI;
if(heading > 2*PI)
heading -= 2*PI;
float headingDegrees = heading * 180/M_PI;
float xyHeadingDegrees = xyHeading * 180 / M_PI;
float zxHeadingDegrees = zxHeading * 180 / M_PI;
Serial.print("Heading: ");
Serial.println(headingDegrees);
delay(100);
}

 

Output

Open the serial monitor and you should see something like this – the results would have been more interesting if I moved the sensor but I was checking the stability

Heading: 261.09
Heading: 262.21
Heading: 261.05
Heading: 260.50
Heading: 260.42
Heading: 260.13
Heading: 260.81
Heading: 259.46

 

Links

https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMM150-DS001.pdf

https://github.com/BoschSensortec/BMM150-Sensor-API

 

Share

Leave a Reply