INHOUDSOPGAWE:

MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p): 5 stappe
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p): 5 stappe

Video: MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p): 5 stappe

Video: MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p): 5 stappe
Video: MPU-6050 Gyroscope Teapot demo 3D simulation 2024, Julie
Anonim
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p)
MPU 6050 Gyro, versnellingsmeterkommunikasie met Arduino (Atmega328p)

Die MPU6050 IMU het beide 3-as versnellingsmeter en 3-as gyroscoop geïntegreer op 'n enkele chip.

Die gyroscoop meet rotasiesnelheid of veranderingsnelheid van die hoekposisie oor tyd, langs die X-, Y- en Z -as.

Die uitsette van die gyroscoop is in grade per sekonde, dus om die hoekposisie te kry, hoef ons net die hoeksnelheid te integreer.

Aan die ander kant, die MPU6050 -versnellingsmeter meet versnelling deur die gravitasieversnelling langs die 3 asse te meet en met behulp van 'n trigonometrie wiskunde kan ons die hoek bereken waarteen die sensor geplaas is. As ons dus die versnellingsmeter en die gyroscoopdata versmelt of kombineer, kan ons baie akkurate inligting kry oor die sensororiëntasie.

3-as gyroscoop Die MPU-6050 bestaan uit 'n 3-as gyroscoop wat rotasiesnelheid langs die x, y, z-as kan opspoor met mikro-elektromeganiese stelseltegnologie (MEMS). As die sensor langs enige as gedraai word, word 'n vibrasie veroorsaak as gevolg van die Coriolis-effek wat deur die MEMS opgespoor word. 16-bis ADC word gebruik om spanning te digitaliseer om elke as te monster. +/- 250, +/- 500, +/- 1000, +/- 2000 is die volledige omvang van die uitset. Hoeksnelheid word gemeet langs elke as in graad per sekonde eenheid.

Nuttige skakel: …………….

Arduino -raad: ………..

MPU6050 IMU ……………

Stap 1: MPU-6050-module

MPU-6050 Module
MPU-6050 Module

Die MPU-6050-module het 8 penne,

INT: Onderbreek digitale uitsetpen.

AD0: I2C Slave Address LSB pin. Dit is die 0ste bis in die 7-bis slawe-adres van die toestel. As dit aan VCC gekoppel is, word dit gelees as logiese een en slawe -adres verander.

XCL: Auxiliary Serial Clock pin. Hierdie pen word gebruik om ander SCL-pen met I2C-koppelvlak aan te sluit op MPU-6050.

XDA: Auxiliary Serial Data -pen. Hierdie pen word gebruik om ander SDA-pen van die I2C-koppelvlak met MPU-6050 aan te sluit.

SCL: Serial Clock pin. Koppel hierdie pen aan die mikrobeheerders SCL -pen. SDA: Serial Data pin. Koppel hierdie pen aan die mikro -beheerders SDA -pen.

GND: Grondpen. Koppel hierdie pen aan die grondverbinding.

VCC: Kragtoevoerpen. Koppel hierdie pen aan +5V DC voeding. MPU-6050-module het 'n slaafadres (wanneer AD0 = 0, dit wil sê dit is nie aan Vcc gekoppel nie) as, Slawe Skryf adres (SLA+W): 0xD0

Slave -leesadres (SLA+R): 0xD1

Stap 2: Berekeninge

Berekeninge
Berekeninge

Gyroscoop- en versnellingsmetersensordata van die MPU6050-module bestaan uit 16-bis rou data in 2 se komplementvorm.

Temperatuursensordata van die MPU6050-module bestaan uit 16-bis data (nie in komplimentvorm van 2 nie).

Veronderstel nou dat ons gekies het,

  • - Versnellingsmeter volle omvang van +/- 2g met sensitiwiteitskaalfaktor van 16, 384 LSB (telling)/g.
  • - Gyroscoop volle omvang van +/- 250 °/s met 'n sensitiwiteitsskaalfaktor van 131 LSB (telling)/°/s. dan,

Om sensor -rou data te verkry, moet ons eers die aanvulling van 2 op sensordata van die versnellingsmeter en die gyroscoop uitvoer. Nadat ons sensor rou data gekry het, kan ons die versnelling en hoeksnelheid bereken deur die sensor rou data met hul sensitiwiteit skaalfaktor soos volg te deel-

Versnellingsmeterwaardes in g (g krag)

  • Versnelling langs die X -as = (Accelerometer X -as rou data/16384) g.
  • Versnelling langs die Y -as = (Accelerometer Y -as rou data/16384) g.
  • Versnelling langs die Z -as = (Accelerometer Z -as rou data/16384) g.

Gyroscoopwaardes in °/s (graad per sekonde)

  • Hoeksnelheid langs die X -as = (Gyroskoop X -as rou data/131) °/s.
  • Hoeksnelheid langs die Y -as = (Gyroskoop Y -as rou data/131) °/s.
  • Hoeksnelheid langs die Z -as = (Gyroskoop Z -as rou data/131) °/s.

Temperatuurwaarde in °/c (graad per Celsius)

Temperatuur in grade C = ((temperatuursensordata)/340 + 36,53) °/c.

Byvoorbeeld, Gestel, na 2 'komplement kry ons versnellingsmeter X -as rou waarde = +15454

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

Meer,

Ons weet dus dat ons met 'n sensitiwiteit van +/- 2G en +/- 250deg/s werk, maar hoe stem ons waardes ooreen met die versnellings/hoeke.

Dit is albei reguitlyngrafieke, en ons kan daaruit uitwerk dat ons vir 1G 16384 sal lees en vir 1 grade/sek. 131.07 (hoewel die.07 as gevolg van die ignoreer sal word), word hierdie waardes net uitgewerk deur die reguitlyngrafiek met 2G by 32767 en -2G by -32768 en 250/-250 by dieselfde waardes.

Ons ken dus ons sensitiwiteitswaardes (16384 en 131.07), maar ons moet net die afwykings van ons waardes verminder en dan deur die sensitiwiteit deel.

Dit sal goed werk vir die X- en Y -waardes, maar aangesien die Z by 1G aangeteken is en nie 0 nie, sal ons 1G (16384) moet afskakel voordat ons deur ons sensitiwiteit deel.

Stap 3: MPU6050-Atmega328p-verbindings

MPU6050-Atmega328p-verbindings
MPU6050-Atmega328p-verbindings
MPU6050-Atmega328p-verbindings
MPU6050-Atmega328p-verbindings
MPU6050-Atmega328p-verbindings
MPU6050-Atmega328p-verbindings

Koppel net alles soos in die diagram aangedui …

Die verbindings word soos volg gegee:-

MPU6050 Arduino Nano

VCC 5v uitpen

GND Grondpen

SDA A4 -pen // seriële data

SCL A5 -pen // seriële klok

Pitch and Roll Berekening: Roll is die rotasie om die x-as en die toonhoogte is die rotasie langs die y-as.

Die resultaat is in radiale. (skakel om na grade deur te vermenigvuldig met 180 en deel met pi)

Stap 4: Kodes en verduidelikings

Kodes en verduidelikings
Kodes en verduidelikings

