Kazalo:
- Korak: Modul MPU-6050
- 2. korak: Izračuni
- 3. korak: Povezave MPU6050-Atmega328p
- 4. korak: Kode in pojasnila
- 5. korak: Razumevanje nagibnega kota
Video: Žiroskop MPU 6050, komunikacija merilnika pospeška z Arduinom (Atmega328p): 5 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:03
MPU6050 IMU ima na enem čipu integriran 3-osni merilnik pospeška in 3-osni žiroskop.
Žiroskop meri hitrost vrtenja ali hitrost spreminjanja kotnega položaja skozi čas vzdolž osi X, Y in Z.
Izhodi žiroskopa so v stopinjah na sekundo, zato, da dobimo kotni položaj, moramo le integrirati kotno hitrost.
Po drugi strani merilnik pospeška MPU6050 meri pospešek z merjenjem gravitacijskega pospeška vzdolž treh osi in z uporabo matematike trigonometrije lahko izračunamo kot, pod katerim je senzor nameščen. Če torej združimo ali združimo podatke merilnika pospeška in žiroskopa, lahko dobimo zelo natančne informacije o usmerjenosti senzorja.
3-osni žiroskop MPU-6050 je sestavljen iz 3-osnega žiroskopa, ki lahko zazna tehnologijo vrtenja vzdolž osi x, y, z s tehnologijo mikro elektromehanskih sistemov (MEMS). Ko se senzor vrti vzdolž katere koli osi, nastanejo vibracije zaradi Coriolisovega učinka, ki ga zazna MEMS. 16-bitni ADC se uporablja za digitalizacijo napetosti za vzorčenje vsake osi. +/- 250, +/- 500, +/- 1000, +/- 2000 je celoten obseg izhoda. Kotna hitrost se meri vzdolž vsake osi v stopinjah na sekundo.
Koristna povezava: …………….
Arduino Board:. ……….
MPU6050 IMU ……………
Korak: Modul MPU-6050
Modul MPU-6050 ima 8 zatičev,
INT: Prekinite pin digitalnega izhoda.
AD0: I2C podrejeni naslov LSB pin. To je 0-ti bit v 7-bitnem podrejenem naslovu naprave. Če je povezan z VCC, se ta prebere kot logična ena in podrejeni naslov.
XCL: Zatič za dodatno serijsko uro. Ta pin se uporablja za priključitev drugih senzorjev SCL, ki podpirajo vmesnik I2C, na MPU-6050.
XDA: pin za pomožne serijske podatke. Ta pin se uporablja za priključitev drugih senzorjev SDA, ki podpirajo vmesnik I2C, na MPU-6050.
SCL: pin serijske ure. Ta pin priključite na SCL pin mikrokrmilnikov. SDA: pin serijskih podatkov. Ta pin priključite na pin SDA mikrokrmilnikov.
GND: Ozemljitveni zatič. Priključite ta pin na ozemljitveno povezavo.
VCC: napajalni pin. Ta pin priključite na +5V DC napajanje. Modul MPU-6050 ima naslov slave (če je AD0 = 0, to pomeni, da ni povezan z Vcc) kot, Naslov podrejenega pisanja (SLA+W): 0xD0
Naslov podrejenega branja (SLA+R): 0xD1
2. korak: Izračuni
Podatki senzorja žiroskopa in merilnika pospeška modula MPU6050 so sestavljeni iz 16-bitnih surovih podatkov v obliki komplementa 2.
Podatki temperaturnega tipala modula MPU6050 so sestavljeni iz 16-bitnih podatkov (ne v obliki dopolnila 2).
Recimo, da smo izbrali,
- - Celoten obseg merilnika pospeška +/- 2g s faktorjem lestvice občutljivosti 16, 384 LSB (štetje)/g.
- - Celotno območje lestvice žiroskopa +/- 250 °/s s faktorjem lestvice občutljivosti 131 LSB (štetje)/°/s. potem,
Za pridobivanje surovih podatkov senzorjev moramo najprej opraviti komplement 2 na podatkih senzorjev merilnika pospeška in žiroskopa. Po prejemu neobdelanih podatkov senzorjev lahko izračunamo pospešek in kotno hitrost tako, da neobdelane podatke senzorja razdelimo na faktor lestvice občutljivosti, kot sledi:
Vrednosti merilnika pospeška v g (sila g)
- Pospešek vzdolž osi X = (surovi podatki osi X merilnika pospeška/16384) g.
- Pospešek vzdolž osi Y = (surovi podatki osi pospeška Y osi/16384) g.
- Pospešek vzdolž osi Z = (surovi podatki osi pospeška Z osi/16384) g.
Vrednosti žiroskopa v °/s (stopinja na sekundo)
- Kotna hitrost vzdolž osi X = (surovi podatki osi X osi žiroskopa/131) °/s.
- Kotna hitrost vzdolž osi Y = (surovi podatki osi Y osi žiroskopa/131) °/s.
- Kotna hitrost vzdolž osi Z = (surovi podatki osi Z žiroskopa Z/131) °/s.
Temperaturna vrednost v °/c (stopinja na Celzij)
Temperatura v stopinjah C = ((podatki senzorja temperature)/340 + 36,53) °/c.
Na primer, Recimo, da po 2 'komplementu dobimo surovo vrednost osi merilnika pospeška X = +15454
Potem je Ax = +15454/16384 = 0,94 g.
Več,
Torej vemo, da tečemo z občutljivostjo +/- 2G in +/- 250deg/s, toda kako naše vrednosti ustrezajo tem pospeškom/kotom.
To sta grafa ravnih črt in iz njih lahko ugotovimo, da bomo za 1G prebrali 16384, za 1 stopinjo/s pa 131,07 (čeprav se.07 zaradi binarnega ne upošteva) so bile te vrednosti določene le z risanjem linearni graf z 2G pri 32767 in -2G pri -32768 in 250/-250 pri enakih vrednostih.
Torej, zdaj poznamo naše vrednosti občutljivosti (16384 in 131,07), moramo le odšteti odmike od naših vrednosti in jih nato razdeliti na občutljivost.
To bo dobro delovalo za vrednosti X in Y, ker pa je bil Z zabeležen pri 1G in ne pri 0, bomo morali 1G (16384) odšteti, preden ga delimo s svojo občutljivostjo.
3. korak: Povezave MPU6050-Atmega328p
Samo povežite vse, kot je prikazano na diagramu…
Povezave so podane na naslednji način:-
MPU6050 Arduino Nano
VCC 5v izhodni pin
GND Ozemljitveni zatič
SDA A4 pin // serijski podatki
SCL A5 pin // serijska ura
Izračun nagiba in nagiba: Roll je vrtenje okoli osi x, smola pa vrtenje vzdolž osi y.
Rezultat je v radianih. (pretvorite v stopinje tako, da pomnožite s 180 in delite s pi)
4. korak: Kode in pojasnila
/*
Arduino in MPU6050 merilnik pospeška in senzorja žiroskopa, Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C naslov float AccX, AccY, AccZ; plavajoči 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 (); // Inicializirajte komunikacijo Wire.beginTransmission (MPU); // Začnite komunikacijo z MPU6050 // MPU = 0x68 Wire.write (0x6B); // Pogovorite se z registrom 6B Wire.write (0x00); // Naredite ponastavitev - postavite 0 v register 6B Wire.endTransmission (true); // končajte prenos/* // Konfigurirajte občutljivost merilnika pospeška - polno lestvico (privzeto +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Pogovorite se z registrom ACCEL_CONFIG (1C šestkotni) Wire.write (0x10); // Registrske bite nastavite kot 00010000 (+/- 8g celotnega obsega) Wire.endTransmission (true); // Konfiguriraj občutljivost žiroskopa - polno lestvico (privzeto +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Pogovorite se z registrom GYRO_CONFIG (1B šestkotni) Wire.write (0x10); // Registrske bite nastavite na 00010000 (1000deg/s v polnem obsegu) Wire.endTransmission (true); zamuda (20); */ // Pokličite to funkcijo, če želite pridobiti vrednosti napak IMU za vaš modul Calculate_IMU_error (); zamuda (20); } void loop () {// === Preberite podatke pospeševalnika === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Začnite z registrom 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, res); // Skupaj preberemo 6 registrov, vsaka vrednost osi je shranjena v 2 registrih // Za obseg +-2g moramo surove vrednosti razdeliti na 16384, v skladu s podatkovnim listom AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // vrednost osi X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // vrednost osi Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Vrednost osi Z // Izračun vrtenja in višine na podlagi podatkov merilnika pospeška accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Za več podrobnosti si oglejte funkcijo po meri Calcu_IMU_error () accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Branje podatkov žiroskopa === // previousTime = currentTime; // Prejšnji čas je shranjen pred dejanskim časom branja currentTime = millis (); // Trenutni čas dejanski čas branja elapsedTime = (currentTime - previousTime) / 1000; // Delimo s 1000, da dobimo sekunde Wire.beginTransmission (MPU); Wire.write (0x43); // Naslov prvega registra žiroskopskih podatkov 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, res); // Skupaj preberemo 4 registre, vsaka vrednost osi je shranjena v 2 registrih GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Za obseg 250 stopinj/ s moramo surovo vrednost najprej deliti s 131,0, v skladu s podatkovnim listom GyroY = (Wire.read () << 8 | Wire.read ())/ 131,0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Popravimo izhode z izračunanimi vrednostmi napak GyroX = GyroX + 0,56; // GyroErrorX ~ (-0,56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0,79; // GyroErrorZ ~ (-0,8) // Trenutno so surove vrednosti v stopinjah na sekundo, deg/s, zato moramo pomnožiti s sendonds (s), da dobimo kot v stopinjah gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Dopolnilni filter - kombinirajte vrednosti pospeševalnika in kota žiroskopa roll = 0,96 * gyroAngleX + 0,04 * accAngleX; smola = 0,96 * gyroAngleY + 0,04 * accAngleY; // Natisnite vrednosti na serijski monitor Serial.print (roll); Serial.print ("/"); Serijski.tisk (smola); Serial.print ("/"); Serial.println (zavijanje); } void Calculate_IMU_error () {// To funkcijo lahko pokličemo v razdelku za nastavitev za izračun merilnika pospeška in napake pri podatkih o žiroskopu. Od tu bomo dobili vrednosti napak, uporabljene v zgornjih enačbah, natisnjenih na serijskem monitorju. // Upoštevajte, da bi morali IMU postaviti ravno, da bi dobili ustrezne vrednosti, tako da lahko potem popravimo vrednosti // 200 -krat preberite vrednosti merilnika pospeška while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, res); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Vsota vseh odčitkov 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 ++; } // Delimo vsoto z 200, da dobimo vrednost napake AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // 200 -krat preberemo vrednosti žiroskopov (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, res); GyroX = Wire.read () << 8 | Wire.read (); Žiroskop = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Vsota vseh odčitkov GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131,0); c ++; } // Delimo vsoto z 200, da dobimo vrednost napake GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Natisnite vrednosti napak 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 = --------------------------------------------- ----------------------------------------------- Pomembna opomba: -----------------
V razdelku zanke začnemo z branjem podatkov merilnika pospeška. Podatki za vsako os so shranjeni v 2 bajtih ali registrih, naslove teh registrov pa lahko vidimo iz podatkovnega lista senzorja.
Da bi jih vse prebrali, začnemo s prvim registrom in z uporabo funkcije requiestFrom () zahtevamo branje vseh 6 registrov za osi X, Y in Z. Nato preberemo podatke iz vsakega registra in ker se izhodi dve dopolnjujeta, ju primerno združimo, da dobimo pravilne vrednosti.
5. korak: Razumevanje nagibnega kota
Merilnik pospeška
Zemljina gravitacija je stalen pospešek, kjer je sila vedno usmerjena navzdol proti središču Zemlje.
Ko je merilnik pospeška vzporeden z gravitacijo, bo izmerjeni pospešek 1G, ko je merilnik pospeška pravokoten na težo, bo meril 0G.
Kot nagiba je mogoče izračunati iz izmerjenega pospeška z uporabo te enačbe:
θ = sin-1 (izmerjen pospešek / gravitacijski pospešek)
GyroGyro (znan tudi kot senzor hitrosti) se uporablja za merjenje kotne hitrosti (ω).
Da bi dobili kot nagiba robota, moramo podatke iz žiroskopa integrirati, kot je prikazano v spodnji enačbi:
ω = dθ / dt, θ = ∫ ω dt
Fuzija senzorja žiroskopa in merilnika pospeška Po preučevanju značilnosti žiroskopa in merilnika pospeška vemo, da imata svoje prednosti in slabosti. Izračunani kot nagiba iz podatkov merilnika pospeška ima počasen odzivni čas, medtem ko je integrirani kot nagiba iz podatkov žiroskopa v določenem času izpostavljen premiku. Z drugimi besedami, lahko rečemo, da so podatki merilnika pospeška dolgoročno uporabni, medtem ko so podatki o žiroskopu uporabni kratkoročno.
Povezava za boljše razumevanje: kliknite tukaj
Priporočena:
Sistem opozarjanja na nesrečo z uporabo GSM, GPS in merilnika pospeška: 5 korakov (s slikami)
Sistem za opozarjanje ob nesrečah z uporabo GSM -ja, GPS -ja in merilnika pospeška: Prosim, glasujte me za tekmovanjeProsimo, glasujte me za tekmovanje.Danes je na cesti zaradi nesreče umrlo veliko ljudi, glavni vzrok pa je "zamuda pri reševanju". Ta problem je v državah v razvoju zelo velik, zato sem ta projekt zasnoval za reševanje
Senzor merilnika pospeška z Arduinom: 5 korakov
Senzor merilnika pospeška z Arduinom: Imel sem idejo za elektronsko čelado, ki bi bila odličen kostum za noč čarovnic. ne da bi se preveč spuščal v podrobnosti, bi vključeval osvetljevanje v različnih vzorcih, odvisno od tega, v katero smer se je maska obrnila, tako da, ko pogledam navzgor, on
Odbiti se ! Igra navidezne resničnosti z uporabo Arduina in merilnika merilnika: 9 korakov
Odbiti se ! Igra navidezne resničnosti z uporabo Arduina in merilnika števcev: V tej vadnici bomo ustvarili igro navidezne resničnosti z uporabo Arduina in merilnika merilnika
Igralni krmilnik merilnika pospeška: 8 korakov
Igralni krmilnik merilnika pospeška: Besedilo Voorlopige
Arduino Nano in Visuino: Pretvorba pospeška v kot iz merilnika pospeška in žiroskopa Senzor MPU6050 I2C: 8 korakov (s slikami)
Arduino Nano in Visuino: Pretvorite pospešek v kot iz merilnika pospeška in žiroskopa Senzor MPU6050 I2C: Pred časom sem objavil vadnico o tem, kako lahko povežete merilnik pospeška, žiroskop in kompas MPU9250 na Arduino Nano ter ga programirate z Visuinom za pošiljanje paketnih podatkov in prikaz merilnik pospeška pošilja X, Y,