#磁力计 #陀螺仪 #加速度计 #嵌入式HAL驱动 #温度传感器

无需std lsm9ds1

一个与LSM9DS1 3D加速度计、3D陀螺仪、3D磁力计传感器模块交互的平台无关的驱动程序

1个不稳定版本

0.1.0 2020年3月17日

#864嵌入式开发

MIT 许可证

58KB
1K SLoC

lsm9ds1

一个与LSM9DS1 3D加速度计、3D陀螺仪、3D磁力计传感器模块交互的平台无关的驱动程序。

此库正在开发中。并非所有功能都已实现。欢迎贡献。

功能

  • 与加速度计/陀螺仪的SPI通信
  • 与磁力计的SPI通信
  • 与温度传感器的SPI通信
  • 与加速度计/陀螺仪的I2C通信
  • 与磁力计的I2C通信
  • 与温度传感器的I2C通信
  • 自定义传感器设置
  • 传感器读取(加速度计、陀螺仪、磁力计、温度)
  • 原始传感器读取(加速度计、陀螺仪、磁力计)请参阅 read_sensor_raw()
  • 校准
  • 中断
  • FIFO模式

用法

概述

  1. 使用 LSM9DS1Init 配置传感器设置。
  2. 初始化通信接口:可以是 SpiInterfaceI2cInterface
  3. 使用您选择的接口初始化 LSM9DS1 驱动程序。
  4. 启动传感器。
  5. 获取传感器的读数。

传感器设置

此驱动程序使用 LSM9DS1Init 结构来设置传感器配置。

pub struct LSM9DS1Init {
    pub accel: AccelSettings,
    pub gyro: GyroSettings,
    pub mag: MagSettings,
}

您可以在 accel.rsgyro.rsmag.rs 中找到每个传感器的默认设置。

加速度计默认设置

impl Default for AccelSettings {
    fn default() -> Self {
        AccelSettings {
            enable_x: true,
            enable_y: true,
            enable_z: true,
            sample_rate: ODR::_119Hz,
            scale: Scale::_2G,
            bandwidth_selection: BandwidthSelection::ByODR,
            bandwidth: Bandwidth::_408Hz,
            high_res_bandwidth: HighRes::Disabled,
        }
    }
}

陀螺仪默认设置

impl Default for GyroSettings {
    fn default() -> Self {
        GyroSettings {
            enable_x: true,
            enable_y: true,
            enable_z: true,
            flip_x: false,
            flip_y: false,
            flip_z: false,
            scale: Scale::_245DPS,
            sample_rate: ODR::_952Hz,
            bandwidth: Bandwidth::LPF_0,
            int_selection: GyroIntSelection::SEL_0,
            out_selection: GyroOutSelection::SEL_0,
            low_power_mode: LowPowerMode::Disabled,
            hpf_mode: HpFilter::Disabled,
            hpf_cutoff: HpFilterCutoff::HPCF_1,
            latch_interrupt: LatchInterrupt::Disabled,
        }
    }
}

磁力计默认设置

impl Default for MagSettings {
    fn default() -> Self {
        MagSettings {
            temp_compensation: TempComp::Disabled,
            x_y_performance: OpModeXY::Low,
            sample_rate: ODR::_10Hz,
            scale: Scale::_4G,
            i2c_mode: I2cMode::Enabled,
            system_op: SysOpMode::Continuous,
            low_power: LowPowerMode::Disabled,
            spi_mode: SpiMode::RW,
            z_performance: OpModeZ::Low,
        }
    }
}

如何配置设置

如果您想使用默认设置,可以这样初始化 LSM9DS1Init

LSM9DS1Init {
    ..Default::default()
}

如果您需要自定义配置,请修改与默认值不同的字段。

LSM9DS1Init {
    accel: accel::AccelSettings {
        scale: accel::Scale::_16G, // custom setting
        ..Default::default() // the rest of the fields are the default values.
    },
    ..Default::default() // gyro and mag use the default settings.
}

通信接口

LSM9DS1支持SPI和I2C通信。创建一个 SpiInterfaceI2cInterface 实例,并将其传递给 LSM9DS1Initwith_interface() 方法以创建 LSM9DS1 驱动程序的实例。

