第二弾

今回は、磁力計の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を点灯しますか?