Orodha ya maudhui:

MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p): Hatua 5
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p): Hatua 5

Video: MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p): Hatua 5

Video: MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p): Hatua 5
Video: Как использовать акселерометр и гироскоп MPU-6050 с кодом Arduino 2024, Julai
Anonim
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p)
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p)
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p)
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p)
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p)
MPU 6050 Gyro, Mawasiliano ya Accelerometer na Arduino (Atmega328p)

MPU6050 IMU ina accelerometer ya 3-Axis na 3-Axis gyroscope iliyojumuishwa kwenye chip moja.

Gyroscope hupima kasi ya mzunguko au kiwango cha mabadiliko ya nafasi ya angular kwa muda, kando ya mhimili wa X, Y na Z.

Matokeo ya gyroscope iko katika digrii kwa sekunde, kwa hivyo ili kupata nafasi ya angular tunahitaji tu kuunganisha kasi ya angular.

Kwa upande mwingine, accelerometer ya MPU6050 hupima kasi kwa kupima kasi ya mvuto kando ya shoka 3 na kutumia hesabu za trigonometry tunaweza kuhesabu pembe ambayo sensor imewekwa. Kwa hivyo, ikiwa tutaunganisha, au kuchanganya data ya accelerometer na gyroscope tunaweza kupata habari sahihi sana juu ya mwelekeo wa sensorer.

3-mhimili Gyroscope MPU-6050 inajumuisha gyroscope 3 ya mhimili ambayo inaweza kugundua kasi ya kuzunguka kando ya x, y, z axis na teknolojia ndogo ya mfumo wa mitambo (MEMS). Wakati sensor inapozungushwa kando ya mhimili wowote mtetemo hutolewa kwa sababu ya athari ya Coriolis ambayo hugunduliwa na MEMS.16-bit ADC hutumiwa kukadiri voltage ili kupimia kila mhimili. + / - 250, +/- 500, +/- 1000, +/- 2000 ni kiwango kamili cha pato. Kasi ya angular hupimwa kwa kila mhimili kwa kiwango kwa kila kitengo cha pili.

Kiungo Muhimu: …………….

Bodi ya Arduino:. ……….

IMU MPU6050 ……………

Hatua ya 1: Moduli ya MPU-6050

Moduli ya MPU-6050
Moduli ya MPU-6050

Moduli ya MPU-6050 ina pini 8,

INT: Kukatiza pini ya pato la dijiti.

AD0: Anwani ya Mtumwa ya I2C siri ya LSB. Hii ni kidogo kwa anwani ya watumwa ya 7-bit. Ikiwa imeunganishwa na VCC basi inasomeka kama mantiki moja na mabadiliko ya anwani ya mtumwa.

XCL: Siri ya Saa Msaidizi ya Saa. Pini hii hutumiwa kuunganisha sensorer nyingine za sensorer za I2C SCL kwa MPU-6050.

XDA: Siri ya Takwimu za Msaidizi. Pini hii hutumiwa kuunganisha nyuso zingine za sensorer za I2C za SDA kwa MPU-6050.

SCL: Siri ya Saa ya Siri. Unganisha pini hii kwa pini ndogo ya SCL. SDA: Siri ya Takwimu ya siri. Unganisha pini hii kwa pini ndogo ya SDA.

GND: Pini ya chini. Unganisha pini hii na unganisho la ardhi.

VCC: Pini ya usambazaji wa umeme. Unganisha pini hii kwa usambazaji wa + 5V DC. Moduli ya MPU-6050 ina anwani ya Mtumwa (Wakati AD0 = 0, i.e. haijaunganishwa na Vcc) kama, Mtumwa Andika anwani (SLA + W): 0xD0

Anwani ya Soma ya Mtumwa (SLA + R): 0xD1

Hatua ya 2: Mahesabu

Mahesabu
Mahesabu

Data ya sensa ya Gyroscope na Accelerometer ya moduli ya MPU6050 ina data mbichi ya 16-bit katika fomu ya 2 inayosaidia.

Takwimu za sensorer ya joto ya moduli ya MPU6050 ina data 16-bit (sio katika fomu ya 2 inayosaidia).

