Talaan ng mga Nilalaman:
- Hakbang 1: Module ng MPU-6050
- Hakbang 2: Mga Pagkalkula
- Hakbang 3: Mga Koneksyon sa MPU6050-Atmega328p
- Hakbang 4: Mga Code at Paliwanag
- Hakbang 5: Pag-unawa sa Angulo ng Ikiling
Video: MPU 6050 Gyro, Komunikasyon ng Accelerometer Sa Arduino (Atmega328p): 5 Mga Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:10
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
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
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
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
/*
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:
Magdagdag ng isang Digital Display sa isang Lumang Tumatanggap ng Mga Komunikasyon: 6 na Hakbang (na may Mga Larawan)
Magdagdag ng isang Digital Display sa isang Lumang Tanggap ng Komunikasyon: Ang isa sa mga pagkukulang ng paggamit ng isang mas matandang gamit sa komunikasyon ay ang katunayan na ang analog dial ay hindi masyadong tumpak. Palagi kang hulaan sa dalas na iyong natatanggap. Sa mga banda ng AM o FM, sa pangkalahatan ito ay hindi isang problema sapagkat madalas kang
Raspberry PI 3 - Paganahin ang Mga Serial na Komunikasyon sa TtyAMA0 hanggang BCM GPIO 14 at GPIO 15: 9 Mga Hakbang
Raspberry PI 3 - Paganahin ang Mga Serial na Komunikasyon sa TtyAMA0 hanggang BCM GPIO 14 at GPIO 15: Kamakailan lamang ay nagkaroon ako ng interes na paganahin ang UART0 sa aking Raspberry Pi (3b) upang maikonekta ko ito nang direkta sa isang aparato ng antas ng signal na RS-232 gamit ang isang karaniwang 9 -pin d-sub konektor nang hindi kinakailangang dumaan sa isang USB sa RS-232 adapter. Bahagi ng aking intere
Wireless na Komunikasyon Gamit ang NRF24L01 Transceiver Module para sa Mga Proyekto na Nakabatay sa Arduino: 5 Mga Hakbang (na may Mga Larawan)
Wireless na Komunikasyon Gamit ang NRF24L01 Transceiver Module para sa Mga Proyekto na Nakabatay sa Arduino: Ito ang aking pangalawang itinuturo na tutorial tungkol sa mga robot at micro-Controller. Tunay na kamangha-manghang makita ang iyong robot na buhay at gumagana tulad ng inaasahan at maniwala ka sa akin magiging mas masaya kung kontrolin mo ang iyong robot o iba pang mga bagay nang wireless nang mabilis at
Paano Wastong Sukatin ang Pagkonsumo ng Lakas ng Mga Wireless na Module ng Komunikasyon sa Era ng Mababang Pagkonsumo ng Kuryente ?: 6 Mga Hakbang
Paano Wastong Sukatin ang Pagkonsumo ng Lakas ng Mga Wireless na Module ng Komunikasyon sa Panahon ng Mababang Pagkonsumo ng Power?: Ang mababang paggamit ng kuryente ay isang napakahalagang konsepto sa Internet ng Mga Bagay. Karamihan sa mga IoT node ay kailangang pinalakas ng mga baterya. Sa pamamagitan lamang ng wastong pagsukat ng pagkonsumo ng kuryente ng module ng wireless maaari nating tumpak na matantya kung magkano ang baterya i
Realtime MPU-6050 / A0 Pag-log ng Data Sa Arduino at Android: 7 Mga Hakbang (na may Mga Larawan)
Realtime MPU-6050 / A0 Pag-log ng Data Sa Arduino at Android: Naging interesado ako sa paggamit ng Arduino para sa pag-aaral ng makina. Bilang unang hakbang, nais kong bumuo ng isang realtime (o medyo malapit dito) pagpapakita ng data at pag-logger sa isang Android device. Nais kong makuha ang data ng accelerometer mula sa MPU-6050 kaya't dinisenyo ko