Sadržaj:
- Korak 1: Modul MPU-6050
- Korak 2: Prorač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 izmjena: 2024-01-30 08:04
MPU6050 IMU ima troosni akcelerometar i troosni žiroskop integrirani na jednom čipu.
Žiroskop mjeri brzinu rotacije ili brzinu promjene kutnog položaja tokom 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, ako spojimo 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 sistema (MEMS). Kada se senzor rotira duž bilo koje osi, stvaraju se vibracije zbog Coriolisovog efekta koji detektira MEMS.16-bitni ADC koristi se za digitalizaciju napona za uzorkovanje svake osi. +/- 250, +/- 500, +/- 1000, +/- 2000 su puni raspon izlaznih vrijednosti. Kutna brzina se mjeri 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 slave adresi uređaja. Ako je spojen na VCC, tada se čita kao logička i slave adresa.
XCL: pin pomoćnog serijskog sata. Ovaj pin se koristi za povezivanje drugih SCL pinova sa omogućenim I2C interfejsom na MPU-6050.
XDA: pin pomoćnih serijskih podataka. Ovaj pin se koristi za povezivanje drugih SDA pinova sa omogućenim I2C interfejsom na MPU-6050.
SCL: Pin za serijski sat. Priključite ovaj pin na SCL pin mikrokontrolera. SDA: Pin za serijske podatke. Priključite ovaj pin na SDA pin mikrokontrolera.
GND: Igla za uzemljenje. Spojite ovaj pin na uzemljenje.
VCC: Pin za napajanje. Priključite ovaj pin na +5V DC napajanje. Modul MPU-6050 ima Slave adresu (Kada je AD0 = 0, tj. Nije spojen na Vcc) kao, Adresa za pomoćno upisivanje (SLA+W): 0xD0
Adresa za pomoćno čitanje (SLA+R): 0xD1
Korak 2: Proračuni
Podaci senzora žiroskopa i akcelerometra MPU6050 modula sastoje se od 16-bitnih sirovih podataka u obliku komplementa 2.
Podaci senzora temperature MPU6050 modula sastoje se od 16-bitnih podataka (ne u obliku komplementa 2).
Pretpostavimo da smo odabrali,
- - Opseg skale akcelerometra od +/- 2g sa faktorom skale osjetljivosti 16, 384 LSB (broj)/g.
- - Puni raspon žiroskopa od +/- 250 °/s sa faktorom skale osjetljivosti 131 LSB (broj)/°/s. tada,
Da bismo dobili neobrađene podatke senzora, moramo prvo izvršiti komplement 2 na senzorskim podacima akcelerometra i žiroskopa. Nakon dobivanja neobrađenih 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 duž osi Z = (Sirovi podaci osi akcelerometra Z osi/16384) g.
Vrijednosti žiroskopa u °/s (stepen u sekundi)
- Kutna brzina duž osi X = (Sirovi podaci osi X osi žiroskopa/131) °/s.
- Kutna brzina duž Y osi = (Sirovi podaci osi Y osi žiroskopa/131) °/s.
- Kutna brzina duž osi Z = (Sirovi podaci osi Z osi žiroskopa/131) °/s.
Temperaturna vrijednost u °/c (stepen 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/uglovima.
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 binarnosti) ove vrijednosti su samo izrađene crtanjem ravni grafikon sa 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, morat ć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 sledeći način:-
MPU6050 Arduino Nano
VCC 5v izlazni pin
GND Uzemljenje
SDA A4 pin // serijski podaci
SCL A5 pin // serijski sat
Proračun nagiba i nagiba: Roll je rotacija oko osi x, a korak je rotacija duž osi y.
Rezultat je u radijanima. (konvertujte u stepene množenjem sa 180 i deljenjem 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; 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; void setup () {Serial.begin (19200); Wire.begin (); // Pokretanje komunikacije Wire.beginTransmission (MPU); // započeti komunikaciju s MPU6050 // MPU = 0x68 Wire.write (0x6B); // Razgovarajte sa 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 sa ACCEL_CONFIG registrom (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 GYRO_CONFIG registrom (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 greške za vaš modul calcule_IMU_error (); kašnjenje (20); } void loop () {// === Čitanje podataka akcelerometra === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Počni s registrom 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tačno); // Pročitajte ukupno 6 registara, svaka vrijednost osi je pohranjena u 2 registra // Za raspon od +-2g, moramo podijeliti neobrađene 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; // Z -vrijednost osi // Izračunavanje pomaka i nagiba iz podataka akcelerometra accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Pogledajte prilagođenu funkciju calcule_IMU_error () za više detalja accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1,58) // === Čitanje podataka žiroskopa === // previousTime = currentTime; // Prethodno vrijeme se pohranjuje prije stvarnog vremena čitanja currentTime = millis (); // Trenutno vrijeme pročitano vrijeme elapsedTime = (currentTime - previousTime) / 1000; // Podijelite s 1000 da biste dobili sekunde Wire.beginTransmission (MPU); Wire.write (0x43); // Adresa prvog registra žiroskopa 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tačno); // Čitanje ukupno 4 registra, svaka vrijednost osi pohranjena je u 2 registra GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Za raspon od 250deg/ s moramo prvo podijeliti sirovu vrijednost sa 131,0, prema tablici podataka GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Ispravimo izlaze s izračunatim vrijednostima greš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 sendonds (s) da dobijemo kut u stupnjevima gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Komplementarni filter - kombinirajte vrijednosti ubrzanja i žiro kuta roll = 0,96 * gyroAngleX + 0,04 * accAngleX; pitch = 0,96 * gyroAngleY + 0,04 * accAngleY; // Odštampajte vrijednosti na serijskom monitoru Serial.print (roll); Serial.print ("/"); Serial.print (pitch); Serial.print ("/"); Serial.println (zakretanje); } void Calculate_IMU_error () {// Ovu funkciju možemo nazvati u odjeljku za postavljanje radi izračunavanja akcelerometra i greške podataka žiroskopa. Odavde ćemo dobiti vrijednosti grešaka korištene u gornjim jednadžbama odštampanim na serijskom monitoru. // Imajte na umu da bismo trebali postaviti IMU ravno kako bismo dobili odgovarajuće vrijednosti, tako da tada možemo ispraviti vrijednosti // 200 puta očitati vrijednosti akcelerometra dok (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tačno); 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 zbir sa 200 da biste dobili vrijednost greške AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // 200 puta čitajte vrijednosti žiroskopa dok (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, tačno); 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 zbir sa 200 da biste dobili vrijednost greške GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Ispisuje vrijednosti greš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 napomena: -----------------
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.
Da 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 ispravne vrijednosti.
Korak 5: Razumijevanje kuta nagiba
Akcelerometar
Zemljina gravitacija je konstantno ubrzanje gdje je sila uvijek usmjerena prema središtu 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 donjoj jednadžbi:
ω = 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 u određenom vremenskom periodu. 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čuje se:
DIY MPU-6050 USB džojstik: 5 koraka
DIY MPU-6050 USB džojstik: Uz Microsoft Flight Simulator 2020, brzo sam shvatio koliko je teško koristiti tastaturu za upravljanje planom. Pretražujući na internetu, nisam uspio pronaći joystick za razumnu cijenu za kupovinu. Većina internetskih trgovaca nije ih imala na lageru. Popularnost M
Sistem za sprečavanje senzora Com senzora MPU-6050: 6 koraka
Sistemi za sprečavanje razvoja senzora Com senzora MPU-6050: O senzor MPU-6050 je čip sa čipom koji je potreban za mjerenje temperature i žiroskopiranje MEMS-a. São 3 eixos para o acelorômetro i 3 eixos para giroscópio, sendo ao todo 6 graus de liberdade (6DOF)
Senzor akcelerometra s Arduinom: 5 koraka
Senzor akcelerometra s Arduinom: Imao sam ideju za elektroničku kacigu koja bi bila odličan kostim za Noć vještica. bez ulaženja u previše detalja, uključivalo bi osvjetljavanje u različitim uzorcima, ovisno o smjeru u kojem se maska okrenula, tako da kad pogledam gore, 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, pa vas molim da ne pipate u komentarima. U ovom uputstvu ću objasniti kako natjerati dva LORA čvora da komuniciraju direktno bez TTN -a (mreže stvari)
Zapis podataka MPU-6050/A0 u stvarnom vremenu s Arduinom i Androidom: 7 koraka (sa slikama)
Zapisivanje podataka u realnom 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 u stvarnom vremenu (ili prilično blizu njega) sa Android uređajem. Želim snimiti podatke akcelerometra s MPU-6050 pa sam dizajnirao