コンテンツにスキップ

lsm303agr — Crate 詳細

lsm303agr

Stable no_std

STMicroelectronics LSM303AGR 向けのプラットフォーム非依存 Rust ドライバ。embedded-hal による I2C/SPI 接続で、3軸加速度・3軸地磁気・温度・FIFO・割り込み設定などを扱えます。

Platform-agnostic Rust driver for the STMicroelectronics LSM303AGR 3-axis accelerometer and 3-axis magnetometer using embedded-hal traits, with optional embedded-hal-async support.

概要

lsm303agr は、STMicroelectronics の LSM303AGR 3軸加速度センサ + 3軸地磁気センサ向け Rust ドライバです。embedded-hal trait を使うため、I2C/SPI を実装する HAL と組み合わせて、micro:bit v2、Linux SBC、各種 Cortex-M ボードなどで利用できます。

主な機能

  • I2C/SPI 接続によるセンサ制御
  • デバイス初期化
  • 加速度データ読み出し
  • 加速度ステータス確認
  • 加速度モード / ODR / スケール設定
  • 温度センサステータス確認と温度読み出し
  • FIFO 設定
  • 加速度側割り込みの有効 / 無効化
  • 地磁気ステータス確認
  • 地磁気センサの連続測定 / ワンショット測定
  • 地磁気データ読み出し
  • 地磁気モード / ODR 設定
  • 地磁気オフセットキャンセル
  • 地磁気ローパスフィルタ設定
  • async feature による embedded-hal-async 対応

設計上の位置づけ

この crate はセンサ固有のレジスタ操作を隠蔽するデバイスドライバです。BSP や HAL の責務である I2C/SPI ペリフェラル初期化は扱わず、アプリケーション側から渡された embedded-hal 実装を使って LSM303AGR を操作します。

注意点

  • センサ値を安定して扱うには、ODR、スケール、電源モード、地磁気補正、キャリブレーションをアプリケーション要件に合わせて設計する必要があります。
  • 地磁気センサを方位計として使う場合、ハードアイアン / ソフトアイアン補正や傾斜補正が別途必要になることがあります。
  • async feature を使う場合は、使用する HAL 側も embedded-hal-async に対応している必要があります。
バージョン
1.1.0
ライセンス
MIT OR Apache-2.0
メンテナンス
受動的メンテナンス

コード例

Linux の /dev/i2c-1 に接続された LSM303AGR を I2C 経由で初期化し、加速度の新規データがある場合に mg 単位で表示します。

Linux I2C で初期化して加速度を読む
use linux_embedded_hal::{Delay, I2cdev};
use lsm303agr::{AccelMode, AccelOutputDataRate, Lsm303agr};
fn main() {
let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Lsm303agr::new_with_i2c(dev);
sensor.init().unwrap();
sensor
.set_accel_mode_and_odr(&mut Delay, AccelMode::Normal, AccelOutputDataRate::Hz10)
.unwrap();
loop {
if sensor.accel_status().unwrap().xyz_new_data() {
let data = sensor.acceleration().unwrap();
println!(
"Acceleration: x {} mg y {} mg z {} mg",
data.x_mg(),
data.y_mg(),
data.z_mg()
);
}
}
}

地磁気センサを連続測定モードに設定し、新規データがある場合に nT 単位で表示します。

磁気センサを連続測定モードにして読む
use linux_embedded_hal::I2cdev;
use lsm303agr::{Lsm303agr, MagMode, MagOutputDataRate};
fn main() {
let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Lsm303agr::new_with_i2c(dev);
sensor.init().unwrap();
sensor
.set_mag_mode_and_odr(MagMode::Continuous, MagOutputDataRate::Hz10)
.unwrap();
loop {
if sensor.mag_status().unwrap().xyz_new_data() {
let field = sensor.magnetic_field().unwrap();
println!(
"Magnetic field: x {} nT y {} nT z {} nT",
field.x_nt(),
field.y_nt(),
field.z_nt()
);
}
}
}

関連 Crates