Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

大きさ

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

その疑問にはドキュメントが答えてくれます。

セクション 2.1 センサー特性 - 10 ページ - LSM303DLHC データシート

そのページの表には、GN ビットの値に応じて異なる値を持つ magnetic gain setting が示されています。デフォルトでは、それらの GN ビットは 001 に設定されています。これは、X 軸と Y 軸の magnetic gain が 1100 LSB / Gauss であり、Z 軸の magnetic gain が 980 LSB / Gauss であることを意味します。LSB は Least Significant Bits の略で、1100 LSB / Gauss という数値は、1100 の読み取り値が 1 Gauss に相当し、2200 の読み取り値が 2 Gauss に相当し、以下同様であることを示しています。

したがって、必要なのは、センサーが出力する X、Y、Z の値を、それぞれ対応する gain で割ることです。そうすれば、磁場の 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 の大きさが見えます。

いくつか質問です。

ボードを動かさない状態で、どのような値が見えますか? 常に同じ値が見えますか?

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