فهرست مطالب:

MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p): 5 مرحله
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p): 5 مرحله

تصویری: MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p): 5 مرحله

تصویری: MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p): 5 مرحله
تصویری: ژیروسکوپ ، معرفی ماژول MPU6050 ماژول ژیروسکوپ 2024, نوامبر
Anonim
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p)
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p)
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p)
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p)
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p)
MPU 6050 Gyro ، ارتباط شتاب سنج با آردوینو (Atmega328p)

MPU6050 IMU دارای شتاب سنج 3 محور و ژیروسکوپ 3 محور است که روی یک تراشه یکپارچه شده است.

ژیروسکوپ سرعت چرخش یا میزان تغییر موقعیت زاویه ای را در طول زمان ، در امتداد محور X ، Y و Z اندازه گیری می کند.

خروجی ژیروسکوپ بر حسب درجه بر ثانیه است ، بنابراین برای بدست آوردن موقعیت زاویه ای ، ما فقط باید سرعت زاویه ای را یکپارچه کنیم.

از سوی دیگر ، شتاب سنج MPU6050 شتاب را با اندازه گیری شتاب گرانشی در طول 3 محور اندازه گیری می کند و با استفاده از برخی از ریاضیات مثلثات می توان زاویه ای را که سنسور در آن قرار گرفته است محاسبه کرد. بنابراین ، اگر داده های شتاب سنج و ژیروسکوپ را با هم ترکیب کرده یا ترکیب کنیم ، می توانیم اطلاعات بسیار دقیقی در مورد جهت سنسور بدست آوریم.

MPR-6050 شامل یک ژیروسکوپ 3 محوری است که می تواند سرعت چرخش در امتداد محور x ، y ، z را با فناوری سیستم میکرو الکترومکانیکی (MEMS) تشخیص دهد. هنگامی که سنسور در امتداد هر محور می چرخد ، لرزش ناشی از اثر Coriolis ایجاد می شود که توسط MEMS تشخیص داده می شود. ADC 16 بیتی برای دیجیتالی شدن ولتاژ برای نمونه برداری از هر محور استفاده می شود. +/- 250 ، +/- 500 ، +/- 1000 ، +/- 2000 محدوده خروجی در مقیاس کامل هستند. سرعت زاویه ای در طول هر محور بر حسب درجه بر واحد واحد اندازه گیری می شود.

پیوند مفید: …………….

برد آردوینو: ……….

MPU6050 IMU ……………

مرحله 1: ماژول MPU-6050

ماژول MPU-6050
ماژول MPU-6050

ماژول MPU-6050 دارای 8 پین است ،

INT: قطع پین خروجی دیجیتال.

AD0: پین LSB آدرس برده I2C. این 0 بیت در آدرس برده دستگاه 7 بیت است. اگر به VCC متصل است ، آن را به عنوان منطق یک خوانده می شود و آدرس برده تغییر می کند.

XCL: پین ساعت سریال کمکی. این پین برای اتصال سایر سنسورهای رابط I2C SCL pin به MPU-6050 استفاده می شود.

XDA: پین داده های سریال کمکی. این پین برای اتصال دیگر پین SDA سنسورهای فعال شده با رابط I2C به MPU-6050 استفاده می شود.

SCL: پین ساعت سریال. این پین را به پین SCL میکروکنترلرها وصل کنید. SDA: پین داده سریال. این پین را به پین SDA میکروکنترلرها وصل کنید.

GND: سنجاق پایه. این پین را به اتصال زمین متصل کنید.

VCC: پین منبع تغذیه این پین را به منبع تغذیه +5V DC وصل کنید. ماژول MPU-6050 دارای آدرس Slave (هنگامی که AD0 = 0 ، یعنی به Vcc متصل نیست) به عنوان ،

برده آدرس نوشتن (SLA+W): 0xD0

Slave Read address (SLA+R): 0xD1

مرحله 2: محاسبات

محاسبات
محاسبات

داده های حسگر ژیروسکوپ و شتاب سنج ماژول MPU6050 شامل داده های خام 16 بیتی در فرم مکمل 2 است.

داده های حسگر دما ماژول MPU6050 شامل داده های 16 بیتی است (نه به شکل مکمل 2).

حالا فرض کنید ما انتخاب کرده ایم ،

  • - شتاب سنج مقیاس کامل +/- 2g با مقیاس حساسیت 16 ، 384 LSB (تعداد)/گرم.
  • - محدوده مقیاس کامل ژیروسکوپ +/- 250 درجه/ثانیه با ضریب حساسیت مقیاس 131 LSB (تعداد)/درجه/ثانیه. سپس،

برای به دست آوردن داده های خام سنسور ، ابتدا باید مکمل 2 را روی داده های حسگر شتاب سنج و ژیروسکوپ انجام دهیم. پس از بدست آوردن داده های خام سنسور ، می توان شتاب و سرعت زاویه ای را با تقسیم داده های خام حسگر با ضریب حساسیت آنها به شرح زیر محاسبه کرد-

مقادیر شتاب سنج در g (g نیروی)

  • شتاب در امتداد محور X = (شتاب سنج X محور داده خام/16384) گرم.
  • شتاب در امتداد محور Y = (شتاب سنج محور Y داده خام/16384) g.
  • شتاب در امتداد محور Z = (شتاب سنج محور Z داده خام/16384) گرم.

مقادیر ژیروسکوپ بر حسب درجه بر ثانیه (درجه در ثانیه)

  • سرعت زاویه ای در امتداد محور X = (ژیروسکوپ X محور داده خام/131) °/ثانیه.
  • سرعت زاویه ای در امتداد محور Y = (ژیروسکوپ محور Y داده خام/131) °/ثانیه.
  • سرعت زاویه ای در امتداد محور Z = (ژیروسکوپ محور Z داده خام/131) °/ثانیه.

مقدار دما بر حسب درجه سانتی گراد (درجه در درجه سانتیگراد)

درجه حرارت در درجه C = ((داده های سنسور دما)/340 + 36.53) °/c.

مثلا،

فرض کنید ، پس از مکمل 2 '، شتاب سنج X axes value = 15454 +را بدست می آوریم

سپس Ax = +15454/16384 = 0.94 گرم.

بیشتر،

بنابراین ما می دانیم که ما با حساسیت +/- 2G و +/- 250 درجه سانتیگراد بر ثانیه کار می کنیم ، اما چگونه مقادیر ما با این شتاب ها/زاویه مطابقت دارد.

اینها هر دو نمودار مستقیم هستند و می توان از آنها استفاده کرد که برای 1G ما 16384 و برای 1 درجه/ثانیه 131.07 را می خوانیم (اگرچه.07 به دلیل باینری نادیده گرفته می شود) این مقادیر فقط با رسم نمودار نمودار خط مستقیم با 2G در 32767 و -2G در -32768 و 250/-250 در مقادیر یکسان.

بنابراین در حال حاضر ما مقادیر حساسیت خود را می دانیم (16384 و 131.07) ما فقط باید مقدارهای جبران شده را از مقادیر خود حذف کرده و سپس حساسیت را در نظر بگیریم.

اینها برای مقادیر X و Y خوب عمل می کنند اما همانطور که Z در 1G ثبت شد و نه 0 ، قبل از تقسیم بر حساسیت خود ، باید 1G (16384) را خالی کنیم.

مرحله 3: اتصالات MPU6050-Atmega328p

اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p

فقط کافی است هر چیزی را که در نمودار آمده است وصل کنید…

اتصالات به شرح زیر است:-

MPU6050 آردوینو نانو

پین VCC 5v

GND پایه پایه

پین SDA A4 // داده های سریال

پین SCL A5 // ساعت سریال

محاسبه گام و رول: رول چرخش حول محور x و گام چرخش در امتداد محور y است.

نتیجه بر حسب رادیان است. (تبدیل به درجه با ضرب در 180 و تقسیم بر pi)

مرحله 4: کدها و توضیحات

کدها و توضیحات
کدها و توضیحات

