Daftar Isi:

MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p): 5 Langkah
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p): 5 Langkah

Video: MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p): 5 Langkah

Video: MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p): 5 Langkah
Video: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, Juli
Anonim
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasi Akselerometer Dengan Arduino (Atmega328p)

MPU6050 IMU memiliki akselerometer 3-Sumbu dan giroskop 3-Sumbu yang terintegrasi dalam satu chip.

Giroskop mengukur kecepatan rotasi atau laju perubahan posisi sudut dari waktu ke waktu, sepanjang sumbu X, Y dan Z.

Keluaran giroskop dalam derajat per detik, jadi untuk mendapatkan posisi sudut kita hanya perlu mengintegrasikan kecepatan sudut.

Di sisi lain, akselerometer MPU6050 mengukur percepatan dengan mengukur percepatan gravitasi di sepanjang 3 sumbu dan menggunakan beberapa matematika trigonometri kita dapat menghitung sudut di mana sensor diposisikan. Jadi, jika kita menggabungkan, atau menggabungkan data akselerometer dan giroskop, kita bisa mendapatkan informasi yang sangat akurat tentang orientasi sensor.

3-axis Gyroscope MPU-6050 terdiri dari 3 axis gyroscope yang dapat mendeteksi kecepatan putaran sepanjang sumbu x, y, z dengan teknologi micro electro mechanical system (MEMS). Ketika sensor diputar sepanjang sumbu apa pun, getaran dihasilkan karena efek Coriolis yang dideteksi oleh MEMS. ADC 16-bit digunakan untuk mendigitalkan tegangan ke sampel setiap sumbu.+/- 250, +/- 500, +/- 1000, +/- 2000 adalah rentang skala penuh keluaran. Kecepatan sudut diukur sepanjang setiap sumbu dalam satuan derajat per detik.

Tautan Berguna: …………….

Papan Arduino: ……….

MPU6050 IMU ……………https://compoindia.com/product/mpu6050-3-axis-accelerometer-and-gyroscope-sensor/

Langkah 1: Modul MPU-6050

Modul MPU-6050
Modul MPU-6050

Modul MPU-6050 memiliki 8 pin,

INT: Interupsi pin keluaran digital.

AD0: Pin LSB Alamat I2C Slave. Ini adalah bit ke-0 dalam alamat slave 7-bit perangkat. Jika terhubung ke VCC maka dibaca sebagai logika satu dan alamat slave berubah.

XCL: Pin Jam Serial Tambahan. Pin ini digunakan untuk menghubungkan pin SCL sensor yang diaktifkan antarmuka I2C lainnya ke MPU-6050.

XDA: Pin Data Serial Tambahan. Pin ini digunakan untuk menghubungkan pin SDA sensor yang diaktifkan antarmuka I2C lainnya ke MPU-6050.

SCL: Pin Jam Serial. Hubungkan pin ini ke pin SCL mikrokontroler. SDA: Pin Data Serial. Hubungkan pin ini ke pin SDA mikrokontroler.

GND: Pin tanah. Hubungkan pin ini ke koneksi ground.

VCC: Pin catu daya. Hubungkan pin ini ke suplai DC +5V. Modul MPU-6050 memiliki alamat Slave (Ketika AD0 = 0, yaitu tidak terhubung ke Vcc) sebagai, Alamat Tulis Budak (SLA+W): 0xD0

Alamat Baca Budak (SLA+R): 0xD1

Langkah 2: Perhitungan

Perhitungan
Perhitungan

Data sensor giroskop dan akselerometer modul MPU6050 terdiri dari data mentah 16 bit dalam bentuk komplemen 2.

Data sensor suhu modul MPU6050 terdiri dari data 16-bit (tidak dalam bentuk komplemen 2).

Sekarang misalkan kita telah memilih,

  • - Akselerometer rentang skala penuh +/- 2g dengan Faktor Skala Sensitivitas 16, 384 LSB(Hitung)/g.
  • - Giroskop rentang skala penuh +/- 250 °/s dengan Faktor Skala Sensitivitas 131 LSB (Hitung)/°/s. kemudian,

Untuk mendapatkan data raw sensor, pertama-tama kita harus melakukan komplemen 2 pada data sensor Accelerometer dan gyroscope. Setelah mendapatkan data mentah sensor, kita dapat menghitung percepatan dan kecepatan sudut dengan membagi data mentah sensor dengan faktor skala sensitivitasnya sebagai berikut--

Nilai akselerometer dalam g (gaya g)

  • Percepatan sepanjang sumbu X = (Data mentah sumbu X akselerometer/16384) g.
  • Percepatan sepanjang sumbu Y = (Data mentah sumbu Y akselerometer/16384) g.
  • Percepatan sepanjang sumbu Z = (Data mentah sumbu Z akselerometer/16384) g.

Nilai giroskop dalam °/s (derajat per detik)

  • Kecepatan sudut sepanjang sumbu X = (Data mentah sumbu X giroskop/131) °/s.
  • Kecepatan sudut sepanjang sumbu Y = (Data mentah sumbu Y giroskop/131) °/s.
  • Kecepatan sudut sepanjang sumbu Z = (Data mentah sumbu Z giroskop/131) °/s.

Nilai suhu dalam °/c (derajat per Celcius)

Suhu dalam derajat C = ((data sensor suhu)/340 + 36,53) °/c.

Sebagai contoh, Misalkan, setelah komplemen 2’ kita mendapatkan nilai mentah sumbu akselerometer X = +15454

Maka Ax = +15454/16384 = 0,94 g.

Lagi,

Jadi kita tahu kita berlari pada sensitivitas +/-2G dan +/- 250deg/s tetapi bagaimana nilai kita sesuai dengan percepatan/sudut tersebut.

Ini adalah kedua grafik garis lurus dan kita dapat mencari tahu dari mereka bahwa untuk 1G kita akan membaca 16384 dan untuk 1 derajat/detik kita akan membaca 131,07(Meskipun.07 akan diabaikan karena biner) nilai-nilai ini hanya bekerja dengan menggambar grafik garis lurus dengan 2G pada 32767 dan -2G pada -32768 dan 250/-250 pada nilai yang sama.

Jadi sekarang kita tahu nilai sensitivitas kita (16384 dan 131.07) kita hanya perlu dikurangi offset dari nilai kita dan kemudian dibagi dengan sensitivitas.

Ini akan bekerja dengan baik untuk nilai X dan Y tetapi karena Z direkam pada 1G dan bukan 0, kita perlu mengurangi 1G (16384) sebelum kita membaginya dengan sensitivitas kita.

Langkah 3: Koneksi MPU6050-Atmega328p

Koneksi MPU6050-Atmega328p
Koneksi MPU6050-Atmega328p
Koneksi MPU6050-Atmega328p
Koneksi MPU6050-Atmega328p
Koneksi MPU6050-Atmega328p
Koneksi MPU6050-Atmega328p

Hubungkan saja semuanya seperti yang diberikan dalam diagram…

Koneksi diberikan sebagai berikut: -

Mpu6050 Arduino Nano

Pin keluar VCC 5v

Pin tanah GND

Pin SDA A4 //data serial

Pin SCL A5 // jam serial

Perhitungan Pitch and Roll: Roll adalah rotasi di sekitar sumbu x dan pitch adalah rotasi di sepanjang sumbu y.

Hasilnya dalam radian. (konversi ke derajat dengan mengalikan dengan 180 dan membagi dengan pi)

Langkah 4: Kode dan Penjelasan

Kode dan Penjelasan
Kode dan Penjelasan

/*

Tutorial Sensor Akselerometer dan Giroskop Arduino dan MPU6050 oleh Dejan, https://howtomechatronics.com */ #include const int MPU = 0x68; // alamat MPU6050 I2C float AccX, AccY, AccZ; mengapung GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float waktu berlalu, waktu saat ini, waktu sebelumnya; intc = 0; void setup() { Serial.begin(19200); Kawat.mulai(); // Inisialisasi komunikasi Wire.beginTransmission(MPU); // Mulai komunikasi dengan MPU6050 // MPU=0x68 Wire.write(0x6B); // Bicara ke register 6B Wire.write(0x00); // Lakukan reset - tempatkan 0 ke dalam register 6B Wire.endTransmission(true); //mengakhiri transmisi /* // Mengonfigurasi Sensitivitas Akselerometer - Rentang Skala Penuh (default +/- 2g) Wire.beginTransmission(MPU); Wire.write(0x1C); //Berbicara dengan register ACCEL_CONFIG (1C hex) Wire.write(0x10); //Tetapkan bit register sebagai 00010000 (+/- 8g rentang skala penuh) Wire.endTransmission(true); // Konfigurasi Sensitivitas Gyro - Rentang Skala Penuh (default +/- 250deg/s) Wire.beginTransmission(MPU); Kawat.tulis (0x1B); // Bicara ke register GYRO_CONFIG (1B hex) Wire.write(0x10); // Atur bit register sebagai 000000000, (skala penuh 1000deg/dtk) Wire.endTransmission(true); penundaan (20); */ // Panggil fungsi ini jika Anda perlu mendapatkan nilai kesalahan IMU untuk modul Anda menghitung_IMU_error(); penundaan (20); } void loop() { // === Membaca data acceleromter === // Wire.beginTransmission(MPU); Kawat.tulis (0x3B); // Mulai dengan register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU, 6, benar); // Baca total 6 register, setiap nilai sumbu disimpan dalam 2 register //Untuk rentang +-2g, kita perlu membagi nilai mentah dengan 16384, sesuai dengan datasheet AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // Nilai sumbu X AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Nilai sumbu Y AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Nilai sumbu Z // Menghitung Roll dan Pitch dari data akselerometer accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~(0.58) Lihat fungsi khusus calcount_IMU_error() untuk lebih jelasnya accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58) // === Membaca data giroskop === // Waktu sebelumnya = Waktu saat ini; // Waktu sebelumnya disimpan sebelum waktu aktual dibaca currentTime = milis(); // Waktu saat ini waktu aktual membaca elapsedTime = (Waktu saat ini - Waktu sebelumnya) / 1000; // Bagi dengan 1000 untuk mendapatkan detik Wire.beginTransmission(MPU); Kawat.tulis (0x43); // Data Gyro pertama mendaftar alamat 0x43 Wire.endTransmission(false); Wire.requestFrom(MPU, 6, benar); // Baca total 4 register, setiap nilai sumbu disimpan dalam 2 register GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // Untuk rentang 250deg/s kita harus membagi dulu nilai mentahnya dengan 131,0, menurut lembar data GyroY = (Wire.read() << 8 | Wire.read()) / 131.0; GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0; // Perbaiki output dengan nilai kesalahan yang dihitung GyroX = GyroX + 0,56; // GyroErrorX ~(-0,56) GyroY = GyroY - 2; // GyroErrorY ~(2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0.8) // Saat ini nilai mentah dalam derajat per detik, deg/s, jadi kita perlu mengalikannya dengan sendonds (s) untuk mendapatkan sudut dalam derajat gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * waktu berlalu; // Filter komplementer - menggabungkan nilai sudut acceleromter dan gyro roll = 0,96 * gyroAngleX + 0,04 * accAngleX; nada = 0,96 * gyroAngleY + 0,04 * accAngleY; // Cetak nilai pada serial monitor Serial.print(roll); Serial.print("/"); Serial.print(pitch); Serial.print("/"); Serial.println(yaw); } void count_IMU_error() { // Kita dapat memanggil fungsi ini di bagian setup untuk menghitung kesalahan data accelerometer dan gyro. Dari sini kita akan mendapatkan nilai error yang digunakan pada persamaan di atas yang tercetak pada Serial Monitor. // Perhatikan bahwa kita harus menempatkan IMU datar untuk mendapatkan nilai yang tepat, sehingga kita kemudian dapat nilai yang benar // Membaca nilai accelerometer 200 kali while (c < 200) { Wire.beginTransmission(MPU); Kawat.tulis (0x3B); Wire.endTransmission(salah); Wire.requestFrom(MPU, 6, benar); AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Jumlahkan semua bacaan AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI)); AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI)); c++; } //Bagi hasil penjumlahan dengan 200 untuk mendapatkan nilai error AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Baca nilai gyro 200 kali while (c < 200) { Wire.beginTransmission(MPU); Kawat.tulis (0x43); Wire.endTransmission(salah); Wire.requestFrom(MPU, 6, benar); GyroX = Wire.read() << 8 | Kawat.baca(); GyroY = Wire.read() << 8 | Kawat.baca(); GyroZ = Wire.read() << 8 | Kawat.baca(); // Jumlahkan semua pembacaan GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c++; } //Bagi hasil penjumlahan dengan 200 untuk mendapatkan nilai error GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Cetak nilai kesalahan pada Serial Monitor Serial.print("AccErrorX: "); Serial.println(AccErrorX); Serial.print("AccErrorY: "); Serial.println(AccErrorY); Serial.print("GyroErrorX: "); Serial.println(GyroErrorX); Serial.print("GyroErrorY: "); Serial.println(GyroErrorY); Serial.print("GyroErrorZ: "); Serial.println(GyroErrorZ); } -------------------------------------------------- ---------------------------------------------- Hasil:- X = Y = Z = -------------------------------------------------------- ----------------------------------------------- Catatan penting: - ----------------

Di bagian loop kita mulai dengan membaca data accelerometer. Data untuk setiap sumbu disimpan dalam 2 byte atau register dan kita dapat melihat alamat register ini dari datasheet sensor.

Untuk membaca semuanya, kita mulai dengan register pertama, dan menggunakan fungsi requiestFrom() kita meminta untuk membaca semua 6 register untuk sumbu X, Y dan Z. Kemudian kami membaca data dari masing-masing register, dan karena outputnya adalah komplemen dua, kami menggabungkannya dengan tepat untuk mendapatkan nilai yang benar.

Langkah 5: Memahami Sudut Kemiringan

Akselerometer

Gravitasi bumi adalah percepatan konstan dimana gaya selalu mengarah ke pusat bumi.

Ketika akselerometer sejajar dengan gravitasi, percepatan yang diukur akan menjadi 1G, ketika akselerometer tegak lurus dengan gravitasi, itu akan mengukur 0G.

Sudut kemiringan dapat dihitung dari percepatan terukur dengan menggunakan persamaan ini:

= sin-1 (Percepatan Terukur / Percepatan Gravitasi)

GyroGyro (alias sensor laju) digunakan untuk mengukur kecepatan sudut (ω).

Untuk mendapatkan sudut kemiringan robot, kita perlu mengintegrasikan data dari gyro seperti yang ditunjukkan pada persamaan di bawah ini:

= dθ / dt, = dt

Penggabungan Sensor Gyro dan AkselerometerSetelah mempelajari karakteristik gyro dan akselerometer, kita mengetahui bahwa keduanya memiliki kekuatan dan kelemahan masing-masing. Sudut kemiringan yang dihitung dari data akselerometer memiliki waktu respons yang lambat, sedangkan sudut kemiringan terintegrasi dari data gyro mengalami pergeseran selama periode waktu tertentu. Dengan kata lain, kita dapat mengatakan bahwa data accelerometer berguna untuk jangka panjang sedangkan data gyro berguna untuk jangka pendek.

Tautan untuk pemahaman yang lebih baik: Klik Di Sini

Direkomendasikan: