driver-BMI088
Driver for the BMI088 inertial measurement unit and gyroscope. As a note: The BMI088 is pretty much two separate chips forced onto one bus. They both have unique chip selects and completely separate registers. Take this into consideration when using this driver. Pretty much everything needs to be done twice.
Usage
Initialize the accelerometer by using init()
.
This also wakes up the gyroscope and accelerometer. By default this driver initializes the gyroscope with a +-1000 degrees per second precision and a bandwidth of 64Hz at ODR 1000Hz. The accelerometer is initialized with a +-24G precision and "normal bandwidth" at ODR 100Hz.
Setting precision
Range
To set the precision of the accelerometer or gyroscope you may use setAccelerometerRange(...)
/setGyroscopeRange(...)
. This only works if the accelerometer or gyroscope are in standby. Use setAccelerometerMode(...)
/ setGyroscopeMode(...)
to switch between the different modes (AccelMode::OFF
,AccelMode::ON
,GyroMode::NORMAL_AWAKE
,GyroMode::SUSPEND
,GyroMode::DEEP_SUSPEND
).
Options for +-range include AccelRange::_3G
, AccelRange::_6G
, AccelRange::_12G
, AccelRange::_24G
and GyroRange::_2000
,GyroRange::_1000
,GyroRange::_500
,GyroRange::_250
,GyroRange::_125
.
Bandwidth
Users also have the option to apply a filter, using setAccelerometerBandwidth(...)
/setGyroscopeBandwidth(...)
. For the options, please consult the datasheet. Accelerometer bandwidth uses AccelBandwidth::OSRX
orAccelBandwidth::NORMAL_BANDWIDTH
. Gyroscope bandwidth uses _odr_filterbandwidth
format.
Full example:
//... (SPI initialization)
//init
sensor = new sta::BMI088(gyro_device, accel_device);
if(sensor->init()) STA_DEBUG_PRINTLN("BMI088 init success");
else STA_DEBUG_PRINTLN("BMI088 init failure");
//setting precision, bandwidth, odr (chip needs to be OFF!)
sensor->setAccelerometerMode(sta::BMI088::AccelMode::OFF);
sensor->setAccelerometerRange(sta::BMI088::AccelRange::_24G);
sensor->setAccelerometerBandwidth(sta::BMI088::AccelBandwidth::OSR4, sta::BMI088::AccelODR::_1600);
sensor->setAccelerometerMode(sta::BMI088::AccelMode::ON);
sensor->setGyroscopeMode(sta::BMI088::GyroMode::DEEP_SUSPEND);
sensor->setGyroscopeRange(sta::BMI088::GyroRange::_2000);
sensor->setGyroscopeBandwidth(sta::BMI088::GyroBandwidth::_2000_532);
sensor->setGyroscopeMode(sta::BMI088::GyroMode::NORMAL_AWAKE);
//...
//getting data
float ax, ay, az, rx, ry, rz;
sensor->getRotation(&rx, &ry, &rz);
sensor->getAcceleration(&ax, &ay, &az);
//...