Indholdsfortegnelse:
- Trin 1: MPU-6050-modul
- Trin 2: Beregninger
- Trin 3: MPU6050-Atmega328p-forbindelser
- Trin 4: Koder og forklaringer
- Trin 5: Forstå Tilt Angle
Video: MPU 6050 Gyro, accelerometerkommunikation med Arduino (Atmega328p): 5 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:26
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-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
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
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
/*
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:
DIY MPU-6050 USB Joystick: 5 trin
DIY MPU-6050 USB Joystick: Med Microsoft Flight Simulator 2020 indså jeg hurtigt, hvor svært det er at bruge tastatur til at flyve en plan. Når jeg søgte online, kunne jeg ikke finde et joystick til en rimelig pris at købe. De fleste onlineforhandlere havde dem udsolgt. Populariteten af M
Sistema De Prevenção De Deslizamentos Com Sensor MPU-6050: 6 trin
Sistema De Prevenção De Deslizamentos Com Sensor MPU-6050: O sensor MPU-6050 é um chip que possui um acelerômetro e um giroscópio tipo MEMS. São 3 eixos para o acelerômetro e 3 eixos para o giroscópio, sendo ao todo 6 graus de liberdade (6DOF). Vamos aprender a desenvolver um protótipo de um system of preve
Sådan måles vinkel med MPU-6050 (GY-521): 3 trin
Sådan måles vinkel med MPU-6050 (GY-521): I denne instruks vil vi måle vinkel med en Arduino. Vi har brug for nogle kabler, en Arduino UNO og GY-521 (MPU-6050) for at måle vinkel
Realtime MPU-6050/A0 datalogning med Arduino og Android: 7 trin (med billeder)
Realtime MPU-6050/A0 datalogning med Arduino og Android: Jeg har været interesseret i at bruge Arduino til maskinlæring. Som et første trin vil jeg bygge en realtime (eller temmelig tæt på det) datavisning og logger med en Android -enhed. Jeg vil fange accelerometerdata fra MPU-6050, så jeg designer
LED Gyro Sphere - Arduino: 5 trin (med billeder)
LED Gyro Sphere - Arduino: Byg denne unikke, seje interaktive fritstående LED -sfære med flere sensorer, der kan bruges til at give en sjov platform for videre udvikling - interaktion, belysning eller spil. Enheden er 3D -printet og bruger et Arduino Board, Gyro Board, Audi