

The ICM-42688 is a high-performance 6-axis motion tracking device manufactured by TDK InvenSense. It integrates a 3-axis gyroscope and a 3-axis accelerometer into a single compact package, enabling precise motion sensing and orientation detection. The device is designed for applications requiring low power consumption, high accuracy, and robust performance in dynamic environments.








| Parameter | Value | 
|---|---|
| Gyroscope Range | ±125, ±250, ±500, ±1000, ±2000 dps | 
| Accelerometer Range | ±2, ±4, ±8, ±16 g | 
| Gyroscope Sensitivity | Configurable | 
| Accelerometer Sensitivity | Configurable | 
| Operating Voltage | 1.71V to 3.6V | 
| Communication Interface | I²C (up to 1 MHz) / SPI (up to 7 MHz) | 
| Power Consumption | 0.65 mA (low-power mode) | 
| Package Dimensions | 2.5 mm x 3 mm x 0.91 mm | 
| Operating Temperature | -40°C to +85°C | 
The ICM-42688 is available in a 14-pin LGA package. Below is the pinout description:
| Pin Number | Pin Name | Description | 
|---|---|---|
| 1 | VDD | Power supply input (1.71V to 3.6V). | 
| 2 | VDDIO | I/O voltage supply. | 
| 3 | GND | Ground. | 
| 4 | CS | Chip select for SPI interface. | 
| 5 | SCL/SCLK | I²C clock / SPI clock input. | 
| 6 | SDA/SDI | I²C data / SPI data input. | 
| 7 | SDO | SPI data output (optional). | 
| 8 | INT1 | Interrupt 1 output. | 
| 9 | INT2 | Interrupt 2 output. | 
| 10 | FSYNC | Frame synchronization input. | 
| 11 | RESV | Reserved (do not connect). | 
| 12 | RESV | Reserved (do not connect). | 
| 13 | RESV | Reserved (do not connect). | 
| 14 | RESV | Reserved (do not connect). | 
Below is an example of interfacing the ICM-42688 with an Arduino UNO using the I²C interface:
#include <Wire.h>
// ICM-42688 I2C address
#define ICM42688_ADDR 0x68
// Register addresses
#define WHO_AM_I 0x75
#define PWR_MGMT_1 0x06
#define ACCEL_XOUT_H 0x2D
void setup() {
  Wire.begin(); // Initialize I2C communication
  Serial.begin(9600); // Initialize serial communication
  // Wake up the ICM-42688
  Wire.beginTransmission(ICM42688_ADDR);
  Wire.write(PWR_MGMT_1); // Power management register
  Wire.write(0x01); // Set to normal mode
  Wire.endTransmission();
  // Verify device ID
  Wire.beginTransmission(ICM42688_ADDR);
  Wire.write(WHO_AM_I); // WHO_AM_I register
  Wire.endTransmission();
  Wire.requestFrom(ICM42688_ADDR, 1);
  if (Wire.available()) {
    byte deviceID = Wire.read();
    if (deviceID == 0x47) { // Expected device ID for ICM-42688
      Serial.println("ICM-42688 detected!");
    } else {
      Serial.println("Device not recognized.");
    }
  }
}
void loop() {
  // Read accelerometer data
  Wire.beginTransmission(ICM42688_ADDR);
  Wire.write(ACCEL_XOUT_H); // Start with ACCEL_XOUT_H register
  Wire.endTransmission();
  Wire.requestFrom(ICM42688_ADDR, 6); // Request 6 bytes (X, Y, Z)
  if (Wire.available() == 6) {
    int16_t accelX = (Wire.read() << 8) | Wire.read();
    int16_t accelY = (Wire.read() << 8) | Wire.read();
    int16_t accelZ = (Wire.read() << 8) | Wire.read();
    // Print accelerometer data
    Serial.print("Accel X: "); Serial.print(accelX);
    Serial.print(" | Accel Y: "); Serial.print(accelY);
    Serial.print(" | Accel Z: "); Serial.println(accelZ);
  }
  delay(500); // Delay for readability
}
Device Not Detected:
Incorrect Data Output:
Communication Errors: