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 設定
- 地磁気オフセットキャンセル
- 地磁気ローパスフィルタ設定
asyncfeature によるembedded-hal-async対応
設計上の位置づけ
この crate はセンサ固有のレジスタ操作を隠蔽するデバイスドライバです。BSP や HAL の責務である I2C/SPI ペリフェラル初期化は扱わず、アプリケーション側から渡された embedded-hal 実装を使って LSM303AGR を操作します。
注意点
- センサ値を安定して扱うには、ODR、スケール、電源モード、地磁気補正、キャリブレーションをアプリケーション要件に合わせて設計する必要があります。
- 地磁気センサを方位計として使う場合、ハードアイアン / ソフトアイアン補正や傾斜補正が別途必要になることがあります。
asyncfeature を使う場合は、使用する HAL 側もembedded-hal-asyncに対応している必要があります。
コード例
Linux の /dev/i2c-1 に接続された LSM303AGR を I2C 経由で初期化し、加速度の新規データがある場合に mg 単位で表示します。
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() ); } }}