Mündəricat:

MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p): 5 addım
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p): 5 addım

Video: MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p): 5 addım

Video: MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p): 5 addım
Video: Arduino nano and MPU6050 (Accelerometer gyroscope) 2024, Iyul
Anonim
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p)
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p)
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p)
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p)
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p)
MPU 6050 Gyro, Arduino ilə Akselerometr Əlaqəsi (Atmega328p)

MPU6050 IMU, tək çipdə birləşdirilmiş 3 Eksenli akselerometr və 3 Eksenli giroskopa malikdir.

Jiroskop, X, Y və Z oxları boyunca zamanla bucaq mövqeyinin fırlanma sürətini və ya dəyişmə sürətini ölçür.

Jiroskopun çıxışları saniyədə dərəcədir, buna görə açısal mövqe əldə etmək üçün bucaq sürətini birləşdirməliyik.

Digər tərəfdən, MPU6050 sürətölçən, 3 eksen boyunca cazibə sürətini ölçməklə və bəzi trigonometriya riyazi istifadə edərək, sensorun yerləşdiyi bucağı hesablayaraq sürətləndirməni ölçür. Beləliklə, akselerometr və giroskop məlumatlarını birləşdirsək və ya birləşdirsək, sensorun oriyentasiyası haqqında çox dəqiq məlumat əldə edə bilərik.

3 eksenli giroskop MPU-6050, mikroelektrik mexaniki sistem texnologiyası (MEMS) ilə x, y, z oxu boyunca fırlanma sürətini təyin edə bilən 3 oxlu giroskopdan ibarətdir. Sensor hər hansı bir ox boyunca döndükdə, MEMS tərəfindən aşkar edilən Coriolis effekti səbəbindən bir titrəmə meydana gəlir. 16-bit ADC, hər oxu nümunə etmək üçün gərginliyi rəqəmləşdirmək üçün istifadə olunur. +/- 250, +/- 500, +/- 1000, +/- 2000 tam miqyaslı çıxış diapazonudur. Açısal sürət, hər ox boyunca saniyədə vahid dərəcəsi ilə ölçülür.

Faydalı link: …………….

Arduino lövhəsi: ……….

MPU6050 IMU ……………

Addım 1: MPU-6050 Modulu

MPU-6050 Modulu
MPU-6050 Modulu

MPU-6050 modulu 8 sancağa malikdir,

INT: Rəqəmsal çıxış pinini kəsin.

AD0: I2C Kölə Ünvan LSB pin. Bu, cihazın 7 bitlik kölə ünvanındakı 0-cı bitdir. VCC -yə qoşulduqda, məntiq və kölə ünvan dəyişiklikləri olaraq oxunur.

XCL: Köməkçi Serial Saat pin. Bu pin, digər I2C interfeysli SCL pinini MPU-6050-ə bağlamaq üçün istifadə olunur.

XDA: Köməkçi Serial Məlumat pin. Bu pin, digər I2C interfeysli SDA pinini MPU-6050-ə bağlamaq üçün istifadə olunur.

SCL: Serial Saat pin. Bu pimi SCL pin mikrokontrolörlərinə bağlayın. SDA: Serial Məlumat pin. Bu pini mikro nəzarətçilərə SDA pininə bağlayın.

GND: Torpaq pimi. Bu pimi torpaq bağlantısına qoşun.

VCC: Enerji təchizatı pin. Bu pimi +5V DC qaynağına qoşun. MPU-6050 modulu Slave ünvanına malikdir (AD0 = 0 olduqda, yəni Vcc ilə əlaqəli deyil), Kölə Yazma ünvanı (SLA+W): 0xD0

Slave Read ünvanı (SLA+R): 0xD1

Addım 2: Hesablamalar

Hesablamalar
Hesablamalar

MPU6050 modulunun giroskop və akselerometr sensoru məlumatları 2-nin tamamlayıcı formasında 16 bitlik xam məlumatlardan ibarətdir.

MPU6050 modulunun temperatur sensoru məlumatları 16 bitlik məlumatlardan ibarətdir (2-nin tamamlayıcı formasında deyil).

İndi düşünək ki, seçmişik,

  • - 16, 384 LSB (Count)/g Həssaslıq Ölçü Faktoru ilə +/- 2g sürətləndirici tam miqyaslı aralıq.
  • - 131 LSB (Count)/°/s Həssaslıq Ölçeği Faktoru ilə +/- 250 °/s tam miqyaslı giroskop. sonra,

Sensor xam məlumatlarını əldə etmək üçün əvvəlcə Accelerometer və giroskopun sensor məlumatları üzərində 2 -nin tamamlamasını yerinə yetirməliyik. Sensor xam məlumatlarını əldə etdikdən sonra, sensor xam məlumatlarını həssaslıq miqyası faktoruna bölməklə sürətlənməni və bucaq sürətini hesablaya bilərik:

Akselerometr dəyərləri g (g qüvvəsi)

  • X oxu boyunca sürətlənmə = (Accelerometer X axis raw data/16384) g.
  • Y oxu boyunca sürətlənmə = (Accelerometer Y axis raw data/16384) g.
  • Z oxu boyunca sürətlənmə = (Accelerometer Z axis raw data/16384) g.

Jiroskop dəyərləri °/s (saniyədə dərəcə)

  • X oxu boyunca bucaq sürəti = (Gyroscope X axis raw data/131) °/s.
  • Y oxu boyunca bucaq sürəti = (Giroskop Y oxu xam məlumatları/131) °/s.
  • Z oxu boyunca bucaq sürəti = (Giroskop Z oxu xam məlumatları/131) °/s.

İstilik dəyəri °/c (Selsi dərəcəsi)

Temperatur dərəcə C = ((temperatur sensoru məlumatları)/340 + 36.53) °/c.

Misal üçün, Tutaq ki, 2 'tamamlandıqdan sonra, X oxları sürətləndiricisinin xam dəyəri = +15454 əldə edirik

Sonra Ax = +15454/16384 = 0.94 g.

Daha çox,

Beləliklə, +/- 2G və +/- 250deg/s həssaslıqla işlədiyimizi bilirik, amma dəyərlərimiz bu sürətlərə/açılara necə uyğundur?

Bunlar həm düz xətt qrafikləridir, həm də onlardan öyrənə bilərik ki, 1G üçün 16384 oxuyacağıq və 1 dərəcə/saniyə üçün 131.07 oxuyacağıq (.07 ikili səbəbdən nəzərə alınmasa da) bu dəyərlər yalnız rəsm çəkməklə işlənmişdir. 32767 -də 2G və -32768 -də -2G və eyni dəyərlərdə 250/-250 olan düz xətt qrafiki.

Beləliklə, indi həssaslıq dəyərlərimizi bilirik (16384 və 131.07), dəyərlərimizdən kənarlaşmaları çıxarmalı və sonra həssaslığa bölməliyik.

Bunlar X və Y dəyərləri üçün yaxşı işləyəcək, ancaq Z 1G -də qeyd olunduğu üçün 0 deyil, həssaslığımıza bölünməzdən əvvəl 1G (16384) çıxartmalıyıq.

Addım 3: MPU6050-Atmega328p Əlaqələri

MPU6050-Atmega328p Əlaqələri
MPU6050-Atmega328p Əlaqələri
MPU6050-Atmega328p Əlaqələri
MPU6050-Atmega328p Əlaqələri
MPU6050-Atmega328p Əlaqələri
MPU6050-Atmega328p Əlaqələri

Yalnız hər şeyi diaqramda göstərildiyi kimi bağlayın …

Bağlantılar aşağıdakı kimi verilir:-

MPU6050 Arduino Nano

VCC 5v çıxışı

GND Torpaq pin

SDA A4 pin // seriya məlumatları

SCL A5 pin // seriyalı saat

Pitch və Roll Hesablanması: Roll x-ox ətrafında fırlanma və meydança y oxu boyunca fırlanmadır.

Nəticə radianda verilir. (180 -ə vuraraq və pi -yə bölməklə dərəcələrə çevirin)

Addım 4: Kodlar və izahlar

Kodlar və izahlar
Kodlar və izahlar

/*

Arduino və MPU6050 Accelerometer və Gyroscope Sensor Tutorial by Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C ünvan float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, meydança, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Wire.beginTransmission (MPU) ünsiyyətini başladın; // MPU6050 ilə ünsiyyətə başlayın // MPU = 0x68 Wire.write (0x6B); // 6B Wire.write (0x00) reyestri ilə danışın; // Sıfırla - 6B Wire.endTransmission qeydinə 0 qoyun (doğru); // ötürməni dayandırın/* // Accelerometer Həssaslığını Konfiqurasiya edin - Tam Ölçək Aralığı (standart +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // ACCEL_CONFIG qeydiyyatı ilə danışın (1C hex) Wire.write (0x10); // Qeyd bitlərini 00010000 (+/- 8g tam miqyaslı aralıq) olaraq təyin edin Wire.endTransmission (doğru); // Gyro Həssaslığını Konfiqurasiya edin - Tam Ölçək Aralığı (standart +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // GYRO_CONFIG qeydiyyatı ilə danışın (1B hex) Wire.write (0x10); // Qeyd bitlərini 00010000 (1000deg/s tam miqyaslı) olaraq təyin edin Wire.endTransmission (doğru); gecikmə (20); */ // Modulunuz üçün IMU səhv dəyərlərini almaq istəyirsinizsə, bu funksiyaya zəng edin calc_IMU_error (); gecikmə (20); } void loop () {// === Acceleromter məlumatlarını oxuyun === // Wire.beginTransmission (MPU); Wire.write (0x3B); // 0x3B reyestri ilə başlayın (ACCEL_XOUT_H) Wire.endTransmission (yalan); Wire.requestFrom (MPU, 6, doğru); // Ümumilikdə 6 registr oxuyun, hər bir ox dəyəri 2 qeyddə saxlanılır // +-2g aralığında, AccX = (Wire.read () << 8 məlumat cədvəlinə əsasən, xam dəyərləri 16384-ə bölməliyik. | Wire.read ()) / 16384.0; // X oxunun dəyəri AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y oxunun dəyəri AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z oxunun dəyəri // AccAngleX accelerometer məlumatlarından Roll və Pitch hesablanması accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Daha ətraflı məlumat üçün calc_IMU_error () xüsusi funksiyasına baxın accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Giroskop məlumatlarını oxuyun === // previousTime = currentTime; // Əvvəlki vaxt, oxunan currentTime = millis () faktiki vaxtından əvvəl saxlanılır; // Cari vaxt oxunan faktiki vaxt elapsedTime = (currentTime - previousTime) / 1000; // Saniyələr əldə etmək üçün 1000 -ə bölün Wire.beginTransmission (MPU); Wire.write (0x43); // Gyro məlumatlarının ilk qeydiyyat ünvanı 0x43 Wire.endTransmission (yalan); Wire.requestFrom (MPU, 6, doğru); // Ümumilikdə 4 registr oxuyun, hər ox dəyəri 2 qeyddə saxlanılır GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // 250deg/ s aralığında GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // GyroX = GyroX + 0.56 hesablanmış səhv dəyərləri ilə çıxışları düzəldin; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Hal-hazırda xam dəyərlər saniyədə dərəcədir, deg/s, buna görə bucağı dərəcə ilə almaq üçün gondroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Tamamlayıcı filtr - acceleromter və gyro açı dəyərlərini birləşdirin = 0.96 * gyroAngleX + 0.04 * accAngleX; addım = 0.96 * gyroAngleY + 0.04 * accAngleY; // Serial.print (roll) seriyalı monitorda dəyərləri çap edin; Serial.print ("/"); Serial.çap (meydança); Serial.print ("/"); Serial.println (yaw); } void calc_IMU_error () {// Accelerometer və gyro data səhvini hesablamaq üçün bu funksiyanı quraşdırma bölməsində adlandıra bilərik. Buradan Serial Monitorda çap olunan yuxarıdakı tənliklərdə istifadə edilən səhv dəyərlərini alacağıq. // Diqqət yetirin ki, düzgün dəyərləri əldə etmək üçün IMU -nu düz yerləşdirməliyik, sonra düzgün dəyərləri əldə edə bilərik // Accelerometer dəyərlərini 200 dəfə oxuyun (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (yanlış); Wire.requestFrom (MPU, 6, doğru); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Bütün oxunuşları topla 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 ++; } // Cəmi 200 -ə bölün və AccErrorX = AccErrorX /200 səhv dəyərini əldə edin; AccErrorY = AccErrorY / 200; c = 0; // gyro dəyərlərini 200 dəfə oxuyun (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (yanlış); Wire.requestFrom (MPU, 6, doğru); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Bütün oxunuşları topla GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // GyroErrorX = GyroErrorX /200 səhv dəyərini əldə etmək üçün cəmi 200 -ə bölün; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Serial Monitor Serial.print ("AccErrorX:") səhv dəyərlərini çap edin; 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); } ------------------------------------------------- ---------------------------------------------- Nəticələr:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Vacib Qeyd: -----------------

Döngü bölməsində, sürətləndirici məlumatlarını oxumaqla başlayırıq. Hər ox üçün məlumatlar 2 baytda və ya qeydlərdə saxlanılır və bu qeydlərin ünvanlarını sensorun məlumat cədvəlindən görə bilərik.

Hamısını oxumaq üçün ilk qeyddən başlayırıq və RequiestFrom () funksiyasından istifadə edərək X, Y və Z oxları üçün bütün 6 registrin oxunmasını tələb edirik. Sonra hər bir qeyddəki məlumatları oxuyuruq və nəticələr iki tamamlayıcı olduğundan doğru dəyərləri əldə etmək üçün onları uyğun şəkildə birləşdiririk.

Addım 5: Tilt Bucağını Anlayın

Akselerometr

Yerin cazibə qüvvəsi, qüvvənin həmişə Yerin mərkəzinə işarə etdiyi sabit bir sürətdir.

Akselerometr cazibə qüvvəsinə paralel olduqda, ölçülmüş sürətlənmə 1G olacaq, akselerometr cazibə qüvvəsinə dik olduqda 0G ölçəcək.

Əyilmə bucağı bu tənlikdən istifadə edərək ölçülmüş sürətlənmədən hesablana bilər:

θ = sin-1 (Ölçülmüş Sürətləndirmə / Ağırlıq Sürəti)

GyroGyro (aka dərəcəsi sensoru) bucaq sürətini (ω) ölçmək üçün istifadə olunur.

Robotun əyilmə bucağını əldə etmək üçün gyrodakı məlumatları aşağıdakı tənlikdə göstərildiyi kimi birləşdirməliyik:

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

Gyro və Accelerometer Sensor Fusion Həm cayro, həm də akselerometrin xüsusiyyətlərini öyrəndikdən sonra bilirik ki, onların öz güclü və zəif tərəfləri var. Akselerometr məlumatlarından hesablanan əyilmə bucağı yavaş cavab müddətinə malikdir, girro məlumatlarından inteqrasiya olunmuş əyilmə bucağı müəyyən müddət ərzində sürüşməyə məruz qalır. Başqa sözlə, akselerometr məlumatlarının uzun müddətli, girro məlumatlarının isə qısa müddətli üçün faydalı olduğunu söyləyə bilərik.

Daha yaxşı başa düşmək üçün link: Bura basın

Tövsiyə: