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 ルーチンを実行していますが、X、Y、Z の値をタプルではなく I16x3 構造体で返します。
今いる場所で北がどちらにあるかを確認してください。次に、基板が「北向き」にそろうように回転させます。North 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 度回転させてください。どのような値が表示されますか?