// Create SPI interface
let spi_interface = SpiInterface::init(spi, ag_cs, m_cs);
// Init LSM9DS1 driver with settings and SPI interface
let mut lsm9ds1 = LSM9DS1Init {
    ..Default::default()
}
.with_interface(spi_interface);

读取传感器

打开传感器。

lsm9ds1.begin_accel().unwrap();
lsm9ds1.begin_gyro().unwrap();
lsm9ds1.begin_mag().unwrap();

获取读数

let temp = lsm9ds1.read_temp().unwrap(); // temperature reading in celsius
let (x, y, z) = lsm9ds1.read_accel().unwrap();
let (x, y, z) = lsm9ds1.read_gyro().unwrap();
let (x, y, z) = lsm9ds1.read_mag().unwrap();

示例

此代码演示如何使用SPI接口读取传感器值。(为了简洁,省略了错误处理。)

//! Target board: STM32F3DISCOVERY
#![no_std]
#![no_main]

extern crate panic_semihosting;
pub use cortex_m::{asm::bkpt, iprint, iprintln, peripheral::ITM};
use cortex_m_rt::entry;
use embedded_hal::spi::MODE_0;
use stm32f3xx_hal as hal;

use hal::prelude::*;
use hal::spi::Spi;
use hal::stm32;

use lsm9ds1::interface::SpiInterface;
use lsm9ds1::{accel, gyro, mag, LSM9DS1Init};

#[entry]
fn main() -> ! {
    let cp = cortex_m::Peripherals::take().unwrap();
    let mut itm = cp.ITM;
    let dp = stm32::Peripherals::take().unwrap();
    let mut flash = dp.FLASH.constrain();
    let mut rcc = dp.RCC.constrain();

    // Accelerometer/Gyroscope Chip Select
    let mut gpiob = dp.GPIOB.split(&mut rcc.ahb);
    let mut ag_cs = gpiob
        .pb5
        .into_push_pull_output(&mut gpiob.moder, &mut gpiob.otyper);
    ag_cs.set_high().unwrap();

    // Magnetometer Chip Select
    let mut m_cs = gpiob
        .pb4
        .into_push_pull_output(&mut gpiob.moder, &mut gpiob.otyper);
    m_cs.set_high().unwrap();

    // SPI
    let mut gpioa = dp.GPIOA.split(&mut rcc.ahb);
    let clocks = rcc.cfgr.freeze(&mut flash.acr);
    // Configure pins for SPI
    let sck = gpioa.pa5.into_af5(&mut gpioa.moder, &mut gpioa.afrl);
    let miso = gpioa.pa6.into_af5(&mut gpioa.moder, &mut gpioa.afrl);
    let mosi = gpioa.pa7.into_af5(&mut gpioa.moder, &mut gpioa.afrl);

    let spi = Spi::spi1(
        dp.SPI1,
        (sck, miso, mosi),
        MODE_0,
        1.mhz(),
        clocks,
        &mut rcc.apb2,
    );

    // Create SPI interface
    let spi_interface = SpiInterface::init(spi, ag_cs, m_cs);
    // Init LSM9DS1 with default settings and attach SPI interface
    let mut lsm9ds1 = LSM9DS1Init {
        ..Default::default()
    }
    .with_interface(spi_interface);
	
    // start sensors
    lsm9ds1.begin_accel().unwrap();
    lsm9ds1.begin_gyro().unwrap();
    lsm9ds1.begin_mag().unwrap();

    loop {
        // read sensors
        let temp = lsm9ds1.read_temp().unwrap();
        iprintln!(&mut itm.stim[0], "temp: {}", temp);

        let (x, y, z) = lsm9ds1.read_accel().unwrap();
        iprintln!(&mut itm.stim[0], "xl: {}, {}, {}", x, y, z);

        let (x, y, z) = lsm9ds1.read_gyro().unwrap();
        iprintln!(&mut itm.stim[0], "gy: {}, {}, {}", x, y, z);

        let (x, y, z) = lsm9ds1.read_mag().unwrap();
        iprintln!(&mut itm.stim[0], "mg: {}, {}, {}", x, y, z);

        cortex_m::asm::delay(8_000_000);
    }
}

依赖项

~71KB