Indholdsfortegnelse:

MPU 6050 Gyro, accelerometerkommunikation med Arduino (Atmega328p): 5 trin
MPU 6050 Gyro, accelerometerkommunikation med Arduino (Atmega328p): 5 trin

Video: MPU 6050 Gyro, accelerometerkommunikation med Arduino (Atmega328p): 5 trin

Video: MPU 6050 Gyro, accelerometerkommunikation med Arduino (Atmega328p): 5 trin
Video: Arduino Nano and GY-521 MPU6050 3-осевой гироскоп, 3-осевой акселерометр и DMP 2024, November
Anonim
MPU 6050 Gyro, accelerometer -kommunikation med Arduino (Atmega328p)
MPU 6050 Gyro, accelerometer -kommunikation med Arduino (Atmega328p)
MPU 6050 Gyro, accelerometer -kommunikation med Arduino (Atmega328p)
MPU 6050 Gyro, accelerometer -kommunikation med Arduino (Atmega328p)
MPU 6050 Gyro, accelerometer -kommunikation med Arduino (Atmega328p)
MPU 6050 Gyro, accelerometer -kommunikation med Arduino (Atmega328p)

MPU6050 IMU har både 3-akset accelerometer og 3-akset gyroskop integreret på en enkelt chip.

Gyroskopet måler rotationshastighed eller ændringshastighed for vinkelpositionen over tid langs X-, Y- og Z -aksen.

Gyroskopets output er i grader pr. Sekund, så for at få vinkelpositionen skal vi bare integrere vinkelhastigheden.

På den anden side måler MPU6050 accelerometer acceleration ved at måle gravitationsacceleration langs de 3 akser og ved hjælp af en vis trigonometri matematik kan vi beregne den vinkel, sensoren er placeret ved. Så hvis vi smelter eller kombinerer accelerometer- og gyroskopdata, kan vi få meget nøjagtige oplysninger om sensorretningen.

3-akset gyroskop MPU-6050 består af et 3-akset gyroskop, der kan registrere rotationshastighed langs x, y, z-aksen med mikroelektromekanisk systemteknologi (MEMS). Når sensoren roteres langs en hvilken som helst akse, frembringes der en vibration på grund af Coriolis-effekt, som detekteres af MEMS. 16-bit ADC bruges til at digitalisere spænding for at prøve hver akse. +/- 250, +/- 500, +/- 1000, +/- 2000 er outputområdet i fuld skala. Vinkelhastighed måles langs hver akse i grad pr. Sekund enhed.

Nyttigt link: …………….

Arduino Board:. ……….

MPU6050 IMU ……………

Trin 1: MPU-6050-modul

MPU-6050 modul
MPU-6050 modul

MPU-6050-modulet har 8 ben,

INT: Afbryd digital output pin.

AD0: I2C Slave Address LSB pin. Dette er enhedens 0. bit i 7-bit slave-adresse. Hvis den er tilsluttet VCC, læses den som en logik og ændringer i slaveadresse.

XCL: Auxiliary Serial Clock pin. Denne pin bruges til at forbinde andre I2C interface aktiverede sensorer SCL pin til MPU-6050.

XDA: Hjælp til serielle data. Denne pin bruges til at forbinde andre I2C interface aktiverede sensorer SDA pin til MPU-6050.

SCL: Seriel urstift. Tilslut denne pin til mikrokontroller SCL pin. SDA: Serial Data pin. Tilslut denne pin til mikrokontroller SDA pin.

GND: Jordstift. Tilslut denne pin til jordforbindelse.

VCC: Strømforsyningsstift. Tilslut denne pin til +5V DC forsyning. MPU-6050-modulet har Slave-adresse (Når AD0 = 0, dvs. det er ikke forbundet til Vcc) som, Slave Skriv adresse (SLA+W): 0xD0

Slave Læs adresse (SLA+R): 0xD1

Trin 2: Beregninger

Beregninger
Beregninger

Gyroskop- og accelerometer-sensordata i MPU6050-modulet består af 16-bit rådata i 2’ers komplementform.

Temperatursensordata for MPU6050-modulet består af 16-bit data (ikke i 2’ers komplementform).

Antag nu, at vi har valgt,

  • - Accelerometer fuld skala på +/- 2g med følsomhedsskalefaktor på 16, 384 LSB (tælling)/g.
  • - Gyroskop i fuld skala på +/- 250 °/s med følsomhedsskalefaktor på 131 LSB (tælling)/°/s. derefter,

For at få sensordata, skal vi først udføre 2’ers komplement på sensordata fra Accelerometer og gyroskop. Efter at have fået sensordata kan vi beregne acceleration og vinkelhastighed ved at dividere sensordata med deres følsomhedsskalafaktor som følger-

Accelerometerværdier i g (g kraft)

  • Acceleration langs X -aksen = (Accelerometer X -akse rådata/16384) g.
  • Acceleration langs Y -aksen = (Accelerometer Y -akse rådata/16384) g.
  • Acceleration langs Z -aksen = (Accelerometer Z -aksens rådata/16384) g.

Gyroskopværdier i °/s (grad pr. Sekund)

  • Vinkelhastighed langs X -aksen = (Gyroskop X -akse rådata/131) °/s.
  • Vinkelhastighed langs Y -aksen = (Gyroskop Y -aksens rådata/131) °/s.
  • Vinkelhastighed langs Z -aksen = (Gyroskop Z -aksens rådata/131) °/s.

Temperaturværdi i °/c (grad pr. Celsius)

Temperatur i grader C = ((temperatursensordata)/340 + 36,53) °/c.

For eksempel, Antag, at efter 2’komplement får vi accelerometer X -akser råværdi = +15454

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

Mere,

Så vi ved, at vi kører med en følsomhed på +/- 2G og +/- 250deg/s, men hvordan svarer vores værdier til disse accelerationer/vinkler.

Disse er begge lige linjediagrammer, og vi kan regne ud fra dem, at for 1G vil vi læse 16384 og i 1 grader/sek vil vi læse 131,07 (Selvom.07 vil blive ignoreret på grund af binær) blev disse værdier bare beregnet ved at tegne lige linje graf med 2G ved 32767 og -2G ved -32768 og 250/-250 ved de samme værdier.

Så nu kender vi vores følsomhedsværdier (16384 og 131.07), vi skal bare minus forskydningerne fra vores værdier og derefter dividere med følsomheden.

Disse fungerer fint for X- og Y -værdierne, men da Z blev registreret ved 1G og ikke 0, skal vi minus 1G (16384), før vi dividerer med vores følsomhed.

Trin 3: MPU6050-Atmega328p-forbindelser

MPU6050-Atmega328p-forbindelser
MPU6050-Atmega328p-forbindelser
MPU6050-Atmega328p-forbindelser
MPU6050-Atmega328p-forbindelser
MPU6050-Atmega328p-forbindelser
MPU6050-Atmega328p-forbindelser

Tilslut bare alt som vist i diagrammet …

Forbindelserne er givet som følger:-

MPU6050 Arduino Nano

VCC 5v ud pin

GND Jordstift

SDA A4 pin // serielle data

SCL A5 pin // serielt ur

Beregning af pitch og roll: Roll er rotationen omkring x-aksen og pitch er rotationen langs y-aksen.

Resultatet er i radianer. (konverter til grader ved at gange med 180 og dividere med pi)

Trin 4: Koder og forklaringer

Koder og forklaringer
Koder og forklaringer

/*

Arduino og MPU6050 Accelerometer og Gyroscope Sensor Tutorial af Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C adresse float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; flyde rulle, pitch, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Initialiser kommunikation Wire.beginTransmission (MPU); // Start kommunikation med MPU6050 // MPU = 0x68 Wire.write (0x6B); // Tal med registret 6B Wire.write (0x00); // Foretag nulstilling - placer en 0 i 6B -registret Wire.endTransmission (true); // afslut transmissionen/* // Konfigurer accelerationsfølsomhed - fuld skala (standard +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Tal med ACCEL_CONFIG -registret (1C hex) Wire.write (0x10); // Indstil registerbitene som 00010000 (+/- 8g fuld skala) Wire.endTransmission (true); // Konfigurer gyrosensitivitet - fuld skala (standard +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Tal med GYRO_CONFIG -registret (1B hex) Wire.write (0x10); // Indstil registerbitene som 00010000 (1000deg/s fuld skala) Wire.endTransmission (true); forsinkelse (20); */ // Ring til denne funktion, hvis du har brug for at få IMU -fejlværdierne for dit modul calcul_IMU_error (); forsinkelse (20); } void loop () {// === Læs acceleromter data === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Start med register 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Læs 6 registre i alt, hver akseværdi gemmes i 2 registre // For et område på +-2g skal vi dividere råværdierne med 16384, ifølge databladet AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // X-akse værdi AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y-akse værdi AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z -akse værdi // Beregning af rulle og pitch fra accelerometerets data accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Se beregnings_IMU_fejl () brugerdefineret funktion for flere detaljer accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1.58) // === Læs gyroskopdata === // previousTime = currentTime; // Tidligere tid gemmes før den faktiske tid læs currentTime = millis (); // Aktuel tid faktisk tid læst elapsedTime = (currentTime - previousTime) / 1000; // Divider med 1000 for at få sekunder Wire.beginTransmission (MPU); Wire.write (0x43); // Gyro -data første registeradresse 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Læs 4 registre i alt, hver akseværdi gemmes i 2 registre GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // For et interval på 250 grader/ s skal vi først dividere råværdien med 131,0, ifølge databladet GyroY = (Wire.read () << 8 | Wire.read ())/ 131,0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Ret outputene med de beregnede fejlværdier GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0.8) // I øjeblikket er råværdierne i grader pr. Sekund, deg/s, så vi skal gange med sendonds (s) for at få vinklen i grader gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * forløbet tid; yaw = yaw + GyroZ * elapsedTime; // Komplementær filter - kombiner acceleromter- og gyrovinkelværdierulle = 0,96 * gyroAngleX + 0,04 * accAngleX; pitch = 0,96 * gyroAngleY + 0,04 * accAngleY; // Udskriv værdierne på den serielle skærm Serial.print (rulle); Serial.print ("/"); Serial.print (pitch); Serial.print ("/"); Serial.println (yaw); } ugid calculate_IMU_error () {// Vi kan kalde denne funktion i opsætningsafsnittet for at beregne accelerometeret og gyrodatafejl. Herfra får vi de fejlværdier, der bruges i ovenstående ligninger, udskrevet på Serial Monitor. // Bemærk, at vi skal placere IMU fladt for at få de korrekte værdier, så vi derefter kan de korrekte værdier // Læs accelerometerværdier 200 gange mens (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (falsk); Wire.requestFrom (MPU, 6, true); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Sum alle aflæsninger 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 ++; } // Del summen med 200 for at få fejlværdien AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // Læs gyroværdier 200 gange, mens (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (falsk); Wire.requestFrom (MPU, 6, true); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Sum alle aflæsninger GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Del summen med 200 for at få fejlværdien GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Udskriv fejlværdierne på 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); } ------------------------------------------------- ---------------------------------------------- Resultater:-X = Y = Z = ----------------------------------------------------- ----------------------------------------------- Vigtig note: -----------------

I loop -sektionen starter vi med at læse accelerometerets data. Dataene for hver akse er gemt i 2 bytes eller registre, og vi kan se adresserne på disse registre fra sensorens datablad.

For at læse dem alle starter vi med det første register, og ved hjælp af funktionen requiestFrom () anmoder vi om at læse alle 6 registre for X-, Y- og Z -akserne. Derefter læser vi dataene fra hvert register, og fordi output er to -to komplementerer, kombinerer vi dem passende for at få de korrekte værdier.

Trin 5: Forstå Tilt Angle

Accelerometer

Jordens tyngdekraft er en konstant acceleration, hvor kraften altid peger ned til midten af jorden.

Når accelerometeret er parallelt med tyngdekraften, vil den målte acceleration være 1G, når accelerometeret er vinkelret på tyngdekraften, måler det 0G.

Tiltvinkel kan beregnes ud fra den målte acceleration ved hjælp af denne ligning:

θ = sin-1 (målt acceleration / tyngdekraftacceleration)

GyroGyro (aka rate sensor) bruges til at måle vinkelhastigheden (ω).

For at få en robots tiltvinkel skal vi integrere dataene fra gyroen som vist i nedenstående ligning:

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

Gyro og accelerometer sensorfusion Efter at have undersøgt egenskaberne ved både gyro og accelerometer ved vi, at de har deres egne styrker og svagheder. Den beregnede tiltvinkel fra accelerometerdataene har langsom responstid, mens den integrerede tiltvinkel fra gyrodataene udsættes for drift over en periode. Med andre ord kan vi sige, at accelerometerdataene er nyttige på lang sigt, mens gyrodataene er nyttige på kort sigt.

Link for bedre forståelse: Klik her

Anbefalede: