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 嵌入式开发
66KB
802 行
Adafruit NXP 传感器驱动程序
这是一个用于Adafruit Precision NXP 9-DOF 开发板 - FXOS8700 + FXAS21002C的驱动程序。它基于Adafruit提供的C++库,为FXAS21002C和FXOS8700。
基于embedded_hal
的驱动程序,通过i2c访问Adafruit芯片。它提供了一个基本的接口来获取传感器的原始和缩放数据。所有3个传感器都分别在其自己的结构中,分别是Accelerometer
、Magnetometer
和Gyroscope
。
校准
您可能需要校准加速度计和陀螺仪并提供偏移量 -> 检查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