MPU9250 Arduino Cara Baca Data Sensor

Posted on

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:

  1. 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.
  2. 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.
  3. 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:

GiroskopAkselerometerMagnetometer
Baca Data dari MPU-9250 Menggunakan ArduinoBaca Data dari MPU-9250 Menggunakan ArduinoBaca Data dari MPU-9250 Menggunakan Arduino
Range : ±250, ±500, ±1000, and ±2000°/secRange : ±2g, ±4g, ±8g and ±16gRange : ±4800µT
16-bit ADCs16-bit ADCs14-bit ADCs
Operating current: 3.2mAOperating current: 450µAOperating current: 280µA
Sleep mode current: 8µASleep 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
Baca Data dari MPU-9250 Menggunakan Arduino
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.
Baca Data dari MPU-9250 Menggunakan Arduino



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:

Baca Data dari MPU-9250 Menggunakan Arduino

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:

Baca Data dari MPU-9250 Menggunakan Arduino


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: