1个不稳定版本
0.1.0 | 2020年3月17日 |
---|
#864 在 嵌入式开发
58KB
1K SLoC
lsm9ds1
一个与LSM9DS1 3D加速度计、3D陀螺仪、3D磁力计传感器模块交互的平台无关的驱动程序。
此库正在开发中。并非所有功能都已实现。欢迎贡献。
功能
- 与加速度计/陀螺仪的SPI通信
- 与磁力计的SPI通信
- 与温度传感器的SPI通信
- 与加速度计/陀螺仪的I2C通信
- 与磁力计的I2C通信
- 与温度传感器的I2C通信
- 自定义传感器设置
- 传感器读取(加速度计、陀螺仪、磁力计、温度)
- 原始传感器读取(加速度计、陀螺仪、磁力计)请参阅
read_sensor_raw()
。 - 校准
- 中断
- FIFO模式
用法
概述
- 使用
LSM9DS1Init
配置传感器设置。 - 初始化通信接口:可以是
SpiInterface
或I2cInterface
。 - 使用您选择的接口初始化
LSM9DS1
驱动程序。 - 启动传感器。
- 获取传感器的读数。
传感器设置
此驱动程序使用 LSM9DS1Init
结构来设置传感器配置。
pub struct LSM9DS1Init {
pub accel: AccelSettings,
pub gyro: GyroSettings,
pub mag: MagSettings,
}
您可以在 accel.rs
、gyro.rs
和 mag.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通信。创建一个 SpiInterface
或 I2cInterface
实例,并将其传递给 LSM9DS1Init
的 with_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