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: