Cara Memprogram Sensor Compass Magnetometer GY-271 QMC8553L Pada ESP32

Cara Memprogram Sensor Compass Magnetometer GY-271 QMC8553L Pada ESP32

Sensor Compass Magnetometer GY-271 QMC8553L adalah sebuah sensor yang digunakan untuk mengukur arah medan magnet dan digunakan sebagai kompas digital untuk berbagai aplikasi navigasi.Berikut ini adalah code untuk memprogram nya :

#include <Arduino.h>

#include <Wire.h>

#define addr_kompas 0x0D
int x_kompas, y_kompas, z_kompas; 


void deklarasi_kompas() {
  Wire.begin();
  Wire.beginTransmission(addr_kompas);
  Wire.write(0x0B);
  Wire.write(0x01);
  Wire.endTransmission();
  Wire.beginTransmission(addr_kompas);
  Wire.write(0x09);
  Wire.write(0x1D);
  Wire.endTransmission();
}
String baca_kompas() {
  float heading = atan2(y_kompas, x_kompas);
  if (heading < 0)
    heading += 2 * PI;
  if (heading > 2 * PI)
    heading -= 2 * PI;
  float headingDegrees = heading * 180 / M_PI;
  if (headingDegrees < 22.5 || headingDegrees > 337.5) {
    return "Utara";
  } else if (headingDegrees < 67.5) {
    return "Timur Utara";
  } else if (headingDegrees < 112.5) {
    return "Timur";
  } else if (headingDegrees < 157.5) {
    return "Timur Laut";
  } else if (headingDegrees < 202.5) {
    return "Selatan";
  } else if (headingDegrees < 247.5) {
    return "Barat Laut";
  } else if (headingDegrees < 292.5) {
    return "Barat";
  } else if (headingDegrees < 337.5) {
    return "Barat Daya";
  }
}


void setup()
{
Serial.begin(9600);
deklarasi_kompas();

}
void loop(){
Wire.beginTransmission(addr_kompas);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(addr_kompas, 6);
  if (6 <= Wire.available()) {
    x_kompas = Wire.read();
    x_kompas |= Wire.read() << 8;
    z_kompas = Wire.read();
    z_kompas |= Wire.read() << 8;
    y_kompas = Wire.read();
    y_kompas |= Wire.read() << 8;
  }
  String arah = baca_kompas();
  Serial.print("Arah kompas: ");
  Serial.println(arah);
  delay(500);


}

Berikut ini adalah penjelasan dari kode di atas :

1. Pendefinisian Library dan Inisialisasi

#include <Arduino.h>
#include <Wire.h>

#define addr_kompas 0x0D
int x_kompas, y_kompas, z_kompas; 
  • #include <Wire.h>: Memasukkan library Wire yang diperlukan untuk komunikasi I2C dengan sensor.
  • #define addr_kompas 0x0D: Mendefinisikan alamat I2C dari sensor kompas, yaitu 0x0D. Ini adalah alamat default dari chip QMC8553L atau sensor magnetometer lainnya yang digunakan dalam modul GY-271.
  • int x_kompas, y_kompas, z_kompas;: Mendeklarasikan tiga variabel untuk menyimpan data pembacaan sensor pada tiga sumbu (X, Y, Z).

2. Fungsi deklarasi_kompas()

void deklarasi_kompas() {
  Wire.begin();
  Wire.beginTransmission(addr_kompas);
  Wire.write(0x0B);
  Wire.write(0x01);
  Wire.endTransmission();
  
  Wire.beginTransmission(addr_kompas);
  Wire.write(0x09);
  Wire.write(0x1D);
  Wire.endTransmission();
}
  • Fungsi deklarasi_kompas() menginisialisasi sensor kompas melalui I2C.
    • Wire.begin();: Inisialisasi komunikasi I2C.
    • Wire.beginTransmission(addr_kompas);: Memulai transmisi data ke sensor kompas dengan alamat 0x0D.
    • Wire.write(0x0B); dan Wire.write(0x01);: Menulis data konfigurasi ke sensor untuk mengatur mode sensor.
    • Wire.beginTransmission(addr_kompas);: Mengirimkan perintah lagi ke sensor untuk mengonfigurasi register lainnya.
    • Wire.write(0x09); dan Wire.write(0x1D);: Mengirimkan data ke sensor untuk pengaturan lebih lanjut (register dan nilai yang dikirim tergantung pada sensor spesifik yang digunakan).

Fungsi ini bertujuan untuk mengatur konfigurasi awal pada sensor kompas agar siap mengirimkan data.

3. Fungsi baca_kompas()

String baca_kompas() {
  float heading = atan2(y_kompas, x_kompas);
  if (heading < 0)
    heading += 2 * PI;
  if (heading > 2 * PI)
    heading -= 2 * PI;
  
  float headingDegrees = heading * 180 / M_PI;
  
  if (headingDegrees < 22.5 || headingDegrees > 337.5) {
    return "Utara";
  } else if (headingDegrees < 67.5) {
    return "Timur Utara";
  } else if (headingDegrees < 112.5) {
    return "Timur";
  } else if (headingDegrees < 157.5) {
    return "Timur Laut";
  } else if (headingDegrees < 202.5) {
    return "Selatan";
  } else if (headingDegrees < 247.5) {
    return "Barat Laut";
  } else if (headingDegrees < 292.5) {
    return "Barat";
  } else if (headingDegrees < 337.5) {
    return "Barat Daya";
  }
}
  • Fungsi baca_kompas() digunakan untuk menghitung dan menentukan arah kompas berdasarkan data yang dibaca dari sensor.
    • atan2(y_kompas, x_kompas): Menghitung nilai heading (arah) dalam radian dari data sensor pada sumbu X dan Y menggunakan fungsi atan2 (fungsi trigonometri yang digunakan untuk menghitung sudut berdasarkan dua komponen).
    • if (heading < 0) heading += 2 * PI;: Menambahkan jika nilai heading negatif untuk memastikan sudut selalu positif.
    • headingDegrees = heading * 180 / M_PI;: Mengkonversi heading dari radian ke derajat.
    • Berdasarkan nilai headingDegrees, program menentukan arah yang diwakili dalam derajat.
      • Jika nilai heading kurang dari 22.5 atau lebih dari 337.5, maka arah dianggap sebagai Utara.
      • Begitu seterusnya, untuk berbagai arah seperti Timur, Selatan, Barat, dan arah di antara keduanya.

4. Fungsi setup()

void setup()
{
  Serial.begin(9600);
  deklarasi_kompas();
}
  • Fungsi setup() hanya dijalankan sekali saat board pertama kali menyala atau di-reset.
    • Serial.begin(9600);: Menginisialisasi komunikasi serial dengan baud rate 9600, untuk memungkinkan pengiriman data ke komputer atau perangkat lain.
    • deklarasi_kompas();: Memanggil fungsi deklarasi_kompas() untuk menyiapkan sensor kompas.

5. Fungsi loop()

void loop(){
  Wire.beginTransmission(addr_kompas);
  Wire.write(0x00);
  Wire.endTransmission();
  
  Wire.requestFrom(addr_kompas, 6);
  if (6 <= Wire.available()) {
    x_kompas = Wire.read();
    x_kompas |= Wire.read() << 8;
    z_kompas = Wire.read();
    z_kompas |= Wire.read() << 8;
    y_kompas = Wire.read();
    y_kompas |= Wire.read() << 8;
  }
  
  String arah = baca_kompas();
  Serial.print("Arah kompas: ");
  Serial.println(arah);
  
  delay(500);
}
  • Fungsi loop() akan dijalankan berulang kali setelah setup().
    • Wire.beginTransmission(addr_kompas);: Memulai transmisi ke sensor kompas.
    • Wire.write(0x00);: Mengirimkan perintah ke sensor untuk memulai pembacaan data.
    • Wire.requestFrom(addr_kompas, 6);: Meminta 6 byte data dari sensor (3 sumbu: X, Y, dan Z, masing-masing 2 byte).
    • if (6 <= Wire.available()) { ... }: Jika data yang diterima dari sensor sudah cukup (6 byte), maka baca data tersebut.
      • x_kompas = Wire.read(); dan seterusnya: Membaca data yang diterima dan menggabungkan dua byte untuk mendapatkan nilai pembacaan untuk setiap sumbu (X, Y, Z).
    • String arah = baca_kompas();: Memanggil fungsi baca_kompas() untuk menghitung dan mengonversi pembacaan kompas menjadi arah (misalnya, “Utara”, “Timur”, dll).
    • Serial.print("Arah kompas: "); dan Serial.println(arah);: Mencetak hasil arah kompas ke Serial Monitor.
    • delay(500);: Memberikan jeda 500ms sebelum pembacaan berikutnya.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?