Sadržaj:

Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): 5 koraka
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): 5 koraka

Video: Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): 5 koraka

Video: Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): 5 koraka
Video: Arduino and MPU6050 Accelerometer and Gyroscope Short #arduino #electromechanics 2024, Prosinac
Anonim
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p)
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p)
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p)
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p)
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p)
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p)

MPU6050 IMU ima troosni akcelerometar i troosni žiroskop integrirani na jednom čipu.

Žiroskop mjeri brzinu rotacije ili brzinu promjene kutnog položaja tijekom vremena, duž osi X, Y i Z.

Izlazi žiroskopa su u stupnjevima u sekundi, pa da bismo dobili kutni položaj samo moramo integrirati kutnu brzinu.

S druge strane, akcelerometar MPU6050 mjeri ubrzanje mjerenjem gravitacijskog ubrzanja duž 3 osi i pomoću neke matematike trigonometrije možemo izračunati kut pod kojim je senzor postavljen. Dakle, spojimo li ili kombiniramo podatke akcelerometra i žiroskopa možemo dobiti vrlo točne podatke o orijentaciji senzora.

Žiroskop s tri osi MPU-6050 sastoji se od troosnog žiroskopa koji može detektirati brzinu rotacije duž osi x, y, z pomoću tehnologije mikro-mehaničkih sustava (MEMS). Kad se senzor rotira duž bilo koje osi, nastaju vibracije zbog Coriolisovog učinka koji detektira MEMS. 16-bitni ADC koristi se za digitalizaciju napona za uzorkovanje svake osi. +/- 250, +/- 500, +/- 1000, +/- 2000 su cijeli raspon izlaznih vrijednosti. Kutna brzina mjeri se duž svake osi u stupnjevima po sekundi.

Korisna veza: …………….

Arduino ploča:. ……….

MPU6050 IMU ……………

Korak 1: Modul MPU-6050

Modul MPU-6050
Modul MPU-6050

Modul MPU-6050 ima 8 pinova,

INT: Prekini pin za digitalni izlaz.

AD0: I2C slave adresa LSB pin. Ovo je 0-ti bit u 7-bitnoj podređenoj adresi uređaja. Ako je spojen na VCC, tada se čita kao logička jedna i adresa slave se mijenja.

XCL: Igla pomoćnog serijskog sata. Ovaj pin se koristi za povezivanje drugih SCL pinova sa omogućenim I2C sučeljem na MPU-6050.

XDA: pin pomoćnih serijskih podataka. Ovaj pin se koristi za spajanje drugih SDA pin-ova osjetnika sa I2C sučeljem na MPU-6050.

SCL: pin serijskog sata. Spojite ovaj pin na SCL pin mikrokontrolera. SDA: Pin za serijske podatke. Spojite ovaj pin na pin SDA mikrokontrolera.

GND: Igla za uzemljenje. Spojite ovaj pin na uzemljenje.

VCC: Pin za napajanje. Spojite ovaj pin na +5V DC napajanje. Modul MPU-6050 ima Slave adresu (Kada je AD0 = 0, tj. Nije spojen na Vcc) kao, Adresa za pisanje podređenog (SLA+W): 0xD0

Slave Read adresa (SLA+R): 0xD1

Korak 2: Izračuni

Proračuni
Proračuni

Podaci senzora žiroskopa i akcelerometra modula MPU6050 sastoje se od 16-bitnih sirovih podataka u obliku 2 komplementa.

Podaci senzora temperature MPU6050 modula sastoje se od 16-bitnih podataka (ne u obliku komplementa 2).

Pretpostavimo da smo odabrali,

  • - Opseg mjerila akcelerometra od +/- 2g s faktorom mjerila osjetljivosti 16, 384 LSB (broj)/g.
  • - Puni raspon žiroskopa od +/- 250 °/s s faktorom mjerila osjetljivosti 131 LSB (broj)/°/s. zatim,

Da bismo dobili neobrađene podatke senzora, prvo moramo izvršiti komplement 2 na senzorskim podacima akcelerometra i žiroskopa. Nakon dobivanja sirovih podataka senzora možemo izračunati ubrzanje i kutnu brzinu dijeljenjem neobrađenih podataka senzora s njihovim faktorom ljestvice osjetljivosti na sljedeći način-

Vrijednosti akcelerometra u g (g sila)

  • Ubrzanje duž osi X = (Sirovi podaci osi X akcelerometra sirovi podaci/16384) g.
  • Ubrzanje po osi Y = (Sirovi podaci osi akcelerometra Y osi/16384) g.
  • Ubrzanje po osi Z = (Sirovi podaci osi akcelerometra Z osi/16384) g.

Vrijednosti žiroskopa u °/s (stupanj u sekundi)

  • Kutna brzina po osi X = (Sirovi podaci osi X žiroskopa/131) °/s.
  • Kutna brzina po osi Y = (Sirovi podaci osi Y žiroskopa/131) °/s.
  • Kutna brzina po osi Z = (Sirovi podaci osi žiroskopa Z osi/131) °/s.

Vrijednost temperature u °/c (stupanj po Celzijusu)

Temperatura u stupnjevima C = ((podaci senzora temperature)/340 + 36,53) °/c.

Na primjer, Pretpostavimo da nakon 2’komplementa dobijemo sirovu vrijednost osi akcelerometra X osi = +15454

Tada je Ax = +15454/16384 = 0,94 g.

Više,

Dakle, znamo da radimo na osjetljivosti od +/- 2G i +/- 250deg/s, ali kako naše vrijednosti odgovaraju tim ubrzanjima/kutovima.

Ovo su oboje ravni grafikoni i iz njih možemo zaključiti da ćemo za 1G čitati 16384, a za 1 stupanj/sek 131,07 (iako će se.07 zanemariti zbog binarnih) te su vrijednosti samo izrađene crtanjem ravni grafikon s 2G na 32767 i -2G na -32768 i 250/-250 na istim vrijednostima.

Dakle, sada znamo naše vrijednosti osjetljivosti (16384 i 131,07), samo trebamo umanjiti odstupanja od naših vrijednosti, a zatim podijeliti prema osjetljivosti.

Oni će dobro funkcionirati za vrijednosti X i Y, ali kako je Z zabilježeno na 1G, a ne na 0, trebat ćemo minus 1G (16384) prije nego što podijelimo s osjetljivošću.

Korak 3: MPU6050-Atmega328p veze

Priključci MPU6050-Atmega328p
Priključci MPU6050-Atmega328p
MPU6050-Atmega328p veze
MPU6050-Atmega328p veze
Priključci MPU6050-Atmega328p
Priključci MPU6050-Atmega328p

Samo povežite sve kako je prikazano na dijagramu…

Veze su date na sljedeći način:-

MPU6050 Arduino Nano

VCC 5v izlazni pin

GND Uzemljenje

SDA A4 pin // serijski podaci

SCL A5 pin // serijski sat

Izračun nagiba i nagiba: Roll je rotacija oko osi x, a korak je rotacija duž osi y.

Rezultat je u radijanima. (pretvorite u stupnjeve množenjem sa 180 i dijeljenjem sa pi)

Korak 4: Kodovi i objašnjenja

Kodovi i objašnjenja
Kodovi i objašnjenja

/*

Arduino i MPU6050 Akcelerometar i senzor žiroskopa senzor, Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C adresa float AccX, AccY, AccZ; plovak 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; void setup () {Serial.begin (19200); Wire.begin (); // Inicijalizacija komunikacije Wire.beginTransmission (MPU); // započeti komunikaciju s MPU6050 // MPU = 0x68 Wire.write (0x6B); // Razgovarajte s registrom 6B Wire.write (0x00); // Poništi - postavite 0 u 6B registar Wire.endTransmission (true); // prekid prijenosa/* // Konfiguriranje osjetljivosti akcelerometra - puni raspon opsega (zadano +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Razgovarajte s registrom ACCEL_CONFIG (1C hex) Wire.write (0x10); // Postavite registrske bitove kao 00010000 (+/- 8g punog raspona) Wire.endTransmission (true); // Konfiguriranje osjetljivosti žiroskopa - cijeli raspon opsega (zadano +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Razgovarajte s registrom GYRO_CONFIG (1B hex) Wire.write (0x10); // Postavite registrske bitove kao 00010000 (1000deg/s u punoj skali) Wire.endTransmission (true); kašnjenje (20); */ // Pozovite ovu funkciju ako trebate dobiti vrijednosti IMU pogreške za vaš modul Calculate_IMU_error (); kašnjenje (20); } void loop () {// === Čitanje podataka ubrzivača === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Počni s registrom 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, istina); // Pročitajte ukupno 6 registara, svaka vrijednost osi pohranjena je u 2 registra // Za raspon od +-2g, moramo podijeliti sirove vrijednosti na 16384, prema podatkovnom listu AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // vrijednost osi X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Vrijednost osi Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Vrijednost osi Z // Izračun pomaka i nagiba iz podataka akcelerometra accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Za više pojedinosti pogledajte prilagođenu funkciju calcule_IMU_error () accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Očitavanje podataka žiroskopa === // previousTime = currentTime; // Prethodno vrijeme je pohranjeno prije stvarnog vremena čitanja currentTime = millis (); // Trenutno vrijeme očitano vrijeme očitano elapsedTime = (currentTime - previousTime) / 1000; // Podijelimo s 1000 da bismo dobili sekunde Wire.beginTransmission (MPU); Wire.write (0x43); // Adresa prvog registra žiroskopa 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, istina); // Očitajte ukupno 4 registra, svaka vrijednost osi pohranjena je u 2 registra GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Za raspon od 250deg/ s prvo moramo podijeliti sirovu vrijednost sa 131,0, prema podatkovnom listu GyroY = (Wire.read () << 8 | Wire.read ())/ 131,0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Ispravite izlaze s izračunatim vrijednostima pogreške GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0.8) // Trenutno su sirove vrijednosti u stupnjevima po sekundi, deg/s, pa moramo pomnožiti sa sendondovima (s) da bismo dobili kut u stupnjevima gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; zaokret = zavoj + žiroskop * proteklo vrijeme; // Dopunski filtar - kombinirajte vrijednosti ubrzanja i žiro kuta roll = 0,96 * gyroAngleX + 0,04 * accAngleX; korak = 0,96 * giroAngleY + 0,04 * accAngleY; // Ispis vrijednosti na serijskom monitoru Serial.print (roll); Serial.print ("/"); Serijski.ispis (visina); Serial.print ("/"); Serijski.println (zakretanje); } void Calculate_IMU_error () {// Ovu funkciju možemo nazvati u odjeljku za postavljanje radi izračuna pogreške u mjeraču ubrzanja i žiroskopa. Odavde ćemo dobiti vrijednosti pogrešaka korištene u gornjim jednadžbama ispisanim na serijskom monitoru. // Imajte na umu da bismo trebali postaviti IMU stan kako bismo dobili ispravne vrijednosti, tako da tada možemo ispraviti vrijednosti // 200 puta očitati vrijednosti akcelerometra while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (lažno); Wire.requestFrom (MPU, 6, istina); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Zbroji sva očitanja 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 ++; } // Podijelite zbroj sa 200 da biste dobili vrijednost pogreške AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // 200 puta očitajte vrijednosti žiroskopa dok (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (lažno); Wire.requestFrom (MPU, 6, istina); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Zbroji sva očitanja GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131,0); c ++; } // Podijelite zbroj sa 200 da biste dobili vrijednost pogreške GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Ispišite vrijednosti pogreške na 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); } ------------------------------------------------- ---------------------------------------------- Rezultati:-X = Y = Z = --------------------------------------------- ----------------------------------------------- Važna nota: -----------------

U odjeljku petlje započinjemo čitanjem podataka akcelerometra. Podaci za svaku os pohranjeni su u 2 bajta ili registre, a adrese tih registara možemo vidjeti iz podatkovne tablice senzora.

Kako bismo ih sve pročitali, počinjemo s prvim registrom, a pomoću funkcije requiestFrom () tražimo čitanje svih 6 registara za osi X, Y i Z. Zatim čitamo podatke iz svakog registra, a budući da se izlazi nadopunjuju, kombiniramo ih na odgovarajući način kako bismo dobili točne vrijednosti.

Korak 5: Razumijevanje kuta nagiba

Brzinomjer

Zemljina gravitacija stalno je ubrzanje gdje sila uvijek pokazuje prema dolje u središte Zemlje.

Kad je akcelerometar paralelan s gravitacijom, izmjereno ubrzanje bit će 1G, kada je akcelerometar okomit na gravitaciju, mjerit će 0G.

Kut nagiba može se izračunati iz izmjerenog ubrzanja pomoću ove jednadžbe:

θ = sin-1 (izmjereno ubrzanje / ubrzanje gravitacije)

GyroGyro (zvani senzor brzine) koristi se za mjerenje kutne brzine (ω).

Da bismo dobili kut nagiba robota, moramo integrirati podatke iz žiroskopa kako je prikazano u jednadžbi u nastavku:

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

Fuzija senzora žiroskopa i akcelerometraNakon proučavanja karakteristika žiroskopa i akcelerometra, znamo da oni imaju svoje snage i slabosti. Izračunati kut nagiba iz podataka akcelerometra ima sporo vrijeme odziva, dok je integrirani kut nagiba iz giroskopskih podataka podvrgnut pomaku tijekom vremena. Drugim riječima, možemo reći da su podaci akcelerometra dugoročno korisni, dok su žiroskopi kratkoročni.

Link za bolje razumijevanje: kliknite ovdje

Preporučeni: