Baca Magnetometer MPU9250 Dengan Arduino

Posted on

Pendahuluan MPU-9250 AK8963

Salah satu sensor yang dapat diandalkan dalam proses pembuatan kompas adalah Magnetometer. Pada artikel ini saya akan membagikan kode dasar untuk dapat baca magnetometer MPU9250 dengan Arduino.

Sebelum lanjut, mengutip datasheet bahwa IC MPU-9250 ini terdiri dari 2 bagian blok sensor. Blok pertama terdiri dari Akselerometer dan Giroskop, sedangkan blok lainnya adalah sensor magnetometer AK8963 3-Axis dari Asahi Kasei Microdevices Corporation. Oleh karena itu, sensor magnetometer dapat diakses sendiri tanpa mengakses akselerometer dan giroskop.

Pada gambar dibawah ini merupakan blok diagram yang dapat anda lihat bahwa magnetometer (X, Y dan Z Compas) berbeda tempat dengan yang lain.

Baca Magnetometer MPU9250 Dengan Arduino

Magnetometer 3-sumbu menggunakan teknologi sensor Hall yang sangat sensitif. Bagian magnetometer IC menggabungkan sensor magnetik untuk mendeteksi magnet terestrial di X-, Y-, dan Z-Axes.

Rangkaian

Untuk merangkaikan sensor ini ke Arduino sangat mudah, karena komunikasi yang digunakan adalah I2C.

Dimana hanya menggunakan dua kabel saja. Hubungkan ke Arduino board seperti pada gambar disamping ini:
Baca Magnetometer MPU9250 Dengan Arduino

Kode Program

Untuk menjalankan kode program dibawah, saya gunakan library dari SparkFun yaitu SparkFun MPU-9250. Cara menambahkan library ini pada Arduino IDE versi 2 adalah seperti ditunjukkan pada gambar berikut ini:

Baca Magnetometer MPU9250 Dengan Arduino

Setelah itu, compile dan upload kode program berikut ini ke board Arduino. Lalu buka Serial monitor dan set BaudRate ke 9600.

#include "quaternionFilters.h"
#include "MPU9250.h"

#define I2Cclock 400000
#define I2Cport Wire
#define MPU9250_ADDRESS MPU9250_ADDRESS_AD0

MPU9250 myIMU(MPU9250_ADDRESS, I2Cport, I2Cclock);

void setup() {
  Wire.begin();
  Serial.begin(9600);
  myIMU.initMPU9250();
  byte d = myIMU.readByte(AK8963_ADDRESS, WHO_AM_I_AK8963);

  if (d == 0x48)  // WHO_AM_I should always be 0x71
  {
    Serial.println(F("Magnetometer is online..."));
  } else {
    Serial.println(F("Magnetometer is offline..."));
    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.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);
}

void loop() {
  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];

  // Must be called before updating quaternions!
  myIMU.updateTime();

  // Sensors x (y)-axis of the accelerometer is aligned with the y (x)-axis of
  // the magnetometer; the magnetometer z-axis (+ down) is opposite to z-axis
  // (+ up) of accelerometer and gyro! We have to make some allowance for this
  // orientationmismatch in feeding the output to the quaternion filter. For the
  // MPU-9250, we have chosen a magnetic rotation that keeps the sensor forward
  // along the x-axis just like in the LSM9DS0 sensor. This rotation can be
  // modified to allow any convenient orientation convention. This is ok by
  // aircraft orientation standards! 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);

  Serial.println((String) "X:" + myIMU.mx + "  Y:" + myIMU.my + "  Z" + myIMU.mz);
  delay(200);
}

Kalibrasi

Setelah kode program diatas berhasil di upload ke Arduino Board, sekarang silahkan anda membuka serial monitor.

Untuk pertama kali, serial monitor akan memberitahukan kepada anda untuk menggerakkan sensor MPU 9250 seperti angka 8 seperti instruksi berikut:

Baca Magnetometer MPU9250 Dengan Arduino

Untuk memberikan ilustrasi dalam proses kalibrasi diatas, perhatikan pada gambar berikut:

Baca Magnetometer MPU9250 Dengan Arduino
Gambar ini milik Justin Li pushrax, diambil dari alamat GitHub

Hasil

Jika kalibrasi sudah selesai, anda dapat melihat hasil yang ditunjukkan pada Serial Monitor seperti pada gambar berikut:

Baca Magnetometer MPU9250 Dengan Arduino

Semoga artikel Baca Nilai Magnetometer MPU9250 Dengan Arduino ini bermanfaat.

Baca artikel bermanfaat lainnya: