大きさ
これまでは磁場の方向を扱ってきましたが、その実際の大きさはどれくらいなのでしょうか? 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 の大きさが見えます。
いくつか質問です。
ボードを動かさない状態で、どのような値が見えますか? 常に同じ値が見えますか?
ボードを回転させると、大きさは変化しますか? 変化するべきでしょうか?