/*

آموزش Arduino و MPU6050 Accelerometer and Gyroscope Sensor by Dejan، https://howtomechatronics.com */#inconste const int MPU = 0x68؛ // آدرس MPU6050 I2C float AccX، AccY، AccZ؛ شناور GyroX ، GyroY ، GyroZ ؛ float accAngleX، accAngleY، gyroAngleX، gyroAngleY، gyroAngleZ؛ شناور رول ، زمین ، خمیازه ؛ شناور AccErrorX ، AccErrorY ، GyroErrorX ، GyroErrorY ، GyroErrorZ ؛ float elapsedTime ، currentTime ، previousTime ؛ int c = 0؛ void setup () {Serial.begin (19200)؛ Wire.begin ()؛ // راه اندازی ارتباط Wire.beginTransmission (MPU) ؛ // شروع ارتباط با MPU6050 // MPU = 0x68 Wire.write (0x6B) ؛ // با ثبت کننده 6B Wire.write (0x00) صحبت کنید ؛ // بازنشانی کنید - 0 را در رجیستر 6B Wire.endTransmission (درست) قرار دهید. // پایان انتقال/* // پیکربندی حساسیت شتاب سنج - محدوده مقیاس کامل (به طور پیش فرض +/- 2g) Wire.beginTransmission (MPU) ؛ Wire.write (0x1C) ؛ // با ثبت ACCEL_CONFIG (1C hex) Wire.write (0x10) صحبت کنید ؛ // بیت های ثبات را 00010000 (+/- 8g در مقیاس کامل) Wire.endTransmission (درست) تنظیم کنید؛ // پیکربندی حساسیت ژیروسکوپ - محدوده مقیاس کامل (پیش فرض +/- 250deg/s) Wire.beginTransmission (MPU) ؛ Wire.write (0x1B) ؛ // با ثبت GYRO_CONFIG (1B hex) Wire.write (0x10) صحبت کنید ؛ // بیت های ثبات را به صورت 00010000 (1000deg/s full scale) Wire.endTransmission (true) تنظیم کنید ؛ تأخیر (20) ؛ */ // در صورت نیاز به دریافت مقادیر خطای IMU برای ماژول شما calc_IMU_error () ، با این تابع تماس بگیرید. تأخیر (20) ؛ } void loop () {// === خواندن داده های شتاب دهنده === // Wire.beginTransmission (MPU) ؛ Wire.write (0x3B) ؛ // شروع با ثبت 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false) ؛ سیم. درخواست از (MPU ، 6 ، درست) ؛ // مجموع 6 رجیستر را بخوانید ، هر مقدار محور در 2 رجیستر ذخیره می شود // برای محدوده +-2g ، ما باید مقادیر خام را بر اساس 16384 تقسیم کنیم ، مطابق برگه داده AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // ارزش محور X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // ارزش محور Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // مقدار محور Z // محاسبه رول و پیچ از داده های شتاب سنج accAngleX = (atan (AccY / sqrt (pow (AccX، 2) + pow (AccZ، 2))) * 180 / PI) - 0.58؛ // AccErrorX ~ (0.58) برای جزئیات بیشتر تابع سفارشی calc_IMU_error () را ببینید accAngleY = (atan (-1 * AccX / sqrt (pow (AccY، 2) + pow (AccZ، 2))) * 180 / PI) + 1.58 ؛ // AccErrorY ~ (-1.58) // === خواندن داده های ژیروسکوپ === // previousTime = currentTime ؛ // زمان قبلی قبل از زمان واقعی ذخیره می شود currentTime = millis ()؛ // زمان فعلی زمان واقعی خواندن elapsedTime = (currentTime - previousTime) / 1000 ؛ // تقسیم بر 1000 برای بدست آوردن ثانیه Wire.beginTransmission (MPU) ؛ Wire.write (0x43) ؛ // Gyro data اول آدرس ثبت 0x43 Wire.endTransmission (false) ؛ سیم. درخواست از (MPU ، 6 ، درست) ؛ // کل 4 رجیستر را بخوانید ، هر مقدار محور در 2 رجیستر ذخیره می شود GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0؛ // برای محدوده 250 درجه سانتی گراد بر ثانیه ، ابتدا باید مقدار خام را بر 131.0 تقسیم کنیم ، طبق داده GyroY = (Wire.read () << 8 | Wire.read ())/ 131.0 ؛ GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0 ؛ // خروجی ها را با مقادیر خطای محاسبه شده GyroX = GyroX + 0.56 تصحیح کنید ؛ // GyroErrorX ~ (-0.56) GyroY = GyroY - 2 ؛ // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79 ؛ // GyroErrorZ ~ (-0.8) // در حال حاضر مقادیر خام بر حسب درجه بر ثانیه ، deg/s است ، بنابراین ما باید در sendonds (ها) ضرب کنیم تا زاویه را در درجه بدست آوریم gyroAngleX = gyroAngleX + GyroX * elapsedTime؛ // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime؛ yaw = yaw + GyroZ * elapsedTime؛ // فیلتر مکمل - ترکیب مقادیر شتاب دهنده و زاویه ای رول = 0.96 * gyroAngleX + 0.04 * accAngleX ؛ زمین = 0.96 * gyroAngleY + 0.04 * accAngleY ؛ // مقادیر را در مانیتور سریال Serial.print (roll) چاپ کنید ؛ Serial.print ("/") ؛ Serial.print (زمین)؛ Serial.print ("/") ؛ Serial.println (خمیازه) ؛ } void calc_IMU_error () {// ما می توانیم این بخش را در قسمت setup برای محاسبه خطای شتاب سنج و ژیروسکوپ فراخوانی کنیم. از اینجا مقادیر خطای مورد استفاده در معادلات بالا چاپ شده در Serial Monitor را دریافت می کنیم. // توجه داشته باشید که برای بدست آوردن مقادیر مناسب ، باید IMU را به صورت مسطح قرار دهیم ، تا بتوانیم مقادیر صحیح را در اختیار داشته باشیم // مقادیر شتاب سنج را 200 بار در حالی که (c <200) {Wire.beginTransmission (MPU) بخوانید ؛ Wire.write (0x3B) ؛ Wire.endTransmission (false) ؛ سیم. درخواست از (MPU ، 6 ، درست) ؛ AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // جمع آوری تمام خوانش ها AccErrorX = AccErrorX + ((atan ((AccY) / sqrt (pow ((AccX) ، 2) + pow ((AccZ) ، 2))) * 180 / PI)) ؛ AccErrorY = AccErrorY + ((آتان (-1 * (AccX) / sqrt (پاور ((AccY) ، 2) + پاور ((AccZ) ، 2))) * 180 / PI)) ؛ c ++ ؛ } // مجموع را بر 200 تقسیم کنید تا مقدار خطا AccErrorX = AccErrorX /200؛ AccErrorY = AccErrorY / 200 ؛ c = 0 ؛ // مقادیر ژیروسکوپ را 200 بار بخوانید در حالی که (c <200) {Wire.beginTransmission (MPU) ؛ Wire.write (0x43) ؛ Wire.endTransmission (false) ؛ سیم. درخواست از (MPU ، 6 ، درست) ؛ GyroX = Wire.read () << 8 | Wire.read ()؛ GyroY = Wire.read () << 8 | Wire.read ()؛ GyroZ = Wire.read () << 8 | Wire.read ()؛ // جمع آوری تمام خواندن GyroErrorX = GyroErrorX + (GyroX / 131.0) ؛ GyroErrorY = GyroErrorY + (GyroY / 131.0) ؛ GyroErrorZ = GyroErrorZ + (GyroZ / 131.0) ؛ c ++ ؛ } // مجموع را بر 200 تقسیم کنید تا مقدار خطا GyroErrorX = GyroErrorX /200؛ GyroErrorY = GyroErrorY / 200 ؛ GyroErrorZ = GyroErrorZ / 200 ؛ // مقادیر خطا را در 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) ؛ } ----------------------------------------------------- ---------------------------------------------- نتایج:-X = Y = Z = ------------------------------------------------- ----------------------------------------------- یادداشت مهم: -----------------

