第二弾
今回は、磁力計のX、Y軸から、数学を使って磁場の正確な角度を求めます。
atan2
関数を使用します。この関数は、-PI
からPI
の範囲で角度を返します。
下図は、どのように角度が測定されるか、を示しています。
図内で明示的に示されていませんが、X軸は右を向いており、Y軸は上を向いています。
スターターコードは次の通りです。ラジアンのtheta
は既に計算されています。
theta
の値を基に、どのLEDを点灯するか、を選ばなければなりません。
#![deny(unsafe_code)] #![no_main] #![no_std] // これが便利だと気づくでしょう ;-) use core::f32::consts::PI; #[allow(unused_imports)] use aux15::{entry, iprint, iprintln, prelude::*, switch_hal::OutputSwitch, Direction, I16x3}; // this trait provides the `atan2` method use m::Float; #[entry] fn main() -> ! { let (leds, mut lsm303dlhc, mut delay, _itm) = aux15::init(); let mut leds = leds.into_array(); loop { let I16x3 { x, y, .. } = lsm303dlhc.mag().unwrap(); let _theta = (y as f32).atan2(x as f32); // ラジウス // FIXME `theta`を基に、指す方向を選んで下さい let dir = Direction::Southeast; leds.iter_mut().for_each(|led| led.off().unwrap()); leds[dir as usize].on().unwrap(); delay.delay_ms(100_u8); } }
提案/ヒント:
- 円全体の回転角は、360度です。
PI
ラジアンは180度です。theta
がゼロの場合、どのLEDを点灯しますか?- 代わりに、
theta
がゼロに非常に近い場合、どのLEDを点灯しますか? theta
が増え続けた場合、どの値で別のLEDを点灯しますか?