大きさ
磁場の方向を取り扱ってきましたが、実際の大きさはどうなのでしょうか?
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
は、1100
が1 Gauss
と等価であり、
2200
は2 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の大きさを観測しました。
いくつかの質問:
ボードを動かさずに、どのような値を観測しましたか?常に同じ値ですか?
ボードを回転すると、大きさは変化しますか?変化すべきですか?