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

加速度センサーの値を出力する

センサーインスタンスに対して「init」関数を呼び出します。これによりレジスタが初期化され、加速度センサーが読み取り可能な状態に準備されます。

#![allow(unused)]
fn main() {
sensor.init().await.unwrap();
}

動作モードと出力データレート(ODR)の設定

次に、加速度センサーの動作モードと出力データレート(ODR)を設定します。

データシート(27 ページ)で説明されているとおり、LSM303AGR は加速度センサーの 3 つの動作モード、高分解能モード、ノーマルモード、低消費電力モードをサポートしています。

高分解能モードは、12 ビットの分解能で最も高い測定精度を提供します。このモードは、動きや傾きの小さな変化に対して非常に敏感であるため、精度が重要なアプリケーションに適しています。ただし、この精度向上の代償として、他のモードと比べて消費電力は高くなります。

**出力データレート(ODR)**は、センサーが新しい加速度データをどの程度の頻度で提供するかを決定します。ODR を 50 Hz に設定すると、センサーは 1 秒間に 50 回読み取り値を更新します。このレートは、歩行、傾き、ジェスチャーの検出といった人間スケールの動作の大半に対して十分な応答性を持ちながら、消費電力を比較的低く抑えられます。

#![allow(unused)]
fn main() {
 sensor
    .set_accel_mode_and_odr(
        &mut Delay,
        AccelMode::HighResolution,
        AccelOutputDataRate::Hz50,
    )
    .await
    .unwrap();
}

50 Hz の出力データレートでは、起動時間は約 7 ms で、高分解能モードでの消費電流は約 12.6 µA です。50 Hz の ODR と高分解能モードを選ぶことで、精度とエネルギー効率のバランスが良い構成になります。これにより、プロセッサーに過度な負荷をかけたりバッテリーを急速に消耗したりすることなく、システムは詳細な動作情報を取得できます。

値を読み取る

ループ内では、スニペット sensor.accel_status().await.unwrap().xyz_new_data() を使って、新しい加速度センサーの読み取り値が利用可能かどうかを確認します。 「accel_status」関数は加速度センサーのステータスレジスタを読み取り、「xyz_new_data」関数はそのレジスタ内の特定のフラグを確認して、X、Y、Z の 3 軸すべてについて新しいデータが利用可能かどうかを判定します。

新しいデータが利用可能であれば、「acceleration」関数を使って最新の X、Y、Z の値を取得します。これらの値はその後、生のセンサーデータからミリ重力(mg)に変換されます。

完全なコード

以下は、これらをすべてまとめた完全なコードです。

#![no_std]
#![no_main]

use embassy_nrf::{self as hal, twim::Twim};
use hal::twim;

use defmt_rtt as _;
use embassy_executor::Spawner;
use embassy_time::{Delay, Timer};
use lsm303agr::{AccelMode, AccelOutputDataRate, Lsm303agr};
use microbit_bsp::Microbit;
use static_cell::ConstStaticCell;
use {defmt_rtt as _, panic_probe as _};

hal::bind_interrupts!(struct Irqs {
    TWISPI0 => twim::InterruptHandler<hal::peripherals::TWISPI0>;
});

#[embassy_executor::main]
async fn main(_spawner: Spawner) -> ! {
    let board = Microbit::default();

    let twim_config = twim::Config::default();
    static RAM_BUFFER: ConstStaticCell<[u8; 16]> = ConstStaticCell::new([0; 16]);

    let twim0 = Twim::new(
        board.twispi0,
        Irqs,
        board.i2c_int_sda,
        board.i2c_int_scl,
        twim_config,
        RAM_BUFFER.take(),
    );

    let mut sensor = Lsm303agr::new_with_i2c(twim0);
    sensor.init().await.unwrap();
    sensor
        .set_accel_mode_and_odr(
            &mut Delay,
            AccelMode::HighResolution,
            AccelOutputDataRate::Hz50,
        )
        .await
        .unwrap();

    loop {
        if sensor.accel_status().await.unwrap().xyz_new_data() {
            let data = sensor.acceleration().await.unwrap();
            // ミリ重力(mg)値
            let x = data.x_mg();
            let y = data.y_mg();
            let z = data.z_mg();
            defmt::info!("x:{}, y:{}, z:{}", x, y, z);
        }
        Timer::after_secs(1).await;
    }
}

既存のプロジェクトをクローンする

私が作成したプロジェクトをクローンする(または参照する)こともでき、bsp-embassy/accelerometer-print フォルダーへ移動できます。

git clone https://github.com/ImplFerris/microbit-projects
cd microbit-projects/bsp-embassy/accelerometer-print

実行

プログラムを micro:bit に書き込むと、コンピューター上に読み取り値が表示されるはずです

cargo run

ボードの向きを変えたり、振ったり、さまざまな方向に傾けたりしてみてください。ボードの動きに応じて X、Y、Z の値が変化するのが分かります。