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

センサーを初期化する

センサーを初期化しましょう。そのために、まず embassy-nrf と BSP クレートを使用して I2C インターフェースを作成します。I2C インターフェースを生成したら、それを Lsm303agr ドライバーに渡してセンサーを初期化します。

必要な import を追加します:

#![allow(unused)]
fn main() {
use embassy_nrf::{self as hal, twim::Twim};
use hal::twim;
use lsm303agr::Lsm303agr;
}

マスターモードの Two Wire Interface (TWIM)

embassy-nrf クレートが提供する I2C 互換の TWIM ドライバーを初期化します。このペリフェラルにより、nRF プロセッサーは I2C マスターとして動作し、LSM303AGR センサーのようなデバイスと通信できます。

Twim インスタンスを作成します。これには、I2C ペリフェラル (TWISPI0)、割り込みハンドラー (Irqs)、I2C ピン (SDA と SCL)、および設定 (ここではデフォルトのまま使用します) が必要です。

#![allow(unused)]
fn main() {
static RAM_BUFFER: ConstStaticCell<[u8; 16]> = ConstStaticCell::new([0; 16]);
let twim_config = twim::Config::default();
let twim0 = Twim::new(
    board.twispi0,
    Irqs, 
    board.i2c_int_sda, // 内部 I2C SDA、GPIO ピン: P0_08
    board.i2c_int_scl, // 内部 I2C SCL、GPIO ピン: P0_08
    twim_config,
    RAM_BUFFER.take(),
);
}

最後のパラメーターは、TWIM ドライバーがデータ送信時に使用する RAM バッファーです。データがフラッシュメモリに保存されている場合 (コード内に記述した固定のバイト配列など)、それを I2C 経由で直接送信することはできません。ドライバーはまずこのバッファーを使ってそのデータを RAM にコピーします。ConstStaticCell を使用して RAM 上に安全にバッファーを作成し、.take() でそれに安全にアクセスできます。16 バイトのバッファーは、センサーとの通信のような一般的な I2C タスクには通常十分です。RAM バッファーが送信対象のデータを保持するには小さすぎる場合、TWIM ドライバーは panic し、RAMBufferTooSmall エラーを返します。

Lsm303agr ドライバー

TWIM が初期化されたら、それを Lsm303agr::new_with_i2c 関数に渡せます。この関数は、指定した I2C インターフェースを使用してセンサードライバーの新しいインスタンスを作成します。

#![allow(unused)]
fn main() {
let mut sensor = Lsm303agr::new_with_i2c(twim0);
}