磁場の大きさ
これまで磁場の向きについて見てきましたが、実際の大きさはどうでしょうか。ドキュメンテーションによると、mag_data()
関数から得られるx
y
z
の値の単位はナノテスラです。ということは、磁場の大きさをナノテスラで表すにはx
y
z
で表される三次元ベクトルの大きさを計算するだけでいいのです。学校で教わったことをおぼえているかもしれませんね。こう計算します。
#![allow(unused)] fn main() { // この関数もcoreには含まれていないので、atan2fでそうしたようにlibmを使います。 use libm::sqrtf; let magnitude = sqrtf(x * x + y * y + z * z); }
これをプログラムに落とし込みます。
#![deny(unsafe_code)] #![no_main] #![no_std] use cortex_m_rt::entry; use panic_rtt_target as _; use rtt_target::{rprintln, rtt_init_print}; mod calibration; use crate::calibration::calc_calibration; use crate::calibration::calibrated_measurement; use libm::sqrtf; use microbit::{display::blocking::Display, hal::Timer}; #[cfg(feature = "v1")] use microbit::{hal::twi, pac::twi0::frequency::FREQUENCY_A}; #[cfg(feature = "v2")] use microbit::{hal::twim, pac::twim0::frequency::FREQUENCY_A}; use lsm303agr::{AccelOutputDataRate, Lsm303agr, MagOutputDataRate}; #[entry] fn main() -> ! { rtt_init_print!(); let board = microbit::Board::take().unwrap(); #[cfg(feature = "v1")] let i2c = { twi::Twi::new(board.TWI0, board.i2c.into(), FREQUENCY_A::K100) }; #[cfg(feature = "v2")] let i2c = { twim::Twim::new(board.TWIM0, board.i2c_internal.into(), FREQUENCY_A::K100) }; let mut timer = Timer::new(board.TIMER0); let mut display = Display::new(board.display_pins); let mut sensor = Lsm303agr::new_with_i2c(i2c); sensor.init().unwrap(); sensor.set_mag_odr(MagOutputDataRate::Hz10).unwrap(); sensor.set_accel_odr(AccelOutputDataRate::Hz10).unwrap(); let mut sensor = sensor.into_mag_continuous().ok().unwrap(); let calibration = calc_calibration(&mut sensor, &mut display, &mut timer); rprintln!("Calibration: {:?}", calibration); rprintln!("Calibration done, entering busy loop"); loop { while !sensor.mag_status().unwrap().xyz_new_data {} let mut data = sensor.mag_data().unwrap(); data = calibrated_measurement(data, &calibration); let x = data.x as f32; let y = data.y as f32; let z = data.z as f32; let magnitude = sqrtf(x * x + y * y + z * z); rprintln!("{} nT, {} mG", magnitude, magnitude/100.0); } }
このプログラムは磁場の大きさをナノテスラ(nT
)とミリガウス(mG
)で表示します。地球の磁場の大きさは (地理的な場所によって)250 mG
から 650 mG
の範囲に収まります。ですからあなたが測定する値も、その範囲に収まるか、範囲に近いものであるはずです。ちなみに筆者のところでは340 mG
です。
質問:
ボードを動かさないとき、値はどうなっていますか? いつも同じ値ですか?
ボードを回転させるとき、大きさは変化しますか? 変化するべきでしょうか?