#adafruit #no-std #fxos8700 #fxas21002c

no-std adafruit_nxp

Adafruit Precision NXP 9-DOF 开发板驱动 - FXOS8700 + FXAS21002 模块

4个版本

0.1.3 2022年7月27日
0.1.2 2022年7月8日
0.1.1 2022年7月8日
0.1.0 2022年7月4日

#655 in 嵌入式开发


用于 datafusion_imu

0BSD 许可证

66KB
802

Adafruit NXP 传感器驱动程序

made-with-rust powered-by-sii

这是一个用于Adafruit Precision NXP 9-DOF 开发板 - FXOS8700 + FXAS21002C的驱动程序。它基于Adafruit提供的C++库,为FXAS21002CFXOS8700

基于embedded_hal的驱动程序,通过i2c访问Adafruit芯片。它提供了一个基本的接口来获取传感器的原始和缩放数据。所有3个传感器都分别在其自己的结构中,分别是AccelerometerMagnetometerGyroscope

校准

您可能需要校准加速度计和陀螺仪并提供偏移量 -> 检查accel_gyro_calibration.rs示例代码或函数calibration()。对于磁力计,您可能需要计算硬铁和软铁校正。如果您想了解更多关于这些校正的信息,可以点击这里。我们不会提供任何用于这些校正的工具。但是,您可以遵循Adafruit提供的教程

更多信息

此软件包允许进行完全自定义,除了Fifo和硬件中断实现。这在未来不会实现。

要使用此驱动程序,您必须提供具体的embedded_hal实现,包括延时和I2C。

您必须能够计算时间差。例如,每个循环的执行时间。大多数示例使用Raspberry Pi出于实际原因。注意:时间差越准确,测量越准确。

未来可能会提供一个更好的ROS2示例。

用法

以下示例使用rppal软件包,并在Raspberry Pi上运行。

use rppal::hal::Delay;
use rppal::i2c::I2c;

use embedded_hal::blocking::delay::*;
use nalgebra::{Vector3, Matrix3};

use adafruit::*;

fn main() -> -> Result<(), SensorError<rppal::i2c::Error>> {

    // Init a delay used in certain functions and between each loop.
    let mut delay = Delay::new();

    // Setup the raspberry's I2C interface to create the sensor.
    let i2c = I2c::new().unwrap();

    // Create an Adafruit object.
    let mut sensor = AdafruitNXP::new(0x8700A, 0x8700B, 0x0021002C, i2c);

    // Check if the sensor is ready to go.
    let ready = sensor.begin()?;
    if !ready {
        std::eprintln!("Sensor not detected, check your wiring!");
        std::process::exit(1);
    }
    
    // If you don't want to use the default configuration.
    sensor.set_accel_range(config::AccelMagRange::Range2g)?;
    sensor.set_gyro_range(config::GyroRange::Range500dps)?;
    sensor.set_accelmag_output_data_rate(config::AccelMagODR::ODR200HZ)?;
    sensor.set_gyro_output_data_rate(config::GyroODR::ODR200HZ)?;

    // If you need more precise results you might consider adding offsets. (Values are exemples)
    sensor.accel_sensor.set_offset(-0.0526, -0.5145, 0.1439);
    sensor.gyro_sensor.set_offset(0.0046, 0.0014, 0.0003);
    let hard_iron = Vector3::new(-3.87, -35.45, -50.32);
    let soft_iron = Matrix3::new(1.002, -0.012, 0.002,
                                 -0.012, 0.974, -0.010,
                                 0.002, -0.010, 1.025);
    sensor.mag_sensor.set_hard_soft_iron(hard_iron, soft_iron);

    loop {

        sensor.read_data();

        let acc_x = sensor.accel_sensor.get_scaled_x();
        let acc_y = sensor.accel_sensor.get_scaled_y();
        let acc_z = sensor.accel_sensor.get_scaled_z();

        let gyro_x = sensor.gyro_sensor.get_scaled_x();
        let gyro_y = sensor.gyro_sensor.get_scaled_y();
        let gyro_z = sensor.gyro_sensor.get_scaled_z();

        let mag_x = sensor.mag_sensor.get_scaled_x();
        let mag_y = sensor.mag_sensor.get_scaled_y();
        let mag_z = sensor.mag_sensor.get_scaled_z();

        // Print data
        std::println!("###############################################");
        std::println!("Accel X: {}", acc_x);
        std::print!(" Accel Y: {}", acc_y);
        std::print!(" Accel Z: {}", acc_z);
        std::println!("-----------------------------------------------");
        std::println!("Gyro X: {}", gyro_x);
        std::print!(" Gyro Y: {}", gyro_y);
        std::print!(" Gyro Z: {}", gyro_z);
        std::println!("-----------------------------------------------");
        std::print!("Mag X: {}", mag_x);
        std::print!(" Mag Y: {}", mag_y);
        std::print!(" Mag Z: {}", mag_z);

        delay.delay_ms(5_u8);
    }
}

依赖项

~3.5MB
~66K SLoC