راه اندازی ماژول ژیروسکوپ توسط آردوینو
ژیروسکوپ (Gyroscope) چیست ؟
ژیروسکوپ دستگاهی است که به وسیله آن میتوانید سرعت زاویه ای را به صورت سه محوره (سه محور XYZ در مختصات فضایی) اندازه گیری کنید. این دستگاه طبق اصول حرکتهای زاویه ای (حرکتهای دورانی) کار میکند و برای مشخص کردن وضعیت یک جسم در فضا استفاده میشود. برای مثال وقتی گوشی تلفن همراه خود را به شکل خوابیده در دست میگیرید. این ژیروسکوپ گوشی هوشمند شماست که تشخیص میدهد که گوشی در حالت دوران یافته قرار گرفته است و صفحه نمایش گوشی شما با دستور این سنسور میچرخد.این نوع سنسورها در قالب یک مجموعه آماده به کار به نام ماژول ژیروسکوپ در بازار موجود هستند. از کاربردهای معمول این ماژولها میتوان به هدایت راکت و موشکهای مدل ، کنترل پرواژ پهبادها ، گوشیهای هوشمند ، کنسولهای بازی و دستههای آنها و … اشاره کرد. تکنولوژیهای ساخت مختلفی برای ماژولهای ژیروسکوپ وجود دارد. مانند تکنولوژی مکانیکی،MEMS ، فیبر نوری ، حلقه لیزر و …
ماژول ژیروسکوپ مورد نظر ما برای وصل کردن به آردوینو یکی از ماژولهای معروف به نام GY521 است. تکنولوژی ساخت آن MEMS است . این لغت مخفف سامانه میکرو الکترو مکانیکی (Micro elecro-mechanical system) است. این تکنولوژی بر پایه پدیده فیزیکی آونگ فوکو (Focualt Pendulum) طراحی شده و دارای اجزای نوسان کننده الکترو مکانیکی است که به کمک آنها میتوان دوران را تشخیص داد.
ماژول ژیروسکوپ GY521 :
ماژول ژیروسکوپ GY521 یک ژیروسکوپ ۳ محوره به همراه یک شتاب سنج داخلی است که بر اساس تراشه MPU6050 ساخته شده است . تراشه MPU6050 دارای شش عدد تبدیل کننده دادههای آنالوگ به دیجیتال (ADC) با دقت ۱۶ بیت است. سه عدد از این مبدلهای ADC برای کاربرد ژیروسکوپ و سه عدد دیگر هم برای شتاب سنج (Accelerometer) استفاده میشوند.
روش برقراری ارتباط این ماژول ژیروسکوپ با آردوینو یا هر وسیله دیگر از جمله میکروکنترلرها با پروتکل I2C است. ولتاژ کاری IC MPU6050 بین ۲٫۳۷ ولت تا ۴٫۴۶ ولت است.
یک تنظیم کننده ولتاژ روی ماژول ژیروسکوپ GY521 وظیفه تنظیم ولتاژ برای تغذیه این IC را بر عهده دارد. محدوده اندازه گیری شتاب سنج و ژیروسکوپ قابل برنامه ریزی توسط کاربر و به ترتیب برای شتاب سنج +/- ۲g ، ۴g ، ۸g و ۱۶g و برای ژیروسکوپ +/- ۲۵۰ ، ۵۰۰ ، ۱۰۰۰ و ۲۰۰۰ درجه بر ثانیه است .
مشخصات ماژول GY-521 طبق دیتاشیت:
- خروجی دیجیتال داده Motion Fusion در 6 یا 9 محور با فرمت داده به صورت ماتریس چرخش، Quaternion، زاویه اویلر و یا فرمت داده خام
- ژیروسکوب 3 محور با حساسیت تا 131 کم ارزشترین داده بر هر درجه در ثانیه LSBs/dps با چهار بازه اندازه گیری 250±، 500±، 1000± و 2000± درجه در ثانیه.
- شتاب سنج 3 محور با رنج قابل برنامه ریزی برای 4 بازه 2g، ±4g، ±8g، ±16g± .
- موتور پردازش دیجیتال حرکت (DMP) با توانایی اجرای الگوریتمهای پیچیده Motion Fusion، سنکرونسازی زمانی سنسور و تشخیص نوع حرکات.
- دارای الگوریتم های داخلی مورد نیاز برای بایاس در زمان run-time و نیز قابلیت کالیبراسیون قطب نما، بدون نیاز به دخالت کاربر.
- دارای سنسور دماسنج داخلی با خروجی دیجیتال.
- دارای وقفه های قابل برنامه ریزی با قابلیت پشتیبانی از تشخیص حرکات مانند ضربه، حرکات ناگهانی، بالا و پایین رفتن، سقوط آزاد، حرکت با شتاب های بالا، بدون حرکت، همچنین برای تشخیص ضربات و تشخیص لرزش وقفه مجزا در نظر گرفته شده است.
- دارای مدار Timing داخلی با تغییرات فرکانسی به میزان 1 درصد در تغییراتی به میزان کل رنج دمای کاری.
- قابلیت تحمل شوکهای مکانیکی تا 10000g
با استفاده از دیتاشیت MPU6050 در مییابیم که مقدارهای خروجی ژیروسکوپ در هر سه محور به وسیله معادلههای زیر تبدیل به سرعت زاویه ای خواهند شد:
v_pitch=GyX/131
v_roll=GyY/131
v_yaw=GyZ/131
جالب است این را هم بدانید که Pich یه معنای دوران روی محور Xها ، Roll به معنای دوران روی محور Yها و Yaw هم به معنای دوران روی محور Zها است. عکس زیر این مفاهیم را به خوبی مشخص میکند:
خوب تا اینجا معلوم شد که چگونه میتوان با استفاده از ماژول ژیروسکوپ GY521 سرعتهای زاوایه ای دوران یک جسم را در سه محور به دست آورد. شاید برایتان سوال پیش بیاید که سرعت که مکان نیست ! بله حرف شما درست است. اما اگر ما سرعت و زمان انجام حرکت را داشته باشیم میتوانیم جابجایی را هم حساب کنیم. پس کافی است زمان بین دو اندازه گیری پشت سر هم سرعتها را داشته باشیم تا جابجایی زاویه ای را هم به دست آوریم.
برای این کار کافی است که سرعت زاویه ای ( بر حسب درجه بر ثانیه) را در زمان بین اندازه گیری سرعتها (بر حسب ثانیه) ضرب کنیم تا جابجایی زاویه ای را هم در هر محور به دست آوریم. برای این کار از معادلات زیر بهره میبریم که بر اساس دیتاشیت تراشه MPU6050 نوشته شده اند:
a_pitch=v_pitch *0.047
a_roll=v_roll * 0.047
a_yaw=v_yaw*0.047
خیلی واضح است که a_pich یعنی جابجایی زاویه ای حول محور xها ، a_roll به معنای جابجایی زاویه ای حول محور yها و a_yaw جابجایی زاویه ای حول محور zها است .
pitch= pitch + a_pitch
roll= roll + a_roll
yaw= yaw + a_yaw
در آخر هم جابجایی کل را با فرمولهای بالا ذخیره میکنیم. این فرمولها به سادگی میگویند جابجای کل در هر محور برابر است با جابجایی تا کنون + جابجایی جدید.
وصل کردن ماژول ژیروسکوپ به آردوینو:
همان طور که میبینید ماژول GY521 با ولتاژ +۵ ولت تغذیه میشود که برای سادگی از برد آردوینو گرفته شده است. پایههای SCL و SDA ماژول ژیروسکوپ GY521 هم به ترتیب به پایههای A5 و A4 آردوینو وصل شده اند.همان طور که حتما حدس زده اید،دو پایه SCL و SDA برای برقراری ارتباط I2C بین ماژول و آردوینو به کار میروند.
برنامه آردوینو برای تست وصل شدن ماژول زیروسکوپ به آردوینو:
#include<Wire.h> #include<LiquidCrystal.h> const int MPU=0x68; //I2C address of MPU int GyX,GyY,GyZ; float pitch=0; float roll=0; float yaw=0; float v_pitch; float v_roll; float v_yaw; float a_pitch; float a_roll; float a_yaw; void setup() { Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); //power management register 1 Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); } void loop() { Wire.beginTransmission(MPU); Wire.write(0x43); //starts with MPU register 43(GYRO_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); //requests 6 registers GyX=Wire.read()<<8|Wire.read(); GyY=Wire.read()<<8|Wire.read(); GyZ=Wire.read()<<8|Wire.read(); v_pitch=(GyX/131); if(v_pitch==-1) //error filtering {v_pitch=0;} v_roll=(GyY/131); if(v_roll==1) //error filtering {v_roll=0;} v_yaw=GyZ/131; a_pitch=(v_pitch*0.046); a_roll=(v_roll*0.046); a_yaw=(v_yaw*0.045); pitch= pitch + a_pitch; roll= roll + a_roll; yaw= yaw + a_yaw; Serial.print(" | pitch = "); Serial.print(pitch); Serial.print(" | roll = "); Serial.print(roll); Serial.print(" | yaw = "); Serial.println(yaw); }
نکات دیگر ماژول :
- همان طور که اینجا هم استفاده شده است. شما میتوانید ماژول GY521 را مستقیما با برق ۵ ولت خود آردوینو تغذیه کنید.
- همیشه از دیتاشیت MPU6050 برای به عنوان مرجع کار کردن با ماژول استفاده کنید.
- یک اسکرین شات از خروجی برنامه روی پنجره مانیتور سریال مجازی آردوینو گرفته شده است :
- همین کد برنامه نویسی را میتوانید طوری تغییر دهید که نتیجه روی LCD واقعی نشان داده شود.
- اگر توجه کنید مقدارها و معادلات درون کد برنامه اندکی با چیزی که ما به آن اشاره کردیم فرق دارند. این تغییرات برای بالا رفتن دقت ایجاد شده است.
- یک سنسور دما هم روی ماژول GY521 قرار دارد که ما به آن اشاره ای نکردیم . اگر میخواهید از سنسور دمای ماژول ژیروسکوپ GY521 هم اسفاده کنید میتوانید از کد برنامه نویسی زیر بهره ببرید:
#include<Wire.h> #include<LiquidCrystal.h> const int MPU=0x68; //I2C address of MPU float temp; void setup() { Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); //power management register 1 Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); } void loop() { Wire.beginTransmission(MPU); Wire.write(0x41); //starts with MPU register 41(TEMP_OUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); //requests 2 registers temp=Wire.read()<<8|Wire.read(); temp=(temp/340)+36.53; //equation for temperature from datasheet Serial.print(" Temperature = "); Serial.println(temp); delay(100); }
منابع: circuitstoday.com و سایت های فارسی زبان
با سلام
می خواستم بدونم سه محور
heave
surge
sway
رو چجوری به صورت سانتی متر یا متر نشون بدم؟؟
سلام بسیار عالی بود
متشکرم