Sadržaj:
- Korak 1: Modul MPU-6050
- Korak 2: Izračuni
- Korak 3: MPU6050-Atmega328p veze
- Korak 4: Kodovi i objašnjenja
- Korak 5: Razumijevanje kuta nagiba
Video: Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): 5 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:32
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 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
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
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
/*
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:
DIY MPU-6050 USB joystick: 5 koraka
DIY MPU-6050 USB joystick: Uz Microsoft Flight Simulator 2020, brzo sam shvatio koliko je teško koristiti tipkovnicu za upravljanje planom. Pretražujući na internetu, nisam mogao pronaći joystick za razumnu cijenu za kupnju. Većina internetskih trgovaca nije ih imala na lageru. Popularnost M
Sistema De Prevenção De Deslizamentos Com Sensor MPU-6050: 6 koraka
Sustav De Prevenção De Deslizamentos Com Sensor MPU-6050: O senzor MPU-6050 je čip s čipom koji je potreban za mjerenje temperature i umrežavanje MEMS-om. 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 de preven
Senzor akcelerometra s Arduinom: 5 koraka
Senzor akcelerometra s Arduinom: Imao sam ideju za elektroničku kacigu koja bi bila izvrstan kostim za Noć vještica. bez ulaženja u previše detalja, uključivalo bi osvjetljavanje u različitim uzorcima, ovisno u kojem smjeru se maska okrenula, tako da kad podignem pogled, on
LORA Peer to Peer komunikacija s Arduinom: 9 koraka
LORA Peer to Peer komunikacija s Arduinom: Ja sam početnik entuzijasta u elektronici i ovo je moje prvo uputstvo, stoga vas molim da ne pišete u komentarima. U ovom uputstvu ću objasniti kako natjerati dva LORA čvora da komuniciraju izravno bez TTN -a (mreže stvari). Što je
Zapis podataka MPU-6050/A0 u stvarnom vremenu s Arduinom i Androidom: 7 koraka (sa slikama)
Zapisivanje podataka u stvarnom vremenu MPU-6050/A0 s Arduinom i Androidom: Zanimalo me korištenje Arduina za strojno učenje. Kao prvi korak, želim izgraditi prikaz podataka i zapisnik podataka u stvarnom vremenu (ili prilično blizu njega) s Android uređajem. Želim snimiti podatke akcelerometra s MPU-6050 pa sam dizajnirao