重力は上を向いている?

まず最初にやることはなんでしょうか?

正当性を検証します!

スターターコードは、加速度計で計測した加速度のX、Y、Z要素を表示します。 値はすでに「スケール」されており、その単位はgです。ここで、1 gは重力加速度と等しく、約9.8メートル毎秒毎秒です。

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

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

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

    // 計測範囲を`-12g, +12g]に拡張しています
    lsm303dlhc.set_accel_sensitivity(Sensitivity::G12).unwrap();
    loop {
        const SENSITIVITY: f32 = 12. / (1 << 14) as f32;

        let I16x3 { x, y, z } = lsm303dlhc.accel().unwrap();

        let x = f32::from(x) * SENSITIVITY;
        let y = f32::from(y) * SENSITIVITY;
        let z = f32::from(z) * SENSITIVITY;

        iprintln!(&mut itm.stim[0], "{:?}", (x, y, z));

        delay.delay_ms(1_000_u16);
    }
}

ボードが静止している状態で、このプログラムの出力は、次のようになります。

$ # itmdumpコンソール
(..)
(0.0, 0.0, 1.078125)
(0.0, 0.0, 1.078125)
(0.0, 0.0, 1.171875)
(0.0, 0.0, 1.03125)
(0.0, 0.0, 1.078125)

これは変です。ボードは動いていないのに、加速度がゼロではありません。何が起こっているのでしょう? これは、重力と関係しているに違いありません。重力加速度は1 gだからです。 しかし、重力は物体を下に引っ張ります。そのため、Z軸の加速度は、正数ではなく負数でなければなりません・・・。

このプログラムはZ軸を逆方向に取得しているのでしょうか?いいえ、ボードを回転させて、重力をX軸もしくはY軸に合わせることができますが、 加速度センサで測定された加速度は常に上を向いています。

発生している現象は、加速度計はあなたが観測している加速度ではなく、ボードのproper accelerationを測定している、ということです。 このproper accelerationとは、自由落下中の観測者から見たボードの加速度です。自由落下中の観測者は、地球の中心部に向かって、1gの加速度で移動しています。 この観点から見ると、ボードは上に向かって(地球の中心部から離れて)、1gの加速度で動いています。 そして、これがproper accelerationが上に向いている理由です。 これはボードが自由落下していると、加速度計はゼロのproper accelerationを報告する、ということを意味します。 家では試さないようにして下さい。

物理は難しいです。次へ進みましょう。