LEDコンパス

このセクションでは、F3のLEDを使ったコンパスを実装します。通常のコンパスのように、LEDコンパスは、どうにかして北を向かなければなりません。 これは、8個のLEDの1つを点灯することで達成します。点灯しているLEDが北の方法を指します。

磁場は、ガウスまたはテスラで測定された大きさと、方向の両方を持ちます。 F3の磁力計は、外部磁界の大きさと方向とを測定します。しかし、ボードの軸に沿って磁場を分解したものを報告します。

下記の通り、磁力計は関連する3つの軸を持ちます。

上図では、XとY軸だけが描かれています。Z軸は、スクリーンの「外」を向いています。

次のスターターコードを実行して、磁力計の読み取り方に詳しくなりましょう。

#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux15::{entry, iprint, iprintln, prelude::*};

#[entry]
fn main() -> ! {
    let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init();

    loop {
        iprintln!(&mut itm.stim[0], "{:?}", lsm303dlhc.mag().unwrap());
        delay.delay_ms(1_000_u16);
    }
}

このlsm303dlhcモジュールは、LSM303DLHCの高レベルなAPIを提供します。内部では、前回のセクションで実装したI2Cルーチンと同じことをやっています。 しかし、このモジュールは、タプルの代わりにI16x3構造体でX、Y、Zの値を報告します。

現在地の北がどこにあるかを探します。その後、ボードを「北に向かって」いるように回転させます。 北のLED(LD3)が北を向いているはずです。

ここで、スターターコードを実行し、その出力を観察します。X、Y、Zの値はどのようなっていますか?

$ # itmdump terminal
(..)
I16x3 { x: 45, y: 194, z: -3 }
I16x3 { x: 46, y: 195, z: -8 }
I16x3 { x: 47, y: 197, z: -2 }

次に、地面と平行に保ちながら、ボードを90度回転します。今回は、X、Y、Zの値はどうなりましたか? さらに90度回転します。値はどうなりましたか?