Përmbajtje:

MPU 6050 Gyro, Përshpejtimi i komunikimit me Arduino (Atmega328p): 5 hapa
MPU 6050 Gyro, Përshpejtimi i komunikimit me Arduino (Atmega328p): 5 hapa

Video: MPU 6050 Gyro, Përshpejtimi i komunikimit me Arduino (Atmega328p): 5 hapa

Video: MPU 6050 Gyro, Përshpejtimi i komunikimit me Arduino (Atmega328p): 5 hapa
Video: Начните использовать плату Arduino Digispark USB ATtiny85 с примером мигания и реле | Рободжакс 2024, Nëntor
Anonim
MPU 6050 Gyro, Komunikimi i përshpejtuesit me Arduino (Atmega328p)
MPU 6050 Gyro, Komunikimi i përshpejtuesit me Arduino (Atmega328p)
MPU 6050 Gyro, Komunikimi i përshpejtuesit me Arduino (Atmega328p)
MPU 6050 Gyro, Komunikimi i përshpejtuesit me Arduino (Atmega328p)
MPU 6050 Gyro, Komunikimi i përshpejtuesit me Arduino (Atmega328p)
MPU 6050 Gyro, Komunikimi i përshpejtuesit me Arduino (Atmega328p)

MPU6050 IMU ka përshpejtues 3-bosht dhe xhiroskop 3-bosht të integruar në një çip të vetëm.

Xhiroskopi mat shpejtësinë rrotulluese ose shkallën e ndryshimit të pozicionit këndor me kalimin e kohës, përgjatë boshtit X, Y dhe Z.

Daljet e xhiroskopit janë në gradë për sekondë, kështu që për të marrë pozicionin këndor na duhet vetëm të integrojmë shpejtësinë këndore.

Nga ana tjetër, përshpejtuesi MPU6050 mat nxitimin duke matur nxitimin gravitacional përgjatë 3 akseve dhe duke përdorur një matematikë trigonometrike mund të llogarisim këndin në të cilin është vendosur sensori. Pra, nëse bashkojmë ose kombinojmë të dhënat e përshpejtuesit dhe xhiroskopit, mund të marrim informacion shumë të saktë në lidhje me orientimin e sensorit.

MPR-6050 përbëhet nga një xhiroskop me 3 boshte i cili mund të zbulojë shpejtësinë rrotulluese përgjatë boshtit x, y, z me teknologjinë e sistemit mikro-elektronik mekanik (MEMS). Kur sensori rrotullohet përgjatë çdo boshti, një dridhje prodhohet për shkak të efektit Coriolis i cili zbulohet nga MEMS. ADC 16-bitësh përdoret për të dixhitalizuar tensionin për të mostruar secilin aks. +/- 250, +/- 500, +/- 1000, +/- 2000 janë diapazoni i plotë i prodhimit. Shpejtësia këndore matet përgjatë secilit aks në shkallë për njësi të dytë.

Lidhje e dobishme: …………….

Bordi Arduino:. ……….

MPU6050 IMU ……………

Hapi 1: Moduli MPU-6050

Moduli MPU-6050
Moduli MPU-6050

Moduli MPU-6050 ka 8 kunja,

INT: Ndërprit pinin e daljes dixhitale.

AD0: Adresa e skllavit I2C LSB pin. Ky është biti 0 në adresën e skllavit 7-bit të pajisjes. Nëse lidhet me VCC atëherë lexohet si logjikë një dhe ndryshon adresa e skllavit.

XCL: Kunja e orës seriale ndihmëse. Ky pin përdoret për të lidhur sensorët e tjerë të ndërfaqes I2C të aktivizuar me kunj SCL në MPU-6050.

XDA: Kodi PIN i të Dhënave Seriale Ndihmëse. Ky kunj përdoret për të lidhur sensorët e tjerë të ndërfaqes I2C të aktivizuar me kunj SDA në MPU-6050.

SCL: Kodi i orës serike. Lidheni këtë pin me mikrokontrolluesit pin SCL. SDA: Kodi i të dhënave serike. Lidheni këtë kunj me mikrokontrolluesit pin SDA.

GND: Kunja e tokëzimit. Lidheni këtë kunj me lidhjen tokësore.

VCC: Pina e furnizimit me energji elektrike. Lidheni këtë kunj me furnizimin me +5V DC. Moduli MPU-6050 ka adresë Slave (Kur AD0 = 0, dmth. Nuk është e lidhur me Vcc) si, Skllav Shkruani adresën (SLA+W): 0xD0

Adresa e leximit të skllevërve (SLA+R): 0xD1

Hapi 2: Llogaritjet

Llogaritjet
Llogaritjet

Të dhënat e sensorit të xhiroskopit dhe akselerometrit të modulit MPU6050 përbëhen nga të dhëna të papërpunuara 16-bit në formën e komplementit 2.

Të dhënat e sensorit të temperaturës së modulit MPU6050 përbëhen nga të dhëna 16-bit (jo në formën e komplementit të 2-të).

Tani supozoni se kemi zgjedhur,

  • - Gama e shkallës së plotë të përshpejtuesit +/- 2g me Faktorin e Shkallës së Ndjeshmërisë prej 16, 384 LSB (Numërimi)/g.
  • - Gama e shkallës së plotë të xhiroskopit +/- 250 °/s me Faktorin e Shkallës së Ndjeshmërisë prej 131 LSB (Numërimi)/°/s. pastaj,

Për të marrë të dhëna të papërpunuara të sensorit, së pari duhet të kryejmë komplementin 2 në të dhënat e sensorit të Përshpejtuesit dhe xhiroskopit. Pas marrjes së të dhënave të papërpunuara të sensorit, ne mund të llogarisim nxitimin dhe shpejtësinë këndore duke i ndarë të dhënat e papërpunuara të sensorit me faktorin e shkallës së ndjeshmërisë si më poshtë-

Vlerat e përshpejtuesit në g (forca g)

  • Përshpejtimi përgjatë boshtit X = (Përshpejtuesi i aksit X të dhëna të papërpunuara/16384) g.
  • Përshpejtimi përgjatë boshtit Y = (Përshpejtuesi i aksit Y të dhëna të papërpunuara/16384) g.
  • Përshpejtimi përgjatë boshtit Z = (Përshpejtuesi i aksit Z të dhëna të papërpunuara/16384) g.

Vlerat e xhiroskopit në °/s (shkallë për sekondë)

  • Shpejtësia këndore përgjatë boshtit X = (Xhiroskopi boshti X të dhëna të papërpunuara/131) °/s.
  • Shpejtësia këndore përgjatë boshtit Y = (Xhiroskopi boshti Y të dhëna të papërpunuara/131) °/s.
  • Shpejtësia këndore përgjatë boshtit Z = (Xhiroskopi boshti Z të dhëna të papërpunuara/131) °/s.

Vlera e temperaturës në °/c (gradë për Celsius)

Temperatura në gradë C = ((të dhënat e sensorit të temperaturës)/340 + 36.53) °/c.

Për shembull, Supozoni, pas komplementit 2’marrim akselerometër X akset vlera e papërpunuar = +15454

Pastaj Ax = +15454/16384 = 0.94 g.

Me shume,

Pra, ne e dimë se po vrapojmë me një ndjeshmëri +/- 2G dhe +/- 250deg/s, por si korrespondojnë vlerat tona me ato nxitime/kënde.

Këto janë të dy grafikë të linjës së drejtë dhe ne mund të kuptojmë prej tyre se për 1G ne do të lexojmë 16384 dhe për 1 gradë/sek ne do të lexojmë 131.07 (Edhe pse.07 do të injorohet për shkak të binarit) këto vlera sapo u përpunuan duke vizatuar Grafiku i linjës së drejtë me 2G në 32767 dhe -2G në -32768 dhe 250/-250 në të njëjtat vlera.

Pra, tani ne i dimë vlerat tona të ndjeshmërisë (16384 dhe 131.07) na duhet vetëm të shmangim kompensimet nga vlerat tona dhe pastaj të ndahemi nga ndjeshmëria.

Këto do të funksionojnë mirë për vlerat X dhe Y, por pasi Z është regjistruar në 1G dhe jo 0, do të na duhet të zbresim nga 1G (16384) para se të ndahemi me ndjeshmërinë tonë.

Hapi 3: Lidhjet MPU6050-Atmega328p

Lidhjet MPU6050-Atmega328p
Lidhjet MPU6050-Atmega328p
Lidhjet MPU6050-Atmega328p
Lidhjet MPU6050-Atmega328p
Lidhjet MPU6050-Atmega328p
Lidhjet MPU6050-Atmega328p

Thjesht lidhni gjithçka siç jepet në diagram…

Lidhjet jepen si më poshtë:-

MPU6050 Arduino Nano

VCC 5V jashtë pin

GND Kunja e tokëzimit

SDA A4 pin // të dhënat serike

SCL A5 pin // ora serike

Llogaritja e lartësisë dhe rrotullimit: Rrotullimi është rrotullimi rreth boshtit x dhe hapi është rrotullimi përgjatë boshtit y.

Rezultati është në radianë. (konvertohet në gradë duke shumëzuar me 180 dhe duke e ndarë me pi)

Hapi 4: Kodet dhe Shpjegimet

Kodet dhe Shpjegimet
Kodet dhe Shpjegimet

/*

Arduino dhe MPU6050 Tutorial për Përshpejtuesin dhe Sensorin e Gjiroskopit nga Dejan, https://howtomechatronics.com */#include const int MPU = 0x68; // MPU6050 I2C adresa float AccX, AccY, AccZ; noton GyroX, GyroY, GyroZ; noton accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; rrotull notash, katran, yaw; noton AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; noton elapsedTime, currentTime, previousTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Filloni komunikimin Wire.beginTransmission (MPU); // Filloni komunikimin me MPU6050 // MPU = 0x68 Wire.write (0x6B); // Flisni me regjistrin 6B Wire.write (0x00); // Bëni rivendosjen - vendosni një 0 në regjistrin 6B Wire.endTransmission (e vërtetë); // përfundoni transmetimin/* // Konfiguroni ndjeshmërinë e përshpejtuesit - Shkalla e plotë e shkallës (e parazgjedhur +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Flisni me regjistrin ACCEL_CONFIG (1C hex) Wire.write (0x10); // Vendosni bitët e regjistrit si 00010000 (+/- 8g diapazoni të plotë) Wire.endTransmission (e vërtetë); // Konfiguro Ndjeshmërinë Gyro - Gama e Shkallës së Plotë (e parazgjedhur +/- 250deg/s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Flisni me regjistrin GYRO_CONFIG (1B gjashtëkëndësh) Wire.write (0x10); // Vendosni bitët e regjistrit si 00010000 (shkallë e plotë 1000deg/s) Wire.endTransmission (e vërtetë); vonesa (20); */ // Thirrni këtë funksion nëse keni nevojë të merrni vlerat e gabimit IMU për modulin tuaj calc_IMU_error (); vonesa (20); } void loop () {// === Lexo të dhënat e përshpejtuesit === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Filloni me regjistrin 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Tela. Kërkohet Nga (MPU, 6, e vërtetë); // Lexoni gjithsej 6 regjistra, secila vlerë e boshtit ruhet në 2 regjistra // Për një gamë prej +-2g, ne duhet të ndajmë vlerat e papërpunuara me 16384, sipas fletës së të dhënave AccX = (Wire.read () << 8 | Tela.lexo ()) / 16384.0; // Vlera e boshtit X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Vlera e boshtit Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Vlera e boshtit Z // Llogaritja e rrotullës dhe katranit nga të dhënat e përshpejtuesit accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Shikoni funksionin me porosi calc_IMU_error () për më shumë detaje accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Lexo të dhënat e xhiroskopit === // Koha e mëparshme = koha aktuale; // Koha e mëparshme ruhet para kohës aktuale lexoni currentTime = millis (); // Koha aktuale koha aktuale e lexuar elapsedTime = (koha aktuale - koha e mëparshme) / 1000; // Ndajeni me 1000 për të marrë sekonda Wire.beginTransmission (MPU); Wire.write (0x43); // Adresa e regjistrimit të të dhënave Gyro së pari 0x43 Wire.endTransmission (false); Tela. Kërkohet Nga (MPU, 6, e vërtetë); // Lexoni gjithsej 4 regjistra, secila vlerë e boshtit ruhet në 2 regjistra GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Për një gamë 250deg/ s ne duhet të ndajmë së pari vlerën e papërpunuar me 131.0, sipas fletës së të dhënave GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Korrigjoni rezultatet me vlerat e llogaritura të gabimit GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Aktualisht vlerat e papërpunuara janë në gradë për sekonda, deg/s, kështu që ne duhet të shumëzojmë me sendonda (s) për të marrë këndin në gradë gyroAngleX = gyroAngleX + GyroX * elastedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * koha e kaluar; yaw = yaw + GyroZ * koha e kaluar; // Filtri plotësues - kombinoni vlerat e këndit të përshpejtuesit dhe gjiros rrotull = 0.96 * gyroAngleX + 0.04 * accAngleX; katran = 0.96 * gjiroAngleY + 0.04 * accAngleY; // Shtypni vlerat në monitorin serik Serial.print (roll); Serial.print ("/"); Serial.print (katran); Serial.print ("/"); Serial.println (yaw); } void calc_IMU_error () {// Ne mund ta quajmë këtë funksion në seksionin e konfigurimit për të llogaritur gabimin e përshpejtuesit dhe të dhënave xhiro. Nga këtu do të marrim vlerat e gabimit të përdorura në ekuacionet e mësipërme të shtypura në Serial Monitor. // Vini re se ne duhet ta vendosim IMU të sheshtë në mënyrë që të marrim vlerat e duhura, në mënyrë që të mundemi atëherë vlerat e sakta // Lexoni vlerat e përshpejtuesit 200 herë ndërsa (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmetimi (i rremë); Tela. Kërkohet Nga (MPU, 6, e vërtetë); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Përmbledh të gjitha leximet 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 ++; } // Ndani shumën me 200 për të marrë vlerën e gabimit AccErrorX = AccErrorX /200; AccErrorY = AccErrorY / 200; c = 0; // Lexoni vlerat xhiro 200 herë ndërsa (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmetimi (i rremë); Tela. Kërkohet Nga (MPU, 6, e vërtetë); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Përmbledh të gjitha leximet GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Ndani shumën me 200 për të marrë vlerën e gabimit GyroErrorX = GyroErrorX /200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Shtypni vlerat e gabimit në 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); } ----------------------------------------------------- ---------------------------------------------- Rezultatet:-X = Y = Z = ------------------------------------------------- -------------------------------------------------- Shënim i rëndësishëm: -----------------

Në pjesën lak fillojmë duke lexuar të dhënat e përshpejtuesit. Të dhënat për secilin aks ruhen në 2 byte ose regjistra dhe ne mund të shohim adresat e këtyre regjistrave nga fleta e të dhënave të sensorit.

Për t'i lexuar të gjithë, fillojmë me regjistrin e parë dhe duke përdorur funksionin requiestFrom () kërkojmë të lexojmë të 6 regjistrat për akset X, Y dhe Z. Pastaj lexojmë të dhënat nga secili regjistër, dhe për shkak se daljet janë dy plotësuese, i kombinojmë ato në mënyrë të përshtatshme për të marrë vlerat e sakta.

Hapi 5: Kuptimi i Këndit të Pjerrët

Akselerometër

Graviteti i tokës është një përshpejtim konstant ku forca është gjithmonë drejtuar poshtë në qendër të Tokës.

Kur përshpejtuesi është paralel me gravitetin, nxitimi i matur do të jetë 1G, kur përshpejtuesi është pingul me gravitetin, ai do të masë 0G.

Këndi i pjerrësisë mund të llogaritet nga nxitimi i matur duke përdorur këtë ekuacion:

θ = sin-1 (Përshpejtimi i matur / Përshpejtimi i gravitetit)

GyroGyro (a.k.a. sensor sensor) përdoret për të matur shpejtësinë këndore (ω).

Për të marrë këndin e pjerrësisë së një roboti, ne duhet të integrojmë të dhënat nga xhiro siç tregohet në ekuacionin më poshtë:

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

Fuzioni i Sensorit Gyro dhe AccelerometerPas studimit të karakteristikave të xhiros dhe akselerometrit, ne e dimë se ato kanë pikat e forta dhe të dobëta të tyre. Këndi i llogaritur i pjerrësisë nga të dhënat e përshpejtuesit ka kohë të ngadalshme të përgjigjes, ndërsa këndi i integruar i pjerrësisë nga të dhënat xhiro i nënshtrohet zhvendosjes gjatë një periudhe kohe. Me fjalë të tjera, mund të themi se të dhënat e përshpejtuesit janë të dobishme për një afat të gjatë, ndërsa të dhënat xhiro janë të dobishme për një afat të shkurtër.

Lidhje për kuptim më të mirë: Kliko Këtu

Recommended: