ICM-20948 9-axis IMU breakout with ESP32

Supply 3.3 V Bus I2C I2C address 0x68 / 0x69 Measures acceleration, rotation, magnetic field, temperature
VINGNDSCLSDAAD0CSINTFSYNC

Pins and ESP32 wiring

PinRoleESP32 pinNotes
VINPower3V3Pin order and labels differ between sellers: check the silkscreen
GNDGroundGND
SCLI2C clock (SCL)D22
SDAI2C data (SDA)D21
AD0Not wired to the ESP32—Address select: LOW = 0x68, HIGH = 0x69 (some boards pull it HIGH)
CSNot wired to the ESP32—SPI chip select. Leave unconnected or HIGH for I2C
INTInterruptD35Interrupt output, optional
FSYNCNot wired to the ESP32—Frame sync. Leave unconnected or tie to GND

Suggested wiring for the 30-pin ESP32 DevKit, avoiding flash, input-only and strapping pins. BoardPilot checks it for you as you wire.

Check it is the real chip

Read register 0x00: a genuine part answers 0xea. BoardPilot does this automatically in “Debug a problem”.

Starter code (Arduino)

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);  // SDA = GPIO 21, SCL = GPIO 22
  Wire.beginTransmission(0x68);
  bool found = Wire.endTransmission() == 0;
  Serial.println(found ? "ICM-20948 9-axis IMU breakout found at 0x68" : "Not found: check power, GND and SDA/SCL");
}

void loop() {}

Sources

Try it in 3D in BoardPilot

BoardPilot Part data (JSON)

Related parts

Part data: CC BY 4.0, free to reuse with credit to BoardPilot.