Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

重力は上向き?

最初に何をするのでしょうか?

サニティチェックを実行します!

スターターコードは、加速度計によって測定された加速度の 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();

    // extend sensing range to `[-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 console
(..)
(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 軸に揃えて試してみることはできますが、加速度計が測定する加速度は常に上を向いています。

ここで起きているのは、加速度計が測定しているのが、あなたが観測している加速度ではなく、 ボードの 固有加速度 だということです。この固有加速度とは、自由落下している観測者から見た ボードの加速度です。自由落下している観測者は、1g の加速度で地球の中心に向かって移動しています。 その観測者の視点では、ボードは実際には 1g の加速度で上向きに(地球の中心から遠ざかる方向に) 動いています。これが、固有加速度が上を向く理由です。これはまた、もしボードが自由落下していたなら、 加速度計は固有加速度をゼロと報告する、ということも意味します。お願いですから、家では試さないでください。

はい、物理は難しいですね。先に進みましょう。