در قسمت حلقه با خواندن داده های شتاب سنج شروع می کنیم. داده های هر محور در 2 بایت یا ثبات ذخیره می شود و ما می توانیم آدرس این رجیسترها را از برگه داده سنسور مشاهده کنیم.

برای خواندن همه آنها ، ما با اولین ثبت شروع می کنیم و با استفاده از تابع requiestFrom () درخواست می کنیم که هر 6 ثبات را برای محورهای X ، Y و Z بخوانیم. سپس داده های هر ثبات را می خوانیم و چون خروجی ها دو مکمل هستند ، آنها را به طور مناسب ترکیب می کنیم تا مقادیر صحیح را بدست آوریم.

مرحله 5: درک زاویه شیب

شتاب سنج

گرانش زمین یک شتاب ثابت است که در آن نیرو همیشه به سمت پایین به سمت مرکز زمین حرکت می کند.

وقتی شتاب سنج با گرانش موازی باشد ، شتاب اندازه گیری شده 1G خواهد بود ، هنگامی که شتاب سنج عمود بر گرانش باشد ، 0G را اندازه گیری می کند.

زاویه شیب را می توان با استفاده از این معادله از شتاب اندازه گیری شده محاسبه کرد:

θ = sin-1 (شتاب اندازه گیری شده / شتاب گرانش)

برای اندازه گیری سرعت زاویه ای (ω) از GyroGyro (a.k.a. sensor sensor) استفاده می شود.

برای بدست آوردن زاویه شیب یک روبات ، ما باید داده های ژیروسکوپ را مانند معادله زیر ادغام کنیم:

ω = dθ / dt ،

θ = ∫ ω dt

پس از مطالعه ویژگی های ژیروسکوپ و شتاب سنج ، می دانیم که آنها نقاط قوت و ضعف خود را دارند. زاویه شیب محاسبه شده از داده های شتاب سنج دارای زمان پاسخ آهسته است ، در حالی که زاویه شیب یکپارچه از داده های ژیروسکوپ در طی یک دوره زمانی در معرض رانش قرار می گیرد. به عبارت دیگر ، می توان گفت که داده های شتاب سنج برای بلند مدت مفید است در حالی که داده های ژیروسکوپ برای کوتاه مدت مفید است.

پیوند برای درک بهتر: اینجا را کلیک کنید

توصیه شده: