大きさ

磁場の方向を取り扱ってきましたが、実際の大きさはどうなのでしょうか? magnetic_field関数が報告する数字は、単位がありません。どのようにしてこの値をガウスに変換するのでしょうか?

ドキュメントがその質問に答えます。

Section 2.1 Sensor characteristics - Page 10 - LSM303DLHC Data Sheet

上記ページの表は、GNビットの値に応じて、異なる値を取る磁気のゲイン設定を説明しています。 デフォルトでは、GNビットは001に設定されています。これは、XとY軸の磁気ゲインは、1100 LSB / Gaussであることを意味います。 そして、Z軸の磁気ゲインは、980 LSB / Gaussです。 LSBは、Least Significant Bitsを意味しており、1100 LSB / Gaussは、11001 Gaussと等価であり、 22002 Gaussと等価である、ということを意味しています。

つまり、センサ出力のX、Y、Zの値を、対応するゲインで除算することが必要です。 すると、X、Y、Z要素の磁場のガウスが計算できます。

いくつか追加で計算することで、X、Y、Zの要素から磁場の大きさを取得できます。

#![allow(unused)]
fn main() {
let magnitude = (x * x + y * y + z * z).sqrt();
}

これらをプログラムにまとめます。

#![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);
    }
}

このプログラムは、磁場の大きさ(強さ)をミリガウス(mG)単位で報告します。 地球磁場の大きさは、250 mGから650 mGの範囲になります(この大きさは、地理的な場所によって変化します)。 そのため、この範囲内か、範囲に近い値が観測できるはずです。私は、約210 mGの大きさを観測しました。

いくつかの質問:

ボードを動かさずに、どのような値を観測しましたか?常に同じ値ですか?

ボードを回転すると、大きさは変化しますか?変化すべきですか?