Sisukord:

MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p): 5 sammu
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p): 5 sammu

Video: MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p): 5 sammu

Video: MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p): 5 sammu
Video: GYROSCOPE LED Control Using Arduino NANO and MPU6050 2024, November
Anonim
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p)
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p)
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p)
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p)
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p)
MPU 6050 güroskoop, kiirendusmõõturi side Arduinoga (Atmega328p)

MPU6050 IMU-l on ühele kiibile integreeritud nii 3-teljeline kiirendusmõõtur kui ka 3-teljeline güroskoop.

Güroskoop mõõdab pöörlemiskiirust või nurgaasendi muutumise kiirust aja jooksul mööda X-, Y- ja Z -telge.

Güroskoobi väljundid on kraadides sekundis, nii et nurgaasendi saamiseks peame lihtsalt nurkkiiruse integreerima.

Teisest küljest mõõdab MPU6050 kiirendusmõõtur kiirendust, mõõtes gravitatsioonikiirendust piki kolme telge ja kasutades mõnda trigonomeetria matemaatikat, saame arvutada anduri positsiooni nurga. Seega, kui me kiirendusmõõturi ja güroskoobi andmed ühendame või ühendame, saame anduri orientatsiooni kohta väga täpset teavet.

MPU-6050 koosneb 3-teljelisest güroskoobist, mis suudab tuvastada pöörlemiskiirust piki x, y, z telge mikroelektromehaanilise süsteemitehnoloogia (MEMS) abil. Kui andurit pööratakse mööda mis tahes telge, tekib Coriolise efekti tõttu vibratsioon, mille tuvastab MEMS. 16-bitist ADC-d kasutatakse pinge digiteerimiseks iga telje proovide võtmiseks. +/- 250, +/- 500, +/- 1000, +/- 2000 on väljundi kogu skaala. Nurkkiirust mõõdetakse piki iga telge kraadides sekundis.

Kasulik link: …………….

Arduino juhatus: …………….

MPU6050 IMU ……………

Samm: MPU-6050 moodul

Moodul MPU-6050
Moodul MPU-6050

MPU-6050 moodulil on 8 kontakti,

INT: katkesta digitaalse väljundi tihvt.

AD0: I2C alam -aadress LSB tihvt. See on 0-bitine seadme 7-bitises alam-aadressis. Kui see on ühendatud VCC -ga, loetakse see loogiliseks ja alam -aadress muutub.

XCL: jadakella lisatihvt. Seda tihvti kasutatakse muude I2C liidese toega andurite SCL pin ühendamiseks MPU-6050-ga.

XDA: abiseeriaandmete tihvt. Seda tihvti kasutatakse muude I2C liidese toega SDA tihvtide ühendamiseks MPU-6050-ga.

SCL: jadakella tihvt. Ühendage see tihvt mikrokontrollerite SCL -tihvtiga. SDA: jadaandmete tihvt. Ühendage see tihvt mikrokontrollerite SDA tihvtiga.

GND: maandusnõel. Ühendage see tihvt maaühendusega.

VCC: toiteplokk. Ühendage see tihvt +5V alalisvooluvõrku. MPU-6050 moodulil on alam-aadress (kui AD0 = 0, st see pole Vcc-ga ühendatud), Slave Write aadress (SLA+W): 0xD0

Alam -lugemisaadress (SLA+R): 0xD1

2. samm: arvutused

Arvutused
Arvutused

MPU6050 mooduli güroskoobi ja kiirendusmõõturi andurite andmed koosnevad 16-bitistest algandmetest 2 täiendi kujul.

MPU6050 mooduli temperatuurianduri andmed koosnevad 16-bitistest andmetest (mitte 2 täiendi kujul).

Oletame nüüd, et oleme valinud,

  • - Kiirendusmõõturi täielik skaala vahemik +/- 2 g tundlikkuse skaala teguriga 16, 384 LSB (arv)/g.
  • - Güroskoobi täielik skaala vahemik +/- 250 °/s ja tundlikkuse skaala tegur 131 LSB (arv)/°/s. siis,

Andurite töötlemata andmete saamiseks peame esmalt kiirendusmõõturi ja güroskoobi andurite andmetega täiendama 2. Pärast anduri algandmete saamist saame kiirenduse ja nurkkiiruse arvutada, jagades anduri algandmed nende tundlikkuse skaala teguriga järgmiselt-

Kiirendusmõõturi väärtused g (jõud)

  • Kiirendus piki X -telge = (kiirendusmõõturi X -telje lähteandmed/16384) g.
  • Kiirendus piki Y -telge = (kiirendusmõõturi Y -telje lähteandmed/16384) g.
  • Kiirendus piki Z -telge = (kiirendusmõõturi Z -telje lähteandmed/16384) g.

Güroskoobi väärtused °/s (kraad sekundis)

  • Nurkkiirus piki X -telge = (güroskoobi X -telje lähteandmed/131) °/s.
  • Nurkkiirus mööda Y -telge = (güroskoobi Y -telje lähteandmed/131) °/s.
  • Nurkkiirus piki Z -telge = (güroskoobi Z -telje lähteandmed/131) °/s.

Temperatuuri väärtus °/c (kraad Celsiuse järgi)

Temperatuur kraadides C = ((temperatuurianduri andmed)/340 + 36,53) °/c.

Näiteks, Oletame, et pärast 2’komplementi saame kiirendusmõõturi X telgede toorväärtuse = +15454

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

Veel,

Nii et me teame, et töötame tundlikkusega +/- 2G ja +/- 250deg/s, kuid kuidas meie väärtused vastavad nendele kiirendustele/nurkadele.

Need on mõlemad sirgjoonelised graafikud ja me saame neist välja mõelda, et 1G jaoks loeme 16384 ja 1 kraadi/sek jaoks 131.07 (kuigi.07 ignoreeritakse binaarsuse tõttu) need väärtused töötati välja lihtsalt joonistades sirgjooneline graafik 2G -ga 32767 ja -2G -32768 ja 250/-250 samade väärtustega.

Nüüd teame oma tundlikkuse väärtusi (16384 ja 131.07), peame lihtsalt oma väärtustest nihked maha võtma ja seejärel tundlikkusega arvestama.

Need toimivad X- ja Y -väärtuste korral hästi, kuid kuna Z registreeriti 1G -ga, mitte 0 -ga, peame enne tundlikkuse jagamist 1G -st (16384) maha võtma.

Samm: ühendused MPU6050-Atmega328p

Ühendused MPU6050-Atmega328p
Ühendused MPU6050-Atmega328p
Ühendused MPU6050-Atmega328p
Ühendused MPU6050-Atmega328p
Ühendused MPU6050-Atmega328p
Ühendused MPU6050-Atmega328p

Lihtsalt ühendage kõik skeemil näidatud viisil…

Ühendused on esitatud järgmiselt:-

MPU6050 Arduino Nano

VCC 5v väljundtihvt

GND Maandustihvt

SDA A4 tihvt // seeriaandmed

SCL A5 pin // jadakell

Pigi ja rulli arvutamine: rull on pöörlemine ümber x-telje ja samm on pöörlemine mööda y-telge.

Tulemus on radiaanides. (teisendage kraadideks, korrutades 180 -ga ja jagades pi -ga)

4. samm: koodid ja selgitused

Koodid ja selgitused
Koodid ja selgitused

/*

Arduino ja MPU6050 kiirendusmõõturi ja güroskoobi anduri õpetus Dejanilt, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C aadressi ujuk AccX, AccY, AccZ; ujuk GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; ujukirull, pigi, nihkumine; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Initsialiseeri side Wire.beginTransmission (MPU); // Alusta suhtlust MPU6050 -ga // MPU = 0x68 Wire.write (0x6B); // Räägi registriga 6B Wire.write (0x00); // Tee lähtestamine - pane 0 6B registrisse Wire.endTransmission (true); // edastuse lõpetamine/* // Kiirendusmõõturi tundlikkuse seadistamine - kogu skaala ulatus (vaikimisi +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Rääkige ACCEL_CONFIG registriga (1C kuuskant) Wire.write (0x10); // Määra registribittideks 00010000 (+/- 8g täisskaala ulatuses) Wire.endTransmission (true); // Güroskoopi tundlikkuse seadistamine - täielik skaalavahemik (vaikimisi +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Rääkige GYRO_CONFIG registriga (1B kuuskant) Wire.write (0x10); // Määra registri bittideks 00010000 (1000deg/s täisskaala) Wire.endTransmission (true); viivitus (20); */ // Helistage sellele funktsioonile, kui teil on vaja saada oma mooduli IMU veaväärtused calc_IMU_error (); viivitus (20); } void loop () {// === Loe kiirendusandmete andmeid === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Alusta registrist 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tõene); // Loe kokku 6 registrit, iga telje väärtus salvestatakse 2 registrisse. Vahemikus +-2 g peame toorväärtused jagama 16384-ga vastavalt andmelehele AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // X-telje väärtus AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y-telje väärtus AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z -telje väärtus // Roll ja Pitch arvutamine kiirendusmõõturi andmete põhjal accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Lisateabe saamiseks vaadake kohandatud funktsiooni calc_IMU_error () accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Güroskoobi andmete lugemine === // previousTime = currentTime; // Eelmine aeg salvestatakse enne tegelikku lugemisaega currentTime = millis (); // Praegune aeg tegelik lugemisaeg möödunudTime = (currentTime - previousTime) / 1000; // Jaga 1000 -ga, et saada sekundit Wire.beginTransmission (MPU); Wire.write (0x43); // Güroskoopiandmete esimese registri aadress 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Loe kokku 4 registrit, iga telje väärtus salvestatakse 2 registrisse GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // 250 kraadi/ s vahemiku jaoks peame esmalt jagama toorväärtuse 131,0 -ga, vastavalt andmelehele GyroY = (Wire.read () << 8 | Wire.read ())/ 131,0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131,0; // Parandage väljundeid arvutatud veaväärtustega GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // Praegu on toorväärtused kraadides sekundites, deg/s, seega peame nurkade kraadides saamiseks korrutama sentondidega, et saada nurk kraadides gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * kulunud aeg; yaw = yaw + GyroZ * kulunud aeg; // Täiendav filter - kiirendusmõõturi ja güroskoopi nurkade väärtuste kombineerimine rull = 0,96 * gyroAngleX + 0,04 * accAngleX; samm = 0,96 * güroNurk + + 0,04 * AKA // Väärtuste printimine jadamonitorile Serial.print (rull); Serial.print ("/"); Jadajälg (samm); Serial.print ("/"); Serial.println (yaw); } void calc_IMU_error () {// Kiirendusmõõturi ja güroskoopiandmete vea arvutamiseks võime seda funktsiooni häälestada seadistusjaotises. Siit saame vea väärtused, mida kasutatakse ülaltoodud võrrandites, mis on trükitud jadamonitorile. // Pange tähele, et õigete väärtuste saamiseks peaksime IMU asetama tasaseks, et saaksime seejärel õiged väärtused // Loe kiirendusmõõturi väärtusi 200 korda, samas kui (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (vale); Wire.requestFrom (MPU, 6, tõene); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Summeerige kõik näidud 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 ++; } // Jagage summa 200 -ga, et saada vea väärtus AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // Loe güroskoopide väärtusi 200 korda, samas (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (vale); Wire.requestFrom (MPU, 6, tõene); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Summeerige kõik näidud GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131,0); c ++; } // Jaga summa 200 -ga, et saada vea väärtus GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Trüki veaväärtused jadamonitorile 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); } ------------------------------------------------- ---------------------------------------------- Tulemused:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Oluline märkus: -----------------

Silmusjaotises alustame kiirendusmõõturi andmete lugemisega. Iga telje andmed salvestatakse 2 baiti või registrisse ja nende registrite aadresse näeme anduri andmelehelt.

Nende kõigi lugemiseks alustame esimesest registrist ja funktsiooni RequestFrom () abil palume lugeda kõik 6 X, Y ja Z telje registrit. Seejärel loeme iga registri andmed ja kuna väljundid täiendavad kahekaupa, ühendame need õigesti, et saada õiged väärtused.

Samm: kaldenurga mõistmine

Kiirendusmõõtur

Maa gravitatsioon on pidev kiirendus, kus jõud on alati suunatud Maa keskpunkti alla.

Kui kiirendusmõõtur on gravitatsiooniga paralleelne, on mõõdetud kiirendus 1G, kui kiirendusmõõtur on gravitatsiooniga risti, siis 0G.

Kaldenurka saab arvutada mõõdetud kiirenduse põhjal, kasutades järgmist võrrandit:

θ = sin-1 (mõõdetud kiirendus / raskuskiirendus)

Nurkkiiruse (ω) mõõtmiseks kasutatakse GyroGyro (teise nimega kiiruseandurit).

Roboti kaldenurga saamiseks peame integreerima güroskoobi andmed, nagu on näidatud allolevas võrrandis:

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

Pärast güroskoopi ja kiirendusmõõturi omaduste uurimist teame, et neil on oma tugevad ja nõrgad küljed. Kiirendusmõõturi andmete põhjal arvutatud kaldenurk on aeglase reageerimisajaga, samal ajal kui güroskoopiliste andmete integreeritud kaldenurk langeb teatud aja jooksul triivi. Teisisõnu võime öelda, et kiirendusmõõturi andmed on kasulikud pikaajaliselt, güroskoopilised andmed aga lühiajaliselt.

Link paremaks mõistmiseks: klõpsake siin

Soovitan: