Isi kandungan:

MPU 6050 Gyro, Accelerometer Communication With Arduino (Atmega328p): 5 Langkah
MPU 6050 Gyro, Accelerometer Communication With Arduino (Atmega328p): 5 Langkah

Video: MPU 6050 Gyro, Accelerometer Communication With Arduino (Atmega328p): 5 Langkah

Video: MPU 6050 Gyro, Accelerometer Communication With Arduino (Atmega328p): 5 Langkah
Video: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, Julai
Anonim
MPU 6050 Gyro, Accelerometer Communication with Arduino (Atmega328p)
MPU 6050 Gyro, Accelerometer Communication with Arduino (Atmega328p)
MPU 6050 Gyro, Accelerometer Communication with Arduino (Atmega328p)
MPU 6050 Gyro, Accelerometer Communication with Arduino (Atmega328p)
MPU 6050 Gyro, Accelerometer Communication with Arduino (Atmega328p)
MPU 6050 Gyro, Accelerometer Communication with Arduino (Atmega328p)

MPU6050 IMU mempunyai giroskop 3-Axis dan giroskop 3-Axis yang disepadukan pada satu cip.

Giroskop mengukur kelajuan putaran atau kadar perubahan kedudukan sudut dari masa ke masa, di sepanjang paksi X, Y dan Z.

Keluaran giroskop berada dalam darjah sesaat, jadi untuk mendapatkan kedudukan sudut, kita hanya perlu mengintegrasikan halaju sudut.

Sebaliknya, akselerometer MPU6050 mengukur pecutan dengan mengukur pecutan gravitasi sepanjang 3 paksi dan menggunakan beberapa matematik trigonometri kita dapat mengira sudut di mana sensor diposisikan. Oleh itu, jika kita menggabungkan, atau menggabungkan data akselerometer dan giroskop, kita dapat memperoleh maklumat yang sangat tepat mengenai orientasi sensor.

Giroskop 3 paksi MPU-6050 terdiri daripada giroskop 3 paksi yang dapat mengesan halaju putaran di sepanjang paksi x, y, z dengan teknologi sistem mekanikal elektro mikro (MEMS). Apabila sensor diputar di sepanjang paksi getaran dihasilkan kerana kesan Coriolis yang dikesan oleh MEMS.16-bit ADC digunakan untuk mendigitalkan voltan untuk mengambil sampel setiap paksi. + / - 250, +/- 500, +/- 1000, +/- 2000 adalah keluaran skala penuh. Halaju sudut diukur sepanjang setiap paksi dalam darjah setiap unit.

Pautan Berguna: …………….

Papan Arduino:. ……….

MPU6050 IMU ……………

Langkah 1: Modul MPU-6050

Modul MPU-6050
Modul MPU-6050

Modul MPU-6050 mempunyai 8 pin,

INT: Ganggu pin output digital.

AD0: Pin LSB Alamat Hamba I2C. Ini adalah bit ke-0 dalam alamat hamba 7-bit peranti. Sekiranya disambungkan ke VCC maka ia dibaca sebagai logik dan perubahan alamat hamba.

XCL: Pin Jam Bersiri Auxiliary. Pin ini digunakan untuk menyambungkan sensor SCL pin antara muka antara muka I2C yang lain ke MPU-6050.

XDA: Pin Data Siri Tambahan. Pin ini digunakan untuk menyambungkan pin SDA sensor yang membolehkan antara muka I2C lain ke MPU-6050.

SCL: Pin Jam Bersiri. Sambungkan pin ini ke pin SCL mikrokontroler. SDA: Pin Data Bersiri. Sambungkan pin ini ke pin SDA mikrokontroler.

GND: Pin tanah. Sambungkan pin ini ke sambungan tanah.

VCC: Pin bekalan kuasa. Sambungkan pin ini ke bekalan DC + 5V. Modul MPU-6050 mempunyai alamat Slave (Ketika AD0 = 0, iaitu tidak disambungkan ke Vcc) sebagai, Alamat Slave Write (SLA + W): 0xD0

Alamat Slave Read (SLA + R): 0xD1

Langkah 2: Pengiraan

Pengiraan
Pengiraan

Data sensor giroskop dan Accelerometer modul MPU6050 terdiri daripada data mentah 16-bit dalam bentuk pelengkap 2.

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

Sekarang andaikan kita telah memilih,

  • - Julat skala penuh Accelerometer +/- 2g dengan Faktor Skala Sensitiviti 16, 384 LSB (Kiraan) / g.
  • - Julat skala penuh giroskop +/- 250 ° / s dengan Faktor Skala Sensitiviti 131 LSB (Kiraan) / ° / s. kemudian,

Untuk mendapatkan data mentah sensor, pertama-tama kita perlu melakukan pelengkap 2 pada data sensor Accelerometer dan giroskop. Setelah mendapat data mentah sensor, kita dapat mengira pecutan dan halaju sudut dengan membahagikan data mentah sensor dengan faktor skala kepekaannya seperti berikut--

Nilai pecutan dalam g (daya g)

  • Pecutan sepanjang paksi X = (Data mentah paksi Accelerometer X / 16384) g.
  • Pecutan di sepanjang paksi Y = (Data mentah paksi Y Accelerometer / 16384) g.
  • Pecutan di sepanjang paksi Z = (data mentah paksi Z Accelerometer / 16384) g.

Nilai giroskop dalam ° / s (darjah sesaat)

  • Halaju sudut sepanjang paksi X = (data mentah sumbu Giroskop X / 131) ° / s.
  • Halaju sudut sepanjang paksi Y = (data mentah paksi Y Giroskop / 131) ° / s.
  • Halaju sudut di sepanjang paksi Z = (data mentah paksi Z giroskop / 131) ° / s.

Nilai suhu dalam ° / c (darjah per Celsius)

Suhu dalam darjah C = ((data sensor suhu) / 340 + 36.53) ° / c.

Sebagai contoh, Anggaplah, setelah pelengkap 2 'kita mendapat akselerometer X nilai mentah = +15454

Kemudian Ax = +15454/16384 = 0.94 g.

Lebih banyak lagi,

Oleh itu, kita tahu bahawa kita berjalan pada sensitiviti +/- 2G dan +/- 250deg / s tetapi bagaimana nilai kita sesuai dengan pecutan / sudut tersebut.

Ini adalah kedua-dua graf garis lurus dan kita dapat mengatasinya bahawa untuk 1G kita akan membaca 16384 dan untuk 1 darjah / saat kita akan membaca 131.07 (Walaupun.07 akan diabaikan kerana binari) nilai-nilai ini baru saja dibuat dengan melukis graf garis lurus dengan 2G pada 32767 dan -2G pada -32768 dan 250 / -250 pada nilai yang sama.

Oleh itu, sekarang kita mengetahui nilai kepekaan kita (16384 dan 131.07) kita hanya perlu tolak ofset dari nilai kita dan kemudian selisih dengan kepekaan.

Ini akan berfungsi dengan baik untuk nilai X dan Y tetapi kerana Z dicatat pada 1G dan bukan 0, kita perlu tolak 1G (16384) sebelum kita membahagi dengan kepekaan kita.

Langkah 3: Sambungan MPU6050-Atmega328p

Sambungan MPU6050-Atmega328p
Sambungan MPU6050-Atmega328p
Sambungan MPU6050-Atmega328p
Sambungan MPU6050-Atmega328p
Sambungan MPU6050-Atmega328p
Sambungan MPU6050-Atmega328p

Cukup Sambungkan semua seperti yang ditunjukkan dalam rajah…

Sambungan diberikan seperti berikut: -

MPU6050 Arduino Nano

Pin keluar VCC 5v

Pin Ground GND

Pin bersiri SDA A4 // data bersiri

Pin bersiri SCL A5 // jam bersiri

Pengiraan Pitch and Roll: Roll adalah putaran di sekitar paksi-x dan pitch adalah putaran di sepanjang paksi-y.

Hasilnya adalah dalam radian. (tukar menjadi darjah dengan mengalikan dengan 180 dan membahagi dengan pi)

Langkah 4: Kod dan Penjelasan

Kod dan Penjelasan
Kod dan Penjelasan

/*

Tutorial Arduino dan MPU6050 Accelerometer and Gyroscope Sensor oleh Dejan, https://howtomechatronics.com * / #masuk const int MPU = 0x68; // Alamat MPU6050 I2C terapung AccX, AccY, AccZ; terapung GyroX, GyroY, GyroZ; terapung accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw; terapung AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float berlaluTime, currentTime, sebelumnyaTime; int c = 0; persediaan tidak sah () {Serial.begin (19200); Wire.begin (); // Memulakan komunikasi Wire.beginTransmission (MPU); // Mulakan komunikasi dengan MPU6050 // MPU = 0x68 Wire.write (0x6B); // Bercakap dengan daftar 6B Wire.write (0x00); // Buat semula - letakkan 0 ke dalam daftar 6B Wire.endTransmission (benar); // tamatkan penghantaran / * // Konfigurasikan Sensitiviti Accelerometer - Julat Skala Penuh (lalai +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Bercakap dengan register ACCEL_CONFIG (1C hex) Wire.write (0x10); // Tetapkan bit daftar sebagai 00010000 (+/- 8g skala penuh) Wire.endTransmission (true); // Konfigurasikan Sensitiviti Giro - Julat Skala Penuh (lalai +/- 250deg / s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Bercakap dengan daftar GYRO_CONFIG (1B hex) Wire.write (0x10); // Tetapkan bit daftar sebagai 00010000 (skala 1000deg / s penuh) Wire.endTransmission (true); kelewatan (20); * / // Panggil fungsi ini jika anda perlu mendapatkan nilai ralat IMU untuk modul anda calcul_IMU_error (); kelewatan (20); } gelung void () {// === Baca data pecutan === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Mulakan dengan mendaftar 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, benar); // Baca 6 daftar keseluruhan, setiap nilai paksi disimpan dalam 2 daftar // Untuk julat + -2g, kita perlu membahagikan nilai mentah dengan 16384, menurut lembar data AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Nilai paksi-X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Nilai paksi-Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Nilai paksi-Z // Mengira Roll and Pitch dari akselerometer data accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Lihat fungsi kustom_IMU_error () untuk keterangan lebih lanjut accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Baca data giroskop === // previousTime = currentTime; // Masa sebelumnya disimpan sebelum waktu sebenar membaca currentTime = millis (); // Masa semasa masa sebenar dibaca berlaluTime = (currentTime - sebelumnyaTime) / 1000; // Bahagikan dengan 1000 untuk mendapatkan detik Wire.beginTransmission (MPU); Wire.write (0x43); // Gyro data alamat pertama alamat 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, benar); // Baca 4 daftar keseluruhan, setiap nilai paksi disimpan dalam 2 register GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Untuk julat 250deg / s kita harus membahagikan terlebih dahulu nilai mentah dengan 131.0, menurut lembaran data GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Betulkan output dengan nilai ralat yang dikira GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Pada masa ini nilai mentah dalam darjah per saat, deg / s, jadi kita perlu mengalikan dengan sendond untuk mendapatkan sudut dalam darjah gyroAngleX = gyroAngleX + GyroX * berlaluTime; // deg / s * s = deg gyroAngleY = gyroAngleY + GyroY * berlalu Masa; yaw = yaw + GyroZ * masa berlalu; // Penapis pelengkap - gabungkan nilai nilai pecutan dan sudut giro = 0.96 * gyroAngleX + 0.04 * accAngleX; nada = 0.96 * gyroAngleY + 0.04 * accAngleY; // Cetak nilai pada monitor bersiri Serial.print (roll); Cetakan bersiri ("/"); Cetakan bersiri (nada); Cetakan bersiri ("/"); Serial.println (yaw); } batal calcul_IMU_error () {// Kita boleh memanggil fungsi ini di bahagian persediaan untuk mengira pecutan pecutan dan data giro. Dari sini kita akan mendapat nilai ralat yang digunakan dalam persamaan di atas yang dicetak pada Serial Monitor. // Perhatikan bahawa kita harus meletakkan IMU rata untuk mendapatkan nilai yang tepat, sehingga kita dapat memperoleh nilai yang benar // Baca nilai akselerometer 200 kali sementara (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (palsu); 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 ++; } // Bahagikan jumlahnya dengan 200 untuk mendapatkan nilai ralat AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Baca nilai giro 200 kali semasa (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (palsu); Wire.requestFrom (MPU, 6, benar); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Jumlahkan semua bacaan GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Bahagikan jumlahnya dengan 200 untuk mendapatkan nilai ralat GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Cetak nilai ralat 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 = --------------------------------------------- ----------------------------------------------- Nota PENTING: - ----------------

Di bahagian gelung kita mulakan dengan membaca data pecutan. Data untuk setiap paksi disimpan dalam 2 byte atau register dan kita dapat melihat alamat register ini dari lembar data sensor.

Untuk membaca semuanya, kita mulakan dengan register pertama, dan menggunakan fungsi requiestFrom (), kami meminta untuk membaca semua 6 register untuk paksi X, Y dan Z. Kemudian kami membaca data dari setiap daftar, dan kerana outputnya adalah dua pelengkap, kami menggabungkannya dengan tepat untuk mendapatkan nilai yang betul.

Langkah 5: Memahami Tilt Angle

Pecut

Graviti bumi adalah pecutan berterusan di mana daya sentiasa menunjuk ke pusat Bumi.

Apabila pecutan selari dengan graviti, pecutan yang diukur akan menjadi 1G, ketika akselerometer adalah tegak lurus dengan graviti, ia akan mengukur 0G.

Sudut kecondongan dapat dihitung dari pecutan yang diukur dengan menggunakan persamaan ini:

θ = sin-1 (Pecutan Diukur / Pecutan Graviti)

GyroGyro (a.k.a. sensor rate) digunakan untuk mengukur halaju sudut (ω).

Untuk mendapatkan sudut kecondongan robot, kita perlu mengintegrasikan data dari gyro seperti yang ditunjukkan dalam persamaan di bawah:

ω = dθ / dt, θ = ∫ ω dt

Gyro dan Accelerometer Sensor Fusion Setelah mengkaji ciri-ciri gyro dan accelerometer, kita tahu bahawa mereka mempunyai kekuatan dan kelemahan masing-masing. Sudut kemiringan yang dikira dari data akselerometer mempunyai masa tindak balas yang perlahan, sedangkan sudut kecondongan yang terintegrasi dari data giro dikenakan arah melayang dalam jangka waktu tertentu. Dengan kata lain, kita dapat mengatakan bahawa data pecutan berguna untuk jangka panjang sementara data giro berguna untuk jangka pendek.

Pautan untuk pemahaman yang lebih baik: Klik Di Sini

Disyorkan: