Sisällysluettelo:

MPU 6050 Gyro, kiihtyvyysmittarin kommunikointi Arduinon kanssa (Atmega328p): 5 vaihetta
MPU 6050 Gyro, kiihtyvyysmittarin kommunikointi Arduinon kanssa (Atmega328p): 5 vaihetta

Video: MPU 6050 Gyro, kiihtyvyysmittarin kommunikointi Arduinon kanssa (Atmega328p): 5 vaihetta

Video: MPU 6050 Gyro, kiihtyvyysmittarin kommunikointi Arduinon kanssa (Atmega328p): 5 vaihetta
Video: Как использовать гироскоп, акселерометр, магнитометр MPU-9250 для Arduino 2024, Heinäkuu
Anonim
MPU 6050 Gyro, kiihtyvyysmittariyhteys Arduinon kanssa (Atmega328p)
MPU 6050 Gyro, kiihtyvyysmittariyhteys Arduinon kanssa (Atmega328p)
MPU 6050 Gyro, kiihtyvyysmittariyhteys Arduinon kanssa (Atmega328p)
MPU 6050 Gyro, kiihtyvyysmittariyhteys Arduinon kanssa (Atmega328p)
MPU 6050 Gyro, kiihtyvyysmittariyhteys Arduinon kanssa (Atmega328p)
MPU 6050 Gyro, kiihtyvyysmittariyhteys Arduinon kanssa (Atmega328p)

MPU6050 IMU: ssa on sekä 3-akselinen kiihtyvyysanturi että 3-akselinen gyroskooppi integroitu yhteen siruun.

Gyroskooppi mittaa pyörimisnopeuden tai kulma -asennon muutosnopeuden ajan mittaan X-, Y- ja Z -akselilla.

Gyroskoopin lähdöt ovat asteina sekunnissa, joten kulma -aseman saamiseksi meidän on vain integroitava kulmanopeus.

Toisaalta MPU6050 -kiihtyvyysmittari mittaa kiihtyvyyttä mittaamalla painovoimakiihtyvyyttä kolmella akselilla ja käyttämällä trigonometriamatematiikkaa voimme laskea kulman, johon anturi on sijoitettu. Joten jos sulattamme tai yhdistämme kiihtyvyysmittarin ja gyroskoopin tiedot, voimme saada erittäin tarkkoja tietoja anturin suunnasta.

3-akselinen gyroskooppi MPU-6050 koostuu 3-akselisesta gyroskoopista, joka pystyy havaitsemaan pyörimisnopeuden x, y, z-akselia pitkin mikroelektronisen mekaanisen järjestelmätekniikan (MEMS) avulla. Kun anturia pyöritetään mitä tahansa akselia pitkin, MEMS: n havaitsema Coriolis-vaikutus aiheuttaa värähtelyä. 16-bittistä ADC: tä käytetään jännitteen digitointiin näytteenottoon jokaiselta akselilta. +/- 250, +/- 500, +/- 1000, +/- 2000 ovat koko ulostuloväli. Kulmanopeus mitataan kullakin akselilla asteina sekunnissa.

Hyödyllinen linkki: …………….

Arduino Board: …………….

MPU6050 IMU ……………

Vaihe 1: MPU-6050-moduuli

MPU-6050-moduuli
MPU-6050-moduuli

MPU-6050-moduulissa on 8 nastaa,

INT: Keskeytä digitaalinen lähtö.

AD0: I2C -orjaosoitteen LSB -nasta. Tämä on 0. bitti laitteen 7-bittisessä orjaosoitteessa. Jos se on kytketty VCC: hen, se luetaan loogisena ja orjaosoite muuttuu.

XCL: Sarjakellon lisätappi. Tätä nastaa käytetään liittämään muita I2C-liitäntää tukevia SCL-antureita MPU-6050: een.

XDA: Sarjadatanapit. Tätä nastaa käytetään liittämään muita I2C-liitäntää tukevia SDA-antureita MPU-6050: een.

SCL: Sarjakellon nasta. Liitä tämä nasta mikro -ohjaimen SCL -nastaan. SDA: Sarjatiedon pin. Liitä tämä nasta mikro -ohjaimen SDA -nastaan.

GND: Maadoitustappi. Liitä tämä nasta maadoitusliitäntään.

VCC: virtalähteen tappi. Kytke tämä nasta +5V DC -virtalähteeseen. MPU-6050-moduulilla on orjaosoite (kun AD0 = 0, eli sitä ei ole kytketty Vcc: hen), Orja Kirjoita osoite (SLA+W): 0xD0

Slave Read -osoite (SLA+R): 0xD1

Vaihe 2: Laskut

Laskelmat
Laskelmat

MPU6050-moduulin gyroskoopin ja kiihtyvyysanturin anturitiedot koostuvat 16-bittisestä raakatiedosta 2: n komplementtimuodossa.

MPU6050-moduulin lämpötila-anturitiedot koostuvat 16-bittisestä datasta (ei 2: n komplementtimuodossa).

Oletetaan nyt, että olemme valinneet

  • - Kiihtyvyysmittarin koko asteikkoalue +/- 2 g ja herkkyysasteikon kerroin 16, 384 LSB (määrä)/g.
  • - Gyroskoopin koko asteikkoalue +/- 250 °/s ja herkkyysasteikko 131 LSB (Count)/°/s. sitten,

Jotta saisimme raakadatan, meidän on ensin suoritettava 2: n täydennys kiihtyvyysanturin ja gyroskoopin anturitiedoille. Kun olemme saaneet anturin raakatiedot, voimme laskea kiihtyvyyden ja kulmanopeuden jakamalla anturin raakatiedot niiden herkkyysasteikolla seuraavasti:-

Kiihtyvyysmittarin arvot (g)

  • Kiihtyvyys X -akselia pitkin = (kiihtyvyysmittarin X -akselin raakatiedot/16384) g.
  • Kiihtyvyys Y -akselia pitkin = (kiihtyvyysmittarin Y -akselin raakatiedot/16384) g.
  • Kiihtyvyys Z -akselia pitkin = (kiihtyvyysmittarin Z -akselin raakatiedot/16384) g.

Gyroskoopin arvot °/s (aste sekunnissa)

  • Kulmanopeus X -akselia pitkin = (Gyroskoopin X -akselin raakatiedot/131) °/s.
  • Kulmanopeus Y -akselia pitkin = (Gyroskoopin Y -akselin raakatiedot/131) °/s.
  • Kulmanopeus Z -akselia pitkin = (Gyroskoopin Z -akselin raakatiedot/131) °/s.

Lämpötila -arvo °/c (celsius -aste)

Lämpötila asteina C = ((lämpötila -anturin tiedot)/340 + 36,53) °/c.

Esimerkiksi, Oletetaan, että 2’komplementin jälkeen saamme kiihtyvyysmittarin X akselin raaka -arvon = +15454

Sitten Axe = +15454/16384 = 0,94 g.

Lisää,

Tiedämme siis, että käytämme +/- 2G ja +/- 250deg/s herkkyyttä, mutta miten arvomme vastaavat näitä kiihtyvyyksiä/kulmia.

Nämä molemmat ovat suoraviivaisia kaavioita, ja voimme päätellä niistä, että 1G: n lukema on 16384 ja 1 astetta/sekunti 131.07 (vaikka.07 jätetään huomiotta binäärin vuoksi) nämä arvot on vain laskettu piirtämällä suorakaavio, jossa 2G 32767 ja -2G -32768 ja 250/-250 samoilla arvoilla.

Joten nyt tiedämme herkkyysarvomme (16384 ja 131.07), meidän on vain vähennettävä arvojemme siirtymät ja sitten otettava huomioon herkkyys.

Nämä toimivat hyvin X- ja Y -arvoille, mutta koska Z rekisteröitiin 1G: llä eikä 0: lla, meidän on vähennettävä 1G (16384) ennen kuin jaamme herkkyytemme.

Vaihe 3: MPU6050-Atmega328p-yhteydet

MPU6050-Atmega328p-liitännät
MPU6050-Atmega328p-liitännät
MPU6050-Atmega328p-liitännät
MPU6050-Atmega328p-liitännät
MPU6050-Atmega328p-liitännät
MPU6050-Atmega328p-liitännät

Liitä vain kaikki kaavion mukaisesti…

Liitännät on annettu seuraavasti:-

MPU6050 Arduino Nano

VCC 5v ulostulo

GND Maadoitustappi

SDA A4 -nasta // sarjatiedot

SCL A5 -nasta // sarjakello

Pitch and Roll -laskenta: Roll on kierto x-akselin ympäri ja piki on kiertymä y-akselia pitkin.

Tulos on radiaaneina. (Muunna asteiksi kertomalla 180 ja jakamalla pi)

Vaihe 4: Koodit ja selitykset

Koodit ja selitykset
Koodit ja selitykset

/*

Dejanin Arduino- ja MPU6050 -kiihtyvyysanturi- ja gyroskooppianturin opetusohjelma, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C -osoite float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; kelluva rulla, piki, kääntö; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Alusta viestintä Wire.beginTransmission (MPU); // Aloita viestintä MPU6050: n kanssa // MPU = 0x68 Wire.write (0x6B); // Puhu rekisterille 6B Wire.write (0x00); // Tee nollaus - aseta 0 6B -rekisteriin Wire.endTransmission (true); // lopeta lähetys/* // Määritä kiihtyvyysmittarin herkkyys - koko skaala -alue (oletus +/- 2 g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Puhu ACCEL_CONFIG -rekisterille (1C hex) Wire.write (0x10); // Aseta rekisteribittien arvoksi 00010000 (+/- 8 g koko asteikolla) Wire.endTransmission (true); // Gyroherkkyyden määrittäminen - koko skaala -alue (oletus +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Puhu GYRO_CONFIG -rekisterille (1B hex) Wire.write (0x10); // Aseta rekisteribittien arvoksi 00010000 (1000 asteen/asteikon koko asteikolla) Wire.endTransmission (true); viive (20); */ // Kutsu tämä toiminto, jos haluat saada IMU -virhearvot moduulillesi calc_IMU_error (); viive (20); } void loop () {// === Lue kiihtyvyysmittarin tiedot === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Aloita rekisterillä 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tosi); // Lue yhteensä 6 rekisteriä, jokainen akselin arvo tallennetaan kahteen rekisteriin // Alueelle +-2 g meidän on jaettava raaka-arvot 16384: llä taulukon mukaisesti AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // X-akselin arvo AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y-akselin arvo AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z -akselin arvo // Rullan ja nousun laskeminen kiihtyvyysmittarin tiedoista accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Katso lisätietoja custom_IMU_error () -funktiosta accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Lue gyroskoopin tiedot === // previousTime = currentTime; // Edellinen aika tallennetaan ennen varsinaista lukemisaikaa currentTime = millis (); // Nykyinen aika todellinen lukemisaika kulunutTime = (currentTime - previousTime) / 1000; // Jaa 1000 saadaksesi sekunteja Wire.beginTransmission (MPU); Wire.write (0x43); // Gyro -datan ensimmäisen rekisterin osoite 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tosi); // Lue yhteensä 4 rekisteriä, jokainen akselin arvo tallennetaan kahteen rekisteriin GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Jos lämpötila on 250 astetta/ s, meidän on ensin jaettava raaka -arvo 131,0: lla GyroY = (Wire.read () << 8 | Wire.read ())/ 131,0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Korjaa lähdöt lasketuilla virhearvoilla GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // Raaka-arvot ovat tällä hetkellä asteina sekunnissa, astetta/s, joten meidän on kerrottava sentonteilla saadaksemme kulman asteina gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = kääntö + GyroZ * kulunut aika; // Täydentävä suodatin - yhdistä kiihtyvyysanturin ja gyroskoopin kulma -arvot rulla = 0,96 * gyroAngleX + 0,04 * accAngleX; piki = 0,96 * gyroAngleY + 0,04 * accAngleY; // Tulosta arvot sarjamonitorille Serial.print (roll); Serial.print ("/"); Sarjajälki (piki); Serial.print ("/"); Sarja.println (kääntyminen); } void calc_IMU_error () {// Voimme kutsua tätä toimintoa asennusosassa laskemaan kiihtyvyysmittarin ja gyro -datavirheen. Täältä saamme virhearvot, joita käytetään yllä olevissa yhtälöissä, jotka on painettu sarjamonitoriin. // Huomaa, että meidän pitäisi sijoittaa IMU tasaiseksi saadaksemme oikeat arvot, jotta voimme sitten saada oikeat arvot // Lue kiihtyvyysmittarin arvot 200 kertaa, kun taas (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tosi); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Laske yhteen kaikki lukemat 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 ++; } // Jaa summa 200: lla saadaksesi virhearvon AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // Lue gyroarvot 200 kertaa, kun (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tosi); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Laske yhteen kaikki lukemat GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Jaa summa 200: lla saadaksesi virhearvon GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Tulosta virhearvot sarjamittarille 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); } ------------------------------------------------- ---------------------------------------------- Tulokset:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Tärkeä muistiinpano: -----------------

Silmukkaosassa aloitamme lukemalla kiihtyvyysmittarin tiedot. Kunkin akselin tiedot tallennetaan 2 tavuun tai rekisteriin, ja näemme näiden rekisterien osoitteet anturin datalehdestä.

Jotta voisimme lukea ne kaikki, aloitamme ensimmäisestä rekisteristä ja käyttämällä RequestFrom () -funktiota pyydämme lukemaan kaikki 6 X-, Y- ja Z -akselin rekisteriä. Sitten luemme tiedot jokaisesta rekisteristä ja koska lähdöt täydentävät kahta, yhdistämme ne oikein saadaksemme oikeat arvot.

Vaihe 5: Kallistuskulman ymmärtäminen

Kiihtyvyysmittari

Maan painovoima on jatkuva kiihtyvyys, jossa voima osoittaa aina alaspäin maan keskipisteeseen.

Kun kiihtyvyysmittari on yhdensuuntainen painovoiman kanssa, mitattu kiihtyvyys on 1G, kun kiihtyvyysmittari on kohtisuorassa painovoiman kanssa, se mittaa 0G.

Kallistuskulma voidaan laskea mitatusta kiihtyvyydestä käyttämällä tätä yhtälöä:

θ = sin-1 (mitattu kiihtyvyys / painovoiman kiihtyvyys)

GyroGyroa (eli nopeusanturia) käytetään kulmanopeuden (ω) mittaamiseen.

Saadaksemme robotin kallistuskulman meidän on integroitava gyroskoopin tiedot alla olevan yhtälön mukaisesti:

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

Gyroskooppi- ja kiihtyvyysmittarianturi Fusion Tutkittuamme sekä gyroskoopin että kiihtyvyysanturin ominaisuudet tiedämme, että niillä on omat vahvuutensa ja heikkoutensa. Kiihtyvyysmittaritiedoista lasketulla kallistuskulmalla on hidas vasteaika, kun taas gyro -datan integroidulla kallistuskulmalla on ajautumista ajan kuluessa. Toisin sanoen voimme sanoa, että kiihtyvyysmittarin tiedot ovat hyödyllisiä pitkällä aikavälillä, kun taas gyro -tiedot ovat hyödyllisiä lyhyellä aikavälillä.

Linkki parempaan ymmärrykseen: Klikkaa tästä

Suositeltava: