Magnitude
We have been working with the direction of the magnetic field but what's its real magnitude? The
number that the magnetic_field
function reports are unit-less. How can we convert those values to
Gauss?
The documentation will answer that question.
Section 2.1 Sensor characteristics - Page 10 - LSM303DLHC Data Sheet
The table in that page shows a magnetic gain setting that has different values according to the
values of the GN bits. By default, those GN bits are set to 001
. That means that magnetic gain of
the X and Y axes is 1100 LSB / Gauss
and the magnetic gain of the Z axis is 980 LSB / Gauss
. LSB
stands for Least Significant Bits and the 1100 LSB / Gauss
number indicates that a reading of
1100
is equivalent to 1 Gauss
, a reading of 2200
is equivalent to 2 Gauss
and so on.
So, what we need to do is divide the X, Y and Z values that the sensor outputs by its corresponding gain. Then, we'll have the X, Y and Z components of the magnetic field in Gauss.
With some extra math we can retrieve the magnitude of the magnetic field from its X, Y and Z components:
#![allow(unused)] fn main() { let magnitude = (x * x + y * y + z * z).sqrt(); }
Putting all this together in a program:
#![deny(unsafe_code)] #![no_main] #![no_std] #[allow(unused_imports)] use aux15::{entry, iprint, iprintln, prelude::*, I16x3}; use m::Float; #[entry] fn main() -> ! { const XY_GAIN: f32 = 1100.; // LSB / G const Z_GAIN: f32 = 980.; // LSB / G let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init(); loop { let I16x3 { x, y, z } = lsm303dlhc.mag().unwrap(); let x = f32::from(x) / XY_GAIN; let y = f32::from(y) / XY_GAIN; let z = f32::from(z) / Z_GAIN; let mag = (x * x + y * y + z * z).sqrt(); iprintln!(&mut itm.stim[0], "{} mG", mag * 1_000.); delay.delay_ms(500_u16); } }
This program will report the magnitude (strength) of the magnetic field in milligauss (mG
). The
magnitude of the Earth's magnetic field is in the range of 250 mG
to 650 mG
(the magnitude
varies depending on your geographical location) so you should see a value in that range or close to
that range -- I see a magnitude of around 210 mG.
Some questions:
Without moving the board, what value do you see? Do you always see the same value?
If you rotate the board, does the magnitude change? Should it change?