

The MPU-9250/6500/9255 is a highly integrated 9-axis motion tracking device that combines a 3-axis gyroscope, a 3-axis accelerometer, and a 3-axis magnetometer in a single compact package. This component is widely used for applications requiring precise orientation, motion sensing, and environmental awareness. Its small size, low power consumption, and high performance make it ideal for use in robotics, drones, wearable devices, gaming controllers, and augmented reality systems.








The MPU-9250/6500/9255 offers a range of features and specifications that make it suitable for a variety of motion sensing applications.
The MPU-9250/6500/9255 has 24 pins. Below is a table describing the key pins:
| Pin Name | Type | Description |
|---|---|---|
| VDD | Power Supply | Main power supply (2.4V to 3.6V). |
| VDDIO | Power Supply | I/O voltage supply. |
| GND | Ground | Ground connection. |
| SCL | Input | I²C clock line. |
| SDA | Input/Output | I²C data line. |
| CS | Input | Chip select for SPI communication (active low). |
| INT | Output | Interrupt signal output. |
| FSYNC | Input | Frame synchronization input. |
| AUX_DA | Input/Output | Auxiliary I²C data line for external sensors. |
| AUX_CL | Input | Auxiliary I²C clock line for external sensors. |
| RESV | Reserved | Reserved pins. Must be left unconnected or connected as per the datasheet. |
Below is an example of how to interface the MPU-9250 with an Arduino UNO using I²C:
#include <Wire.h>
// MPU-9250 I2C address
#define MPU9250_ADDRESS 0x68
// Register addresses
#define WHO_AM_I 0x75
#define PWR_MGMT_1 0x6B
#define ACCEL_XOUT_H 0x3B
void setup() {
Wire.begin(); // Initialize I2C communication
Serial.begin(9600); // Initialize serial communication
// Wake up the MPU-9250
Wire.beginTransmission(MPU9250_ADDRESS);
Wire.write(PWR_MGMT_1); // Access power management register
Wire.write(0x00); // Set to zero to wake up the sensor
Wire.endTransmission();
// Check if the sensor is connected
Wire.beginTransmission(MPU9250_ADDRESS);
Wire.write(WHO_AM_I); // Access WHO_AM_I register
Wire.endTransmission();
Wire.requestFrom(MPU9250_ADDRESS, 1);
if (Wire.available()) {
byte whoAmI = Wire.read();
Serial.print("MPU-9250 WHO_AM_I: 0x");
Serial.println(whoAmI, HEX);
}
}
void loop() {
// Read accelerometer data
Wire.beginTransmission(MPU9250_ADDRESS);
Wire.write(ACCEL_XOUT_H); // Start reading from ACCEL_XOUT_H register
Wire.endTransmission();
Wire.requestFrom(MPU9250_ADDRESS, 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();
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
}
No Response from the Sensor:
Inconsistent Readings:
High Noise in Data:
Magnetometer Not Working:
Q: Can the MPU-9250/6500/9255 operate at 5V?
A: No, the sensor operates at 2.4V to 3.6V. Use a voltage regulator or level shifter for 5V systems.
Q: How do I calibrate the magnetometer?
A: Rotate the sensor in all directions to collect data, then use a calibration algorithm to correct for distortions.
Q: What is the difference between the MPU-9250, MPU-6500, and MPU-9255?
A: The MPU-9250 and MPU-9255 include a magnetometer, while the MPU-6500 does not. The MPU-9255 has improved magnetometer performance compared to the MPU-9250.