Talaan ng mga Nilalaman:

MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p): 5 Mga Hakbang
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p): 5 Mga Hakbang

Video: MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p): 5 Mga Hakbang

Video: MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p): 5 Mga Hakbang
Video: Учебное пособие по Arduino: введение, начало работы и создание проекта [Подзаголовок: все языки] 2024, Hulyo
Anonim
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p)
MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p)

Ang MPU6050 IMU ay may parehong 3-Axis accelerometer at 3-Axis gyroscope na isinama sa isang solong maliit na tilad.

Sinusukat ng gyroscope ang bilis ng pag-ikot o rate ng pagbabago ng posisyon ng angular sa paglipas ng panahon, kasama ang axis ng X, Y at Z.

Ang mga output ng gyroscope ay nasa degree bawat segundo, kaya upang makuha ang posisyon ng anggulo kailangan lamang naming isama ang angular na tulin.

Sa kabilang banda, ang MPU6050 accelerometer ay sumusukat sa pagpabilis sa pamamagitan ng pagsukat ng gravitational acceleration kasama ang 3 axes at paggamit ng ilang trigonometry math maaari nating kalkulahin ang anggulo kung saan nakaposisyon ang sensor. Kaya, kung fuse namin, o pagsamahin ang data ng accelerometer at gyroscope maaari naming makuha ang tumpak na impormasyon tungkol sa orientation ng sensor.

3-axis Gyroscope Ang MPU-6050 ay binubuo ng isang 3 axis gyroscope na makakakita ng bilis ng pag-ikot kasama ang x, y, z axis na may teknolohiya ng micro electro mechanical system (MEMS). Kapag ang sensor ay pinaikot kasama ng anumang axis isang paggalaw ay ginawa dahil sa epekto ng Coriolis na napansin ng MEMS.16-bit ADC ay ginagamit upang i-digitize ang boltahe upang mai-sample ang bawat axis. + / - 250, +/- 500, +/- Ang 1000, +/- 2000 ay ang buong saklaw na saklaw ng output. Sinusukat ang bilis ng bilis sa bawat axis sa degree bawat segundo.

Kapaki-pakinabang na Link: …………….

Lupon ng Arduino:. ……….

MPU6050 IMU ……………

Hakbang 1: Module ng MPU-6050

Modyul ng MPU-6050
Modyul ng MPU-6050

Ang module ng MPU-6050 ay may 8 mga pin,

INT: Makagambala sa digital output pin.

AD0: I2C Slave Address LSB pin. Ito ang ika-0 na bit sa 7-bit na address ng alipin ng aparato. Kung nakakonekta sa VCC pagkatapos basahin ito bilang isang lohika at mga pagbabago sa address ng alipin.

XCL: Auxiliary Serial Clock pin. Ginagamit ang pin na ito upang ikonekta ang iba pang mga interface ng naka-interface na I2C na SCL pin sa MPU-6050.

XDA: Pin na Auxiliary Serial Data. Ginamit ang pin na ito upang ikonekta ang iba pang mga interface na pinagana ng interface ng I2C na SDA pin sa MPU-6050.

SCL: Serial Clock pin. Ikonekta ang pin na ito sa microcontrollers SCL pin. SDA: Pin ng Serial Data. Ikonekta ang pin na ito sa microcontrollers SDA pin.

GND: Ground pin. Ikonekta ang pin na ito sa koneksyon sa lupa.

VCC: Power supply pin. Ikonekta ang pin na ito sa supply ng + 5V DC. Ang module ng MPU-6050 ay may Slave address (Kapag AD0 = 0, ibig sabihin, hindi ito konektado sa Vcc) bilang, Alipin Sumulat ng address (SLA + W): 0xD0

Basahin ang address ng Basahin (SLA + R): 0xD1

Hakbang 2: Mga Pagkalkula

Kalkulasyon
Kalkulasyon

Ang data ng sensor ng Gyroscope at Accelerometer ng module ng MPU6050 ay binubuo ng 16-bit na hilaw na data sa form na pandagdag ng 2.

Ang data ng sensor ng temperatura ng module ng MPU6050 ay binubuo ng 16-bit na data (wala sa form na pampuno ng 2).

Ngayon ipagpalagay na pinili natin,

  • - Saklaw na saklaw ng buong scale ng +/- 2g na may Sensitivity Scale Factor ng 16, 384 LSB (Bilang) / g.
  • - Saklaw ng buong sukat ng Gyroscope na +/- 250 ° / s na may Sensitivity Scale Factor na 131 LSB (Count) / ° / s. pagkatapos,

Upang makakuha ng hilaw na data ng sensor, kailangan muna naming gampanan ang 2 na pandagdag sa data ng sensor ng Accelerometer at gyroscope. Matapos makuha ang hilaw na data ng sensor maaari nating kalkulahin ang bilis ng bilis at angular na tulin sa pamamagitan ng paghahati ng hilaw na data ng sensor sa kanilang kadahilanan sa antas ng pagiging sensitibo tulad ng sumusunod -

Mga halaga ng Accelerometer sa g (g puwersa)

  • Pagpapabilis sa kahabaan ng X axis = (Accelerometer X axis raw data / 16384) g.
  • Pagpapabilis sa kahabaan ng Y axis = (Accelerometer Y axis raw data / 16384) g.
  • Pagpapabilis sa kahabaan ng Z axis = (Accelerometer Z axis raw data / 16384) g.

Mga halaga ng gyroscope sa ° / s (degree bawat segundo)

  • Angular na tulin sa kahabaan ng X axis = (Gyroscope X axis raw data / 131) ° / s.
  • Angular na tulin sa kahabaan ng Y axis = (Gyroscope Y axis raw data / 131) ° / s.
  • Angular na tulin sa kahabaan ng Z axis = (Gyroscope Z axis raw data / 131) ° / s.

Halaga ng temperatura sa ° / c (degree bawat Celsius)

Temperatura sa degree C = ((data ng sensor ng temperatura) / 340 + 36.53) ° / c.

Halimbawa, Ipagpalagay, pagkatapos ng 2’komplemento nakakakuha kami ng accelerometer X axes raw na halaga = +15454

Pagkatapos Ax = +15454/16384 = 0.94 g.

Higit pa,

Kaya alam namin na tumatakbo kami sa isang pagkasensitibo ng +/- 2G at +/- 250deg / s ngunit paano magkatugma ang aming mga halaga sa mga acceleration / anggulo na iyon.

Ang mga ito ay parehong tuwid na mga graph at maaari kaming mag-ehersisyo mula sa kanila na para sa 1G ay babasahin natin ang 16384 at para sa 1degree / sec ay babasahin natin ang 131.07 (Bagaman ang.07 ay hindi papansinin dahil sa binary) ang mga halagang ito ay nagawa lamang sa pamamagitan ng pagguhit ng straight line graph na may 2G sa 32767 at -2G sa -32768 at 250 / -250 sa parehong mga halaga.

Kaya't alam natin ngayon ang aming mga halaga ng pagiging sensitibo (16384 at 131.07) kailangan lang namin na bawasan ang mga offset mula sa aming mga halaga at pagkatapos ay ibahin ang pagiging sensitibo.

Ang mga ito ay gagana nang maayos para sa mga halagang X at Y ngunit dahil ang Z ay naitala sa 1G at hindi 0 kakailanganin nating bawasan ang 1G (16384) bago natin hatiin ang aming pagkasensitibo.

Hakbang 3: Mga Koneksyon sa MPU6050-Atmega328p

Mga Koneksyon sa MPU6050-Atmega328p
Mga Koneksyon sa MPU6050-Atmega328p
Mga Koneksyon sa MPU6050-Atmega328p
Mga Koneksyon sa MPU6050-Atmega328p
Mga Koneksyon sa MPU6050-Atmega328p
Mga Koneksyon sa MPU6050-Atmega328p

Ikonekta lamang ang bawat bagay na ibinigay sa diagram …

Ang mga koneksyon ay ibinibigay tulad ng sumusunod: -

MPU6050 Arduino Nano

VCC 5v out pin

GND Ground pin

SDA A4 pin // serial data

SCL A5 pin // serial clock

Pagkalkula ng Pitch at Roll: Ang roll ay ang pag-ikot sa paligid ng x-axis at pitch ay ang pag-ikot kasama ang y-axis.

Ang resulta ay sa mga radian. (i-convert sa degree sa pamamagitan ng pag-multiply ng 180 at paghahati sa pamamagitan ng pi)

Hakbang 4: Mga Code at Paliwanag

Mga Code at Paliwanag
Mga Code at Paliwanag

/*

Arduino at MPU6050 Accelerometer at Gyroscope Sensor Tutorial ni Dejan, https://howtomechatronics.com * / # isama ang const int MPU = 0x68; // MPU6050 I2C address float AccX, AccY, AccZ; lumutang GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, nakaraangTime; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Initialize comunication Wire.beginTransmission (MPU); // Start komunikasyon with MPU6050 // MPU = 0x68 Wire.write (0x6B); // Talk to the register 6B Wire.write (0x00); // Make reset - ilagay ang 0 sa 6B register Wire.endTransmission (true); // end the transmission / * // Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Talk to the ACCEL_CONFIG register (1C hex) Wire.write (0x10); // Itakda ang mga register bit bilang 00010000 (+/- 8g buong saklaw na sukat) Wire.endTransmission (totoo); // Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg / s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Talk to the GYRO_CONFIG register (1B hex) Wire.write (0x10); // Itakda ang mga register bit bilang 00010000 (1000deg / s buong sukat) Wire.endTransmission (totoo); pagkaantala (20); * / // Tawagin ang pagpapaandar na ito kung kailangan mong makuha ang mga halaga ng error sa IMU para sa iyong module na calcul_IMU_error (); pagkaantala (20); } void loop () {// === Basahin ang data ng acceleromter === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Start with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, totoo); // Basahin ang kabuuang bilang ng 6 na rehistro, ang bawat halaga ng axis ay nakaimbak sa 2 rehistro // Para sa isang saklaw na + -2g, kailangan nating hatiin ang mga hilaw na halaga ng 16384, ayon sa datasheet na AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // X-axis value AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Y-axis halaga ng AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Z-axis halaga // Kinakalkula ang Roll at Pitch mula sa data ng accelerometer accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Tingnan ang calcul_IMU_error () pasadyang pagpapaandar para sa higit pang mga detalye accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Basahin ang data ng gyroscope === // nakaraangTime = kasalukuyangTime; // Nakaraan na oras ay naka-imbak bago ang aktwal na oras basahin ang kasalukuyangTime = millis (); // Kasalukuyang oras aktwal na oras basahin ang lumipasTime = (kasalukuyangTime - nakaraangTime) / 1000; // Hatiin ng 1000 upang makakuha ng mga segundo Wire.beginTransmission (MPU); Wire.write (0x43); // data ng Gyro unang rehistro ang address 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, totoo); // Basahin ang kabuuang 4 na rehistro, ang bawat halaga ng axis ay nakaimbak sa 2 rehistro GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Para sa isang saklaw na 250deg / s kailangan nating hatiin muna ang hilaw na halaga ng 131.0, ayon sa datasheet na GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Iwasto ang mga output na may kinakalkula na mga halaga ng error GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Kasalukuyan ang mga hilaw na halaga ay nasa degree bawat segundo, deg / s, kaya kailangan nating magparami ng (mga) sendond upang makuha ang anggulo sa degree na gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg / s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * lumipas na Oras; // Komplementaryong filter - pagsamahin ang mga halaga ng acceleromter at gyro anggulo roll = 0.96 * gyroAngleX + 0.04 * accAngleX; pitch = 0.96 * gyroAngleY + 0.04 * accAngleY; // I-print ang mga halaga sa serial monitor Serial.print (roll); Serial.print ("/"); Serial.print (pitch); Serial.print ("/"); Serial.println (yaw); } void calcul_IMU_error () {// Maaari naming tawagan ang funtion na ito sa seksyon ng pag-set up upang makalkula ang error ng accelerometer at gyro data. Mula dito makukuha natin ang mga halagang error na ginamit sa mga equation sa itaas na naka-print sa Serial Monitor. // Tandaan na dapat nating ilagay ang IMU flat upang makuha ang wastong mga halaga, upang maaari nating maiayos ang mga halaga // Basahin ang mga halaga ng accelerometer 200 beses habang (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, totoo); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Kabuuan ang lahat ng pagbabasa 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 ++; } // Hatiin ang kabuuan ng 200 upang makuha ang halaga ng error na AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Basahin ang mga halagang gyro ng 200 beses habang (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (false); Wire.requestFrom (MPU, 6, totoo); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Kabuuan ang lahat ng pagbabasa GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Hatiin ang kabuuan ng 200 upang makuha ang halaga ng error na GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // I-print ang mga halaga ng error sa 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); } ---- ---------------------------------------------- Mga Resulta: - X = Y = Z = -------------------------------------------- ----------------------------------------------- Mahalagang paalaala: - ----------------

Sa seksyon ng loop nagsisimula kami sa pamamagitan ng pagbabasa ng data ng accelerometer. Ang data para sa bawat axis ay nakaimbak sa 2 bytes o rehistro at maaari naming makita ang mga address ng mga rehistro mula sa datasheet ng sensor.

Upang mabasa ang lahat ng ito, nagsisimula kami sa unang rehistro, at ginagamit ang function na RequiestFrom () na hiniling namin na basahin ang lahat ng 6 na rehistro para sa mga axis ng X, Y at Z. Pagkatapos ay basahin namin ang data mula sa bawat rehistro, at dahil ang mga output ay pareho na magkumpleto, pinagsama namin ang mga ito nang naaangkop upang makuha ang wastong mga halaga.

Hakbang 5: Pag-unawa sa Angulo ng Ikiling

Accelerometer

Ang grabidad ng mundo ay isang pare-pareho ang pagbilis kung saan ang puwersa ay palaging nakaturo pababa sa gitna ng Earth.

Kapag ang accelerometer ay kahanay ng gravity, ang sinusukat na pagpabilis ay magiging 1G, kapag ang accelerometer ay patayo sa gravity, susukat nito ang 0G.

Ang pagkiling ng anggulo ay maaaring kalkulahin mula sa sinusukat na bilis ng paggamit ng equation na ito:

θ = sin-1 (Sinukat na Pagpapabilis / Pagpapabilis ng Gravity)

Ang GyroGyro (a.k.a. rate sensor) ay ginagamit upang sukatin ang angular velocity (ω).

Upang makuha ang anggulo ng ikiling ng isang robot, kailangan naming isama ang data mula sa gyro tulad ng ipinakita sa equation sa ibaba:

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

Gyro at Accelerometer Sensor Fusion Matapos pag-aralan ang mga katangian ng parehong gyro at accelerometer, alam natin na mayroon silang sariling mga lakas at kahinaan. Ang kinakalkula na anggulo ng ikiling mula sa data ng accelerometer ay may mabagal na oras ng pagtugon, habang ang pinagsamang anggulo ng ikiling mula sa data ng gyro ay napapailalim sa naaanod sa loob ng isang panahon. Sa madaling salita, masasabi nating ang data ng accelerometer ay kapaki-pakinabang para sa pangmatagalang habang ang data ng gyro ay kapaki-pakinabang para sa maikling panahon.

Link para sa mas mahusay na pag-unawa: Mag-click Dito

Inirerekumendang: