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