Pada artikel ini saya akan memberikan langkah-langkah cara membaca da0xta dari MPU9250 menggunakan Arduino. Dengan ini nantinya anda dapat mebuat projek lain seperti kompas, penyeimbang quadcopter, smartphone dan lain-lain.
Tentang MPU-9250
MPU-9250 adalah sebuah IC yang didalamnya telah terdapat sensor Giroskop, Akselerometer, Magnetometer dan temperatur. Setiap sensor memiliki kemampuan baca data 3-axis. Sehingga sensor ini disebut juga Nine-Axis MEMS Motion Tracking Device.
Adapun fungsi dari masing-masing sensor adalah sebagai berikut:
- Giroskop berfungsi untuk mengukur kecepatan sudut atau tingkat perubahan sudut dari sebuah perangkat. Giroskop biasanya digunakan dalam perangkat permainan dan aplikasi yang membutuhkan pengenalan gerakan tangan.
- Akselerometer berfungsi untuk mengukur percepatan linier dari sebuah perangkat. Sensor ini mendeteksi perubahan kecepatan dalam tiga sumbu ruang (x, y, dan z). Akselerometer umumnya digunakan dalam permainan, navigasi, dan aplikasi kebugaran untuk mendeteksi langkah atau gerakan perangkat.
- Magnetometer berfungsi untuk mendeteksi medan magnet di sekitar perangkat. Sensor ini memanfaatkan perubahan medan magnet untuk menentukan arah dan orientasi perangkat. Magnetometer dapat digunakan untuk kompas digital, deteksi gerakan, atau pemetaan medan magnet di sekitar perangkat.
Untuk fitur dan ilustrasi yang ada pada masing-masing sensor dapat anda lihat pada tabel berikut:
Giroskop Akselerometer Magnetometer Range : ±250, ±500, ±1000, and ±2000°/sec Range : ±2g, ±4g, ±8g and ±16g Range : ±4800µT 16-bit ADCs 16-bit ADCs 14-bit ADCs Operating current: 3.2mA Operating current: 450µA Operating current: 280µA Sleep mode current: 8µA Sleep mode current: 8µA –
Peringatan!!! IC ini hanya bekerja pada tegangan +2.4 V hingga +3.6 V.
Modul MPU9250 & Pinout
Untuk memudahkan kita menggunakan IC ini, beberapa produsen membuat module yang tampak seperti pada gambar berikut:
VCC : +2.4V hingga +3.6V
GND : 0V
SCL : Serial Clock (I2C)
SDA : Serial Data (I2C)
EDA : Serial Data (Master I2C) untuk sensor eksternal
ECL : Serial Clock (Master I2C) untuk sensor eksternal
AD0 : Pilihan alamat I2C.
Jika AD0 = 0, alamat I2C adalah 1101000.(0x68)
Jika AD0 = 1, alamat I2C adalah 1101001(0x69)
INT : Interrupt Digital Output
NCS : Chip select (SPI mode only)
FSYNC : Frame synchronization digital input. Koneksikan to GND jika tidak digunakan
Gambar ini milik Tenstar Robot
Rangkaian Arduino MPU-9250
Disini diingatkan kembali bahwa modul ini bekerja normal pada +3.3V. Untuk board yang digunakan adalah Arduino Uno dengan memanfaatkan pin 3.3V seperti yang diperlihatkan pada gambar disamping. Untuk komunikasi menggunakan I2C, maka kita gunakan SCL dan SDA saja yang terhubung ke A4 dan A5 pada board Arduino Uno. Untuk selanjutnya, agar Arduino Uno dapat membaca data dari modul sensor, kita gunakan sebuah library dari Sparkfun. | ![]() |
Library
Library untuk modul sensor ini telah tersedia di Library Manager. Untuk mengcompile kode program ini, saya menggunakan Arduino IDE 2. Cara menambahkan library ini seperti ditunjukkan pada gambar berikut ini:
Saat artikel ini ditulis, versi dari library ini adalah 1.0.2. Ini akan mungkin berbeda dengan versi yang anda gunakan nantinya.
Setelah instalasi library selesai, selanjutnya mari kita lihat kode program dasar dibawah ini.
Kode Program
Kode program dibawah ini merupakan kode program Example dari library diatas. Namun untuk keperluan pribadi, beberapa baris program saya hapus sehingga lebih mudah untuk membacanya.
Gunakan kode program berikut, lalu upload ke board Arduino anda.
/* MPU9250 Basic Example Code
by: Kris Winer
date: April 1, 2014
Modified by Brent Wilkins July 19, 2016
*/
#include "quaternionFilters.h"
#include "MPU9250.h"
#define SerialDebug true // Set to true to get Serial output for debugging
#define I2Cclock 400000
#define I2Cport Wire
#define MPU9250_ADDRESS MPU9250_ADDRESS_AD0 // Use either this line or the next to select which I2C address your device is using
//#define MPU9250_ADDRESS MPU9250_ADDRESS_AD1
//MPU9250_ADDRESS_AD0 = 0x68
//MPU9250_ADDRESS_AD1 = 0x69
MPU9250 myIMU(MPU9250_ADDRESS, I2Cport, I2Cclock);
void setup() {
Wire.begin();
Serial.begin(38400);
while (!Serial) {};
byte c = myIMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
if (c == 0x71)
{
Serial.println(F("MPU9250 is online..."));
// Start by performing self test and reporting values
myIMU.MPU9250SelfTest(myIMU.selfTest);
// Calibrate gyro and accelerometers, load biases in bias registers
myIMU.calibrateMPU9250(myIMU.gyroBias, myIMU.accelBias);
// Initialize device for active mode read of acclerometer, gyro, and temp
myIMU.initMPU9250();
// Read the WHO_AM_I register of the magnetometer
byte d = myIMU.readByte(AK8963_ADDRESS, WHO_AM_I_AK8963);
if (d != 0x48) {
// Communication failed, stop here
Serial.println(F("Communication failed, abort!"));
Serial.flush();
abort();
}
// Get magnetometer calibration from AK8963 ROM
// Initialize device for active mode read of magnetometer
myIMU.initAK8963(myIMU.factoryMagCalibration);
// Get sensor resolutions, only need to do this once
myIMU.getAres();
myIMU.getGres();
myIMU.getMres();
// The next call delays for 4 seconds, and then records about 15 seconds of
// data to calculate bias and scale.
//myIMU.magCalMPU9250(myIMU.magBias, myIMU.magScale);
//delay(2000); // Add delay to see results before serial spew of data
} else {
Serial.print("Could not connect to MPU9250: 0x");
Serial.println(c, HEX);
// Communication failed, stop here
Serial.println(F("Communication failed, abort!"));
Serial.flush();
abort();
}
}
void loop() {
// If intPin goes high, all data registers have new data
// On interrupt, check if data ready interrupt
if (myIMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) {
myIMU.readAccelData(myIMU.accelCount); // Read the x/y/z adc values
// Now we'll calculate the accleration value into actual g's
// This depends on scale being set
myIMU.ax = (float)myIMU.accelCount[0] * myIMU.aRes; // - myIMU.accelBias[0];
myIMU.ay = (float)myIMU.accelCount[1] * myIMU.aRes; // - myIMU.accelBias[1];
myIMU.az = (float)myIMU.accelCount[2] * myIMU.aRes; // - myIMU.accelBias[2];
myIMU.readGyroData(myIMU.gyroCount); // Read the x/y/z adc values
// Calculate the gyro value into actual degrees per second
// This depends on scale being set
myIMU.gx = (float)myIMU.gyroCount[0] * myIMU.gRes;
myIMU.gy = (float)myIMU.gyroCount[1] * myIMU.gRes;
myIMU.gz = (float)myIMU.gyroCount[2] * myIMU.gRes;
myIMU.readMagData(myIMU.magCount); // Read the x/y/z adc values
// Calculate the magnetometer values in milliGauss
// Include factory calibration per data sheet and user environmental
// corrections
// Get actual magnetometer value, this depends on scale being set
myIMU.mx = (float)myIMU.magCount[0] * myIMU.mRes
* myIMU.factoryMagCalibration[0]
- myIMU.magBias[0];
myIMU.my = (float)myIMU.magCount[1] * myIMU.mRes
* myIMU.factoryMagCalibration[1]
- myIMU.magBias[1];
myIMU.mz = (float)myIMU.magCount[2] * myIMU.mRes
* myIMU.factoryMagCalibration[2]
- myIMU.magBias[2];
} // if (readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01)
// Must be called before updating quaternions!
myIMU.updateTime();
//Pass gyro rate as rad/s
MahonyQuaternionUpdate(myIMU.ax, myIMU.ay, myIMU.az, myIMU.gx * DEG_TO_RAD,
myIMU.gy * DEG_TO_RAD, myIMU.gz * DEG_TO_RAD, myIMU.my,
myIMU.mx, myIMU.mz, myIMU.deltat);
myIMU.delt_t = millis() - myIMU.count;
if (myIMU.delt_t > 1000) {
if (SerialDebug) {
// Print acceleration values in milligs!
Serial.print("Akselerometer = X: ");
Serial.print((1000 * myIMU.ax), 3);
Serial.print(" mg ");
Serial.print("Y: ");
Serial.print(1000 * myIMU.ay, 3);
Serial.print(" mg ");
Serial.print("Z: ");
Serial.print(1000 * myIMU.az, 3);
Serial.println(" mg ");
// Print gyro values in degree/sec
Serial.print("Giroskop = X: ");
Serial.print(myIMU.gx, 3);
Serial.print(" degrees/sec ");
Serial.print("Y: ");
Serial.print(myIMU.gy, 3);
Serial.print(" degrees/sec ");
Serial.print("Z: ");
Serial.print(myIMU.gz, 3);
Serial.println(" degrees/sec");
// Print mag values in degree/sec
Serial.print("Magnetometer = X: ");
Serial.print(myIMU.mx, 3);
Serial.print(" mG ");
Serial.print("Y: ");
Serial.print(myIMU.my, 3);
Serial.print(" mG ");
Serial.print("Z: ");
Serial.print(myIMU.mz, 3);
Serial.println(" mG");
// Read the adc values
myIMU.tempCount = myIMU.readTempData();
// Temperature in degrees Centigrade
myIMU.temperature = ((float)myIMU.tempCount) / 333.87 + 21.0;
// Print temperature in degrees Centigrade
Serial.print("Temperature = ");
Serial.print(myIMU.temperature, 3);
Serial.println(" degrees C");
Serial.println();
}
myIMU.count = millis();
}
}
Alamat 0x71 merupakan alamat register sebagai pengenal yang ditentukan oleh pabrik untuk MPU9250. Oleh karena itu, jika nilai yang dibaca dari register WHO_AM_I adalah 0x71, itu menunjukkan bahwa komunikasi dengan MPU9250 berhasil dan perangkat terhubung dengan benar.
Hasil
Setelah kode program selesai diupload ke board Arduino, kini buka serial monitor dan anda akan melihat hasilnya seperti dibawah ini:

MPU9250 Datasheet
Jika dibutuhkan, saya melampirkan datasheet dibawah ini untuk melihat deskripsi lengkap tentang IC MPU-9250 ini.
Jika anda mendapat kekeliruan baik dalam kata-kata atau kode program, segera komentar dibawah ini. Semoga artikel cara membaca data dari MPU9250 menggunakan Arduino ini bermanfaat.
Artikel bermanfaat lainnya:
- Cara Akses Sensor DHT11 Menggunakan Arduino Uno
- Cara menggunakan sensor PIR HC SR501 Arduino
- Rangkaian Dasar LDR Sensor Cahaya Arduino Uno
- TTP223 Sensor Sentuh dan Rangkaian Dasar
- Panel Surya Arduino dan Data Logger Sensor INA219