Overview

The BMI160 is an ultra-low power 16-bit 6-axis Inertial Measurement Unit (IMU) manufactured by Bosch Sensortec. Housed in a miniature 2.5×3.0 mm2.5 \times 3.0\text{ mm} 14-pin LGA package, it integrates a 3-axis accelerometer (±2g±16g\pm 2g \dots \pm 16g) and a 3-axis angular rate gyroscope (±125±2000 dps\pm 125 \dots \pm 2000\text{ dps}).

Engineered for mobile devices, wearables, and battery-powered IoT nodes, the BMI160 operates at a full active current of just 950 μA950\ \mu\text{A} (both accelerometer and gyroscope enabled). It features an integrated 1024-byte hardware FIFO buffer, an autonomous step counter (pedometer), and hardware gesture recognition (any-motion, double-tap, orientation detection).

Quick reference

Operating voltage (VCC)3.3 V to 5.0 V DC (breakout with 3.3V LDO)
IC supply voltage (VDD)1.71 V to 3.6 V DC (1.8 V or 3.3 V nominal)
InterfaceI2CI^2C (up to 1.0 MHz) & 3-Wire / 4-Wire SPI (up to 10 MHz)
Default I2CI^2C address0x68 (SDO pin Low to GND)
Alternate I2CI^2C address0x69 (SDO pin High to 3.3V)
Accel ranges±2g,±4g,±8g,±16g\pm 2g, \pm 4g, \pm 8g, \pm 16g
Gyro ranges±125 dps,±250 dps,±500 dps,±1000 dps,±2000 dps\pm 125\text{ dps}, \pm 250\text{ dps}, \pm 500\text{ dps}, \pm 1000\text{ dps}, \pm 2000\text{ dps}
Active current draw950 μA950\ \mu\text{A} active (Accel + Gyro) / 3 μA3\ \mu\text{A} suspend

Pinout

Standard 7-pin or 8-pin 0.1" (2.54 mm) breakout module header:

PinNameTypeDescription
1VCCPowerSupply input (+3.3 V to +5.0 V DC)
2GNDPowerGround reference (0 V)
3SCL / SCKDigital InputI2CI^2C Serial Clock / SPI Clock
4SDA / SDIDigital Input / OutputI2CI^2C Serial Data / SPI Serial Data Input
5SDO / ADDRDigital OutputSPI Data Out / I2CI^2C Address Select (Low = 0x68, High = 0x69)
6CSDigital InputSPI Chip Select (High = I2CI^2C mode, Low = SPI mode)
7INT1Digital OutputInterrupt line 1 (Motion / Tap / Step counter interrupt)
8INT2Digital OutputInterrupt line 2 (Data ready / FIFO watermark)

Specifications

ParameterSymbolMinTypMaxUnitConditions
Supply Voltage (Module)VCCV_{CC}3.33.3 / 5.05.5VPower rail with LDO
Active Supply CurrentICCI_{CC}9501200µAAccel + Gyro active
Low-Power Accel CurrentIacc_lpI_{acc\_lp}1830µA10 Hz sampling rate
Accel Sensitivity (±2g\pm 2g)SaccS_{acc}16384LSB/g16-bit 2's complement
Gyro Sensitivity (±250 dps\pm 250\text{ dps})SgyroS_{gyro}131.2LSB/dps16-bit 2's complement
FIFO Buffer SizeFIFOFIFO1024BytesConfigurable frame storage

I2CI^2C Register Access & Math

AddressRegisterAccessDescription
0x00CHIP_IDReadReturns 0xD1 (Chip ID for BMI160)
0x0C0x11GYR_X/Y/ZRead16-bit signed Gyroscope data
0x120x17ACC_X/Y/ZRead16-bit signed Accelerometer data
0x7ECMDWriteCommand register (0x11 = Accel Normal, 0x15 = Gyro Normal)

Accel (g)=Raw 16-bit Signed Value16384(at ±2g range)\text{Accel (g)} = \frac{\text{Raw 16-bit Signed Value}}{16384} \quad (\text{at } \pm 2g \text{ range})

Gyro (dps)=Raw 16-bit Signed Value131.2(at ±250 dps range)\text{Gyro (dps)} = \frac{\text{Raw 16-bit Signed Value}}{131.2} \quad (\text{at } \pm 250\text{ dps} \text{ range})

Wiring

BMI160 PinArduino / MCUESP32Notes
VCC5V / 3.3V3.3VModule includes 3.3V LDO
GNDGNDGNDSystem ground
SCLA5GPIO 22I2CI^2C Clock
SDAA4GPIO 21I2CI^2C Data
CS3.3V / 5V3.3VPull High for I2CI^2C mode

Example (Arduino BMI160 Library)

cpp
#include <Wire.h>
#include <BMI160Gen.h>

const int i2c_addr = 0x68;

void setup() {
  Serial.begin(115200);
  while (!Serial);

  Serial.println("Initializing BMI160 IMU...");
  BMI160.begin(BMI160Gen::I2C_MODE, i2c_addr);

  // Set ranges
  BMI160.setGyroRange(250);   // +/- 250 dps
  BMI160.setAccelerometerRange(2); // +/- 2g

  Serial.println("BMI160 initialized.");
}

void loop() {
  int gx, gy, gz;
  int ax, ay, az;

  // Read raw 16-bit sensor data
  BMI160.readMotionSensor(ax, ay, az, gx, gy, gz);

  float accelX = ax / 16384.0;
  float gyroX  = gx / 131.2;

  Serial.print("Accel X: "); Serial.print(accelX); Serial.print(" g\t");
  Serial.print("Gyro X: "); Serial.print(gyroX); Serial.println(" dps");

  delay(200);
}

Common mistakes

  • Leaving CS floating in I2CI^2C mode: Tie CS High to 3.3V to prevent random fallbacks into SPI mode.
  • Forgetting power-up command sequence (0x7E): Unlike MPU6050, the BMI160 powers up in Suspend mode. The host MCU must write command 0x11 (Accel Normal) and 0x15 (Gyro Normal) to register 0x7E to activate the sensors.

Notes

  • BMI160 vs MPU6050: BMI160 draws <1 mA<1\text{ mA} (vs MPU6050's 3.8 mA3.8\text{ mA}), includes a 1024-byte hardware FIFO, and incorporates an integrated hardware pedometer.

Assets & downloads