#sensor #imu #embedded-hal

nightly bhi160

Bosch Sensortec BHI160(B)智能传感器的Rust驱动程序

1个不稳定版本

0.1.0 2022年9月26日

#1968 in 嵌入式开发

自定义许可证

54KB
1K SLoC

Bosch BHI160(B) Rust驱动程序

这是Bosch Sensortec的BHI160和BHI160B智能传感器的嵌入式驱动程序。这些传感器包括6自由度IMU(3轴加速度计和3轴陀螺仪),并支持作为从机的其他传感器(例如磁力计/罗盘)。

有关更多信息,请参阅传感器的网站

此crate的开发处于非常早期阶段。

用法

您需要从这里下载您的传感器的正确固件。

然后您可以使用以下代码作为指导。请注意,此示例可能不完整,并且需要堆分配来上传固件。这是一个已知问题,并计划修复。

use bhi160::{firmware::Firmware, registers::*, parameters::*};

const FIRMWARE: &'static [u8] = include_bytes!("path/to/firmware.fw");

fn main() {
    let interface = {
        use bhi160::interface::{I2c, I2C_ADDR1};
        let i2c = /* GET PLATFORM SPECIFIC I2C INTERFACE */;
        bhi160::interface::I2c::new(i2c, I2C_ADDR1)
    };

    let mut bhi = bhi160::Bhi160::new(interface);

    // Check that the BHI is connected
    log::info!("ProductId: {:?}", bhi.read_reg::<ProductId>());
    log::info!("RevisionId: {:?}", bhi.read_reg::<RevisionId>());

    // Upload the firmware
    let firmware = Firmware::new(FIRMWARE).expect("Invalid firmware");
    let body: Vec<_> = firmware.body().collect();

    let crc = bhi.upload_raw_firmware(&body).expect("Could not upload firmware");

    assert_eq!(crc, firmware.crc());

    // Start execution
    bhi.write_register(
        ChipControl::new()
            .with_cpu_run_request(true)
            .with_host_upload_enable(false),
    ).expect("Unable to start BHI cpu");

    bhi.write_param(
        sensors::AccelerometerConfig::new()
            .with_0(sensors::SensorConfig::new().with_sample_rate(10)),
    ).expect("Unable to start accellerometer");

    let mut buf = [0; 100];
    loop {
        let fifo = Cursor::new(bhi.read_fifo(&mut buf)?);
        let packet = bhi160::packet::EventReader::new(fifo);
        for event in packet {
            match event.id() {
                SensorId::Accelerometer => {
                    if let SensorData::VectorStatus(vec, _) = event.data() {
                        let vec = vec
                            .clone()
                            .change_elem::<f32>()
                            .elem_mul(Vector([4.789e-3; 3]));
                        // Default scale for accelerometer is 4.789e-3m/s^2 per lsb
                        log::info!("Accel: {vec:?}");
                    } else {
                        unreachable!();
                    }
                }
                _ => log::info!("{:?}", event),
            }
        }
        std::thread::sleep(std::time::Duration::from_millis(10));
    }
}

依赖项

~1.5MB
~39K SLoC