Sasa tuseme tumechagua,

  • - Kiwango kamili cha kiwango cha Accelerometer cha +/- 2g na Sababu ya Usikivu ya 16, 384 LSB (Hesabu) / g.
  • - Kiwango kamili cha Gyroscope ya +/- 250 ° / s na Kiwango cha Usikivu cha 131 LSB (Hesabu) / ° / s. basi,

Ili kupata data ghafi ya sensorer, tunahitaji kwanza kutekeleza 2 inayosaidia kwenye data ya sensorer ya Accelerometer na gyroscope. Baada ya kupata data ghafi ya sensa tunaweza kuhesabu kasi na kasi ya angular kwa kugawanya data ghafi ya sensa na sababu yao ya unyeti kama ifuatavyo--

Thamani za Accelerometer katika g (g nguvu)

  • Kuongeza kasi pamoja na mhimili wa X = (Accelerometer X data ghafi ya data / 16384) g.
  • Kuongeza kasi pamoja na mhimili Y = (Accelerometer Y axis data raw / 16384) g.
  • Kuongeza kasi pamoja na mhimili wa Z = (Accelerometer Z axis raw data / 16384) g.

Thamani za Gyroscope kwa ° / s (digrii kwa sekunde)

  • Kasi ya angular kando ya mhimili X = (Gyroscope X mhimili data ghafi / 131) ° / s.
  • Kasi ya angular kando ya mhimili Y = (Gyroscope Y mhimili data ghafi / 131) ° / s.
  • Kasi ya angular kando ya mhimili wa Z = (Gyroscope Z axis data ghafi / 131) ° / s.

Thamani ya joto katika ° / c (digrii kwa Celsius)

Joto kwa digrii C = ((data ya sensorer ya joto) / 340 + 36.53) ° / c.

Kwa mfano, Tuseme, baada ya 2 'inayosaidia tunapata kasi ya kasi ya axes X thamani + 15454

Kisha Ax = +15454/16384 = 0.94 g.

Zaidi,

Kwa hivyo tunajua tunakimbia kwa unyeti wa +/- 2G na +/- 250deg / s lakini maadili yetu yanahusiana vipi na hizo kasi / pembe.

Hizi zote ni grafu za laini moja kwa moja na tunaweza kuzifahamisha kutoka kwao kwamba kwa 1G tutasoma 16384 na kwa 1degree / sec tutasoma 131.07 (Ingawa.07 itapuuza kwa sababu ya binary) maadili haya yalifanywa tu kwa kuchora mstari wa moja kwa moja na 2G kwa 32767 na -2G kwa -32768 na 250 / -250 kwa maadili sawa.

Kwa hivyo sasa tunajua maadili yetu ya unyeti (16384 na 131.07) tunahitaji tu kuondoa makosa kutoka kwa maadili yetu na kisha tugawane na unyeti.

Hizi zitafanya kazi vizuri kwa maadili ya X na Y lakini kama Z ilirekodiwa katika 1G na sio 0 tutahitaji kuondoa 1G (16384) kabla ya kugawanya kwa unyeti wetu.

Hatua ya 3: Uunganisho wa MPU6050-Atmega328p

Uunganisho wa MPU6050-Atmega328p
Uunganisho wa MPU6050-Atmega328p
Uunganisho wa MPU6050-Atmega328p
Uunganisho wa MPU6050-Atmega328p
Uunganisho wa MPU6050-Atmega328p
Uunganisho wa MPU6050-Atmega328p

Unganisha tu kila kitu kama ilivyoonyeshwa kwenye mchoro…

Viunganisho hutolewa kama ifuatavyo: -

MPU6050 Arduino Nano

VCC 5v nje pini

Pini ya chini ya GND

Siri ya SDA A4 // data ya serial

Siri ya SCL A5 // saa ya serial

Hesabu ya Kutembeza na Kutembeza: Roll ni kuzunguka kuzunguka mhimili wa x na lami ni kuzunguka kando ya mhimili.

Matokeo yake ni katika radians. (badili hadi digrii kwa kuzidisha kwa 180 na kugawanya kwa pi)

Hatua ya 4: Nambari na Maelezo

Misimbo na Maelezo
Misimbo na Maelezo

/*

Arduino na MPU6050 Accelerometer na Gyroscope Sensor Tutorial na Dejan, https://howtomechatronics.com * / # pamoja na const int MPU = 0x68; // MPU6050 I2C anwani ya kuelea AccX, AccY, AccZ; kuelea GyroX, GyroY, GyroZ; kuelea accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; kuelea roll, lami, yaw; kuelea AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; kuelea ilipita Muda, Wakati wa sasa, Wakati uliopita; int c = 0; kuanzisha batili () {Serial.begin (19200); Wire.begin (); // Anzisha mawasiliano ya waya.anza Uwasilishaji (MPU); // Anza mawasiliano na MPU6050 // MPU = 0x68 Wire.write (0x6B); // Ongea na rejista 6B Wire. Andika (0x00); // Tengeneza upya - weka 0 kwenye rejista ya 6B Wire.endTransmission (kweli); // kumaliza usambazaji / * // Sanidi Usikivu wa Accelerometer - Masafa Kamili ya Kiwango (chaguo-msingi +/- 2g) Waya. Andika waya (0x1C); // Ongea na rejista ya ACCEL_CONFIG (1C hex) Wire.write (0x10); // Weka seti za rejista kama 00010000 (+/- 8g anuwai kamili) Wire.endTransmission (kweli); // Sanidi Usikivu wa Gyro - Kiwango Kamili cha Kiwango (chaguo-msingi +/- 250deg / s) Wire.beginTrmission (MPU); Andika waya (0x1B); // Ongea na rejista ya GYRO_CONFIG (1B hex) Wire.write (0x10); // Weka seti za rejista kama 00010000 (1000deg / s kiwango kamili) Wire.endTransmission (kweli); kuchelewesha (20); * / // Piga kazi hii ikiwa unahitaji kupata maadili ya makosa ya IMU kwa moduli yako mahesabu_IMU_error (); kuchelewesha (20); } kitanzi batili () {// === Soma data ya kuharakisha === // Wire.beginTransmission (MPU); Andika waya (0x3B); // Anza na rejista 0x3B (ACCEL_XOUT_H) Wire.endTransmission (uwongo); Ombi la Wire. From (MPU, 6, kweli); // Soma jumla ya sajili 6, kila thamani ya mhimili imehifadhiwa katika rejista 2 // Kwa anuwai ya + -2g, tunahitaji kugawanya nambari mbichi kufikia 16384, kulingana na datasheet AccX = (Wire.read () << 8 | Soma kwa waya ()) / 16384.0; // Thamani ya mhimili wa X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Thamani ya Y-mhimili AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Thamani ya Z-mhimili // Kuhesabu Roll na Pitch kutoka data ya accelerometer accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Tazama kazi ya mahesabu_IMU_error () kwa maelezo zaidi accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~ (-1.58) // === Soma data ya gyroscope === // previousTime = currentTime; // Wakati uliopita umehifadhiwa kabla ya wakati halisi kusoma sasaTime = millis (); // Wakati wa sasa wakati uliyosomwa ulipitaTime = (wakati wa sasa - wakati uliopita) / 1000; // Gawanya na 1000 kupata sekunde Wire.beginTransmission (MPU); Andika waya (0x43); // data ya Gyro kwanza sajili anwani 0x43 Wire.endUsambazaji (uwongo); Ombi la Wire. From (MPU, 6, kweli); // Soma jumla ya sajili 4, kila thamani ya mhimili imehifadhiwa katika rejista 2 GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Kwa kiwango cha 250deg / s tunapaswa kugawanya kwanza thamani mbichi na 131.0, kulingana na data ya GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Sahihisha matokeo na maadili ya makosa yaliyohesabiwa GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Hivi sasa maadili ghafi yapo kwa digrii kwa sekunde, dig / s, kwa hivyo tunahitaji kuzidisha kwa sendonds (s) kupata pembe kwa digrii gyroAngleX = gyroAngleX + GyroX * ilapsedTime; // deg / s * s = deg gyroAngleY = gyroAngleY + GyroY * ilipita Muda; yaw = yaw + GyroZ * ilipita Muda; // Kichungi cha ziada - unganisha kasi ya kasi na pembe za gyro = 0.96 * gyroAngleX + 0.04 * accAngleX; lami = 0.96 * gyroAngleY + 0.04 * accAngleY; // Chapisha maadili kwenye mfuatiliaji wa serial Serial.print (roll); Serial.print ("/"); Printa ya serial (lami); Serial.print ("/"); Serial.println (yaw); } batili calculate_IMU_error () {// Tunaweza kupiga simu hii katika sehemu ya usanidi ili kuhesabu kasi ya kasi na data ya gyro. Kutoka hapa tutapata maadili ya makosa yaliyotumiwa katika hesabu zilizo hapo juu zilizochapishwa kwenye Serial Monitor. // Kumbuka kuwa tunapaswa kuweka gorofa ya IMU ili kupata maadili sahihi, ili tuweze kupata maadili sahihi // Soma viwango vya kasi mara 200 wakati (c <200) {Wire.beginTransmission (MPU); Andika waya (0x3B); Uwasilishaji wa waya (uwongo); Ombi la Wire. From (MPU, 6, kweli); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Soma kwa waya) << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Jumla ya usomaji wote AccErrorX = AccErrorX + ((atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * 180 / PI)); AccErrorY = AccrrorY + ((atan (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * 180 / PI)); c ++; } // Gawanya jumla na 200 ili kupata thamani ya kosa AccErrorX = AccErrorX / 200; KosaY = KosaYa / 200; c = 0; // Soma gyro inathamini mara 200 wakati (c <200) {Wire.beTransmission (MPU); Andika waya (0x43); Uwasilishaji wa waya (uwongo); Ombi la Wire. From (MPU, 6, kweli); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Jumla ya masomo yote GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Gawanya jumla na 200 ili kupata thamani ya makosa GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Chapisha maadili ya makosa kwenye 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); } ------------------------------------------ ---------------------------------------------- Matokeo: - X = Y = Z = --------------------------------------------- ----------------------------------------------- Kumbuka muhimu: - ----------------

Katika sehemu ya kitanzi tunaanza kwa kusoma data ya accelerometer. Takwimu za kila mhimili zimehifadhiwa kwa ka 2 au rejista na tunaweza kuona anwani za rejista hizi kutoka kwa hati ya kihisi.

Ili kuzisoma zote, tunaanza na rejista ya kwanza, na kutumia kazi ya RequiestFrom () tunaomba kusoma sajili zote 6 za shoka za X, Y na Z. Kisha tunasoma data kutoka kwa kila rejista, na kwa sababu matokeo ni mawili yanayosaidia, tunaunganisha ipasavyo kupata maadili sahihi.

Hatua ya 5: Kuelewa Angle ya Tilt

Accelerometer

Mvuto wa dunia ni kasi ya mara kwa mara ambapo nguvu kila wakati inaelekeza katikati ya Dunia.

Wakati accelerometer inalingana na mvuto, kasi ya kipimo itakuwa 1G, wakati accelerometer ni sawa na mvuto, itapima 0G.

Pembe ya mwelekeo inaweza kuhesabiwa kutoka kwa kasi ya kipimo kwa kutumia equation hii:

sin = dhambi-1 (Kuongeza kasi ya Kupima / Kuongeza kasi ya Mvuto)

Gyro (sensa ya kiwango cha aka) hutumiwa kupima kasi ya angular (ω).

Ili kupata pembe ya roboti, tunahitaji kujumuisha data kutoka kwa gyro kama inavyoonyeshwa kwenye equation hapa chini:

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

Baada ya kusoma sifa za gyro na accelerometer, tunajua kuwa wana nguvu na udhaifu wao wenyewe. Pembe ya mahesabu iliyohesabiwa kutoka kwa data ya accelerometer ina wakati wa kujibu polepole, wakati pembe ya kuogea iliyojumuishwa kutoka kwa data ya gyro inakabiliwa kwa muda mrefu. Kwa maneno mengine, tunaweza kusema kwamba data ya accelerometer ni muhimu kwa muda mrefu wakati data ya gyro ni muhimu kwa muda mfupi.

Kiungo cha uelewa bora: Bonyeza Hapa

Ilipendekeza: