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度回転します。値はどうなりましたか?