

The LSM6DS3 is a high-performance 6-axis inertial measurement unit (IMU) manufactured by STMicroelectronics. It integrates a 3-axis accelerometer and a 3-axis gyroscope into a single compact package, enabling precise motion sensing and orientation tracking. The LSM6DS3 is widely used in applications such as smartphones, wearables, gaming devices, drones, and other IoT devices requiring motion detection and gesture recognition.
This component is designed for low power consumption and high accuracy, making it suitable for battery-powered devices. It supports advanced features like step detection, tilt detection, and activity recognition, which are implemented through its embedded finite state machine and machine learning core.








| Parameter | Value |
|---|---|
| Manufacturer | STMicroelectronics |
| Part Number | LSM6DSV32X |
| Sensor Type | 6-axis IMU (3-axis accelerometer + 3-axis gyroscope) |
| Operating Voltage | 1.71V to 3.6V |
| Accelerometer Range | ±2g, ±4g, ±8g, ±16g |
| Gyroscope Range | ±125, ±250, ±500, ±1000, ±2000 dps |
| Output Data Rate (ODR) | Up to 6.66 kHz |
| Interface | I²C, SPI |
| Power Consumption | 0.65 mA (accelerometer + gyroscope in high-performance mode) |
| Operating Temperature | -40°C to +85°C |
| Package | LGA-14 (2.5 mm x 3.0 mm x 0.83 mm) |
The LSM6DS3 comes in a 14-pin LGA package. Below is the pin configuration:
| Pin Number | Pin Name | Description |
|---|---|---|
| 1 | VDD | Power supply (1.71V to 3.6V) |
| 2 | VDDIO | I/O interface voltage supply |
| 3 | GND | Ground |
| 4 | SCL/SPC | I²C serial clock / SPI serial port clock |
| 5 | SDA/SDI/SDO | I²C serial data / SPI data in / SPI data out |
| 6 | CS | SPI chip select (active low) |
| 7 | INT1 | Interrupt 1 output |
| 8 | INT2 | Interrupt 2 output |
| 9-14 | NC | Not connected (leave floating) |
Below is an example of how to interface the LSM6DS3 with an Arduino UNO using the I²C interface:
#include <Wire.h>
// LSM6DS3 I2C address
#define LSM6DS3_ADDR 0x6A
// Register addresses
#define WHO_AM_I 0x0F
#define CTRL1_XL 0x10
#define CTRL2_G 0x11
#define OUTX_L_XL 0x28
void setup() {
Wire.begin(); // Initialize I2C communication
Serial.begin(9600); // Initialize serial communication
// Check if the LSM6DS3 is connected
Wire.beginTransmission(LSM6DS3_ADDR);
Wire.write(WHO_AM_I);
Wire.endTransmission();
Wire.requestFrom(LSM6DS3_ADDR, 1);
if (Wire.available()) {
byte whoAmI = Wire.read();
if (whoAmI == 0x69) { // Expected WHO_AM_I response
Serial.println("LSM6DS3 detected!");
} else {
Serial.println("Device not recognized.");
}
}
// Configure accelerometer (±2g, 104 Hz ODR)
Wire.beginTransmission(LSM6DS3_ADDR);
Wire.write(CTRL1_XL);
Wire.write(0x40); // 104 Hz, ±2g
Wire.endTransmission();
// Configure gyroscope (±250 dps, 104 Hz ODR)
Wire.beginTransmission(LSM6DS3_ADDR);
Wire.write(CTRL2_G);
Wire.write(0x40); // 104 Hz, ±250 dps
Wire.endTransmission();
}
void loop() {
// Read accelerometer data
Wire.beginTransmission(LSM6DS3_ADDR);
Wire.write(OUTX_L_XL);
Wire.endTransmission();
Wire.requestFrom(LSM6DS3_ADDR, 6); // Read 6 bytes (X, Y, Z)
if (Wire.available() == 6) {
int16_t accelX = Wire.read() | (Wire.read() << 8);
int16_t accelY = Wire.read() | (Wire.read() << 8);
int16_t accelZ = Wire.read() | (Wire.read() << 8);
Serial.print("Accel X: "); Serial.print(accelX);
Serial.print(" Y: "); Serial.print(accelY);
Serial.print(" Z: "); Serial.println(accelZ);
}
delay(100); // Delay for readability
}
By following this documentation, you can effectively integrate the LSM6DS3 into your projects and leverage its powerful motion sensing capabilities.