/*

Arduino en MPU6050 versnellingsmeter en gyroscoop sensor handleiding deur Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C adres float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; ongeldige opstelling () {Serial.begin (19200); Wire.begin (); // Initialiseer kommunikasie Wire.beginTransmission (MPU); // Begin kommunikasie met MPU6050 // MPU = 0x68 Wire.write (0x6B); // Praat met die register 6B Wire.write (0x00); // Herstel - plaas 'n 0 in die 6B -register Wire.endTransmission (waar); // die transmissie beëindig/* // Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Praat met die ACCEL_CONFIG -register (1C hex) Wire.write (0x10); // Stel die registerstukke in as 00010000 (+/- 8g volgrootte reeks) Wire.endTransmission (waar); // Gyrosensitiwiteit opstel - Volledige omvang (standaard +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Praat met die GYRO_CONFIG -register (1B hex) Wire.write (0x10); // Stel die registerstukke in as 00010000 (1000deg/s volskaal) Wire.endTransmission (waar); vertraging (20); */ // Bel hierdie funksie as u die IMU -foutwaardes vir u module moet bereken calc_IMU_error (); vertraging (20); } leemte -lus () {// === Lees versneller -data === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Begin met register 0x3B (ACCEL_XOUT_H) Wire.endTransmission (vals); Wire.requestFrom (MPU, 6, waar); // Lees 6 registers in totaal, elke aswaarde word in 2 registers gestoor // Vir 'n reeks van +-2g moet ons die rou waardes met 16384 verdeel volgens die datablad AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // X-as waarde AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y-as waarde AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // waarde Z -as // Bereken rol en toonhoogte uit die versnellingsmeter data accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Sien die persoonlike funksie bereken_IMU_fout () vir meer besonderhede accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1.58) // === Lees gyroscoop data === // previousTime = currentTime; // Vorige tyd word gestoor voor die werklike tyd gelees currentTime = millis (); // Huidige tyd werklike tyd lees verstrykTyd = (huidige tyd - vorige tyd) / 1000; // Verdeel deur 1000 om sekondes te kry Wire.beginTransmission (MPU); Wire.write (0x43); // Gyro -data registreer eers adres 0x43 Wire.endTransmission (vals); Wire.requestFrom (MPU, 6, waar); // Lees 4 registers in totaal, elke aswaarde word in 2 registers gestoor GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Vir 'n 250deg/ s -reeks moet ons eers die rou waarde met 131,0 deel, volgens die datablad GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Stel die uitsette reg met die berekende foutwaardes GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Tans is die rou waardes in grade per sekonde, deg/s, dus moet ons met sendonds (s) vermenigvuldig om die hoek in grade te kry gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * verstrykTyd; yaw = yaw + GyroZ * elapsedTime; // Aanvullende filter - kombineer versneller- en gyrohoekwaardes rol = 0.96 * gyroAngleX + 0.04 * accAngleX; toonhoogte = 0,96 * gyroAngleY + 0,04 * accAngleY; // Druk die waardes af op die seriële monitor Serial.print (rol); Serial.print ("/"); Reeks.afdruk (toonhoogte); Serial.print ("/"); Serial.println (yaw); } void bereken_IMU_fout () {// Ons kan hierdie funksie in die opstelafdeling noem om die versnellingsmeter en die gyrodatafout te bereken. Van hier af kry ons die foutwaardes wat in die bogenoemde vergelykings gebruik word, op die Serial Monitor gedruk. // Let daarop dat ons die IMU plat moet plaas om die regte waardes te kry, sodat ons dan die korrekte waardes kan lees // Lees versnellingsmeterwaardes 200 keer terwyl (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (vals); Wire.requestFrom (MPU, 6, waar); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Som alle lesings 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 ++; } // Deel die som met 200 om die foutwaarde AccErrorX = AccErrorX /200 te kry; AccErrorY = AccErrorY / 200; c = 0; // Lees gyrowaardes 200 keer terwyl (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (vals); Wire.requestFrom (MPU, 6, waar); GyroX = Wire.read () << 8 | Draad.lees (); GyroY = Wire.read () << 8 | Draad.lees (); GyroZ = Wire.read () << 8 | Draad.lees (); // Som alle lesings GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Verdeel die som met 200 om die foutwaarde GyroErrorX = GyroErrorX /200 te kry; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Druk die foutwaardes af op die 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); } ------------------------------------------------- ---------------------------------------------- Resultate:-X = Y = Z = ----------------------------------------------------- ----------------------------------------------- Belangrike nota: -----------------

In die lusgedeelte begin ons met die lees van die versnellingsmeterdata. Die data vir elke as word in 2 grepe of registers gestoor, en ons kan die adresse van hierdie registers sien uit die datablad van die sensor.

Om dit alles te kan lees, begin ons met die eerste register, en met die requiestFrom () -funksie versoek ons om al 6 registers vir die X-, Y- en Z -as te lees. Dan lees ons die data uit elke register, en omdat die uitsette twee -twee komplementeer, kombineer ons dit gepas om die korrekte waardes te kry.

Stap 5: Begrip van kantelhoek

Versnellingsmeter

Die swaartekrag van die aarde is 'n konstante versnelling waar die krag altyd na die middel van die aarde wys.

As die versnellingsmeter parallel met die gravitasie is, sal die gemete versnelling 1G wees, as die versnellingsmeter loodreg op die gravitasie is, sal dit 0G meet.

Kantelhoek kan bereken word uit die gemete versnelling deur die volgende vergelyking te gebruik:

θ = sin-1 (Gemete versnelling / gravitasieversnelling)

GyroGyro (ook bekend as koersensor) word gebruik om die hoeksnelheid (ω) te meet.

Om die kantelhoek van 'n robot te kry, moet ons die data van die gyro integreer soos in die vergelyking hieronder getoon:

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

Gyro- en versnellingsmetersensorfusie Nadat ons die eienskappe van beide gyro- en versnellingsmeter bestudeer het, weet ons dat hulle hul eie sterk en swak punte het. Die berekende kantelhoek van die versnellingsmeterdata het 'n stadige reaksietyd, terwyl die geïntegreerde kantelhoek van die gyrodata oor 'n tydperk ondergaan word. Met ander woorde, ons kan sê dat die versnellingsmeterdata nuttig is vir die lang termyn, terwyl die gyrodata nuttig is vir die korttermyn.

Skakel vir 'n beter begrip: klik hier

Aanbeveel: