آموزش راه اندازی MPU6050 با آردوینو – بخش دوم

مقدمه

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

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

کد راه اندازی ماژول

کد راه اندازی سنسور:

[post_shop]

کد راه اندازی ماژول به شکل زیر می باشد. ابتدا به صورت کلی به کد نگاهی بیندازید تا در ادامه خطوط کد را کاملا دقیق توضیح دهیم:

 

حال بیایید کد را کمی دقیق تر بررسی کنیم.

در این سه خط کتابخانه های لازم برای اجرای این برنامه آورده شده اند. در اینجا ما به سه کتابخانه Wire.h و MPU6050.h و I2Cdev.h نیاز داریم. کتابخانه Wire.h که جزو کتابخانه های داخلی آردوینو هست و نیاز به نصب ندارد ولی بقیه کتابخانه ها نیاز به نصب دارند. لینک دانلود دو کتابخانه دیگر در زیر آورده شده است:

 

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

 

در این خط یک متغیر ( به زبان دقیق تر یک Object ) از کلاس MPU6050 با نام sensor تعریف می شود. 

 

 در این دو خط نیز ، 6 متغیر تعریف می شود. سه متغیر برای داده های ژیروسکوپ ( هر متغیر برای یک محور)  و سه متغیر دیگر برای داده های شتاب سنج ( هر متغیر برای یک محور ) . 

 با استفاده از خط Serial.begin نرخ ارتباط سریال مشخص می شود. همچنین با استفاده از خط Wire.begin ، مشخص اعلام حضور خود را در باس I2C مشخص میکنیم. اگر در این تابع یک پارامتر وارد کنیم ، به عنوان یک Slave وارد باس I2C شده ایم و آن پارامتر ، آدرس ما می باشد. اما اگر آدرسی وارد نکنیم ( مثل همین خط ) نشان می دهد که به عنوان یک Master وارد باس شده ایم. 

خط مربوط به MPU.initialize نیز تنظیمات اولیه مربوط به سنسور MPU6050 را انجام می دهد. این تنظیمات شامل رنج اندازه گیری شتاب سنج و ژیروسکوپ و همچنین خارج کردن ماژول از مد Sleep   و … می باشد.(  رنج اندازه گیری ژیروسکوپ  250dps± و رنج اندازه گیری شتاب 2g±  قرار داده شده اند. ) 

 

 این دستورات نیز ارتباط بین آردوینو و MPU6050 را بررسی می کنند. در صورت برقراری ارتباط عبارت sensor started correctly روی پنجره سریال نمایش داده می شود. همچنین در صورت عدم برقراری ارتباط ، عبارت Failed to start sensor روی پنجره سریال نمایش داده می شود. اگر این عبارت را بر صفحه نمایش دیدید، یک بار دیگر اتصالات بین آردوینو و ماژول را چک کنید. 

 

 این دو خط نیز بسیار واضح می باشند. در این دو خط ما داده های مربوط به شتابسنج و ژیروسکوپ را میخوانیم و در آدرسی که متغیرهای ax ay az و gx gy gz به آن اشاره می کنند، ذخیره می کنیم. اگر با مفهوم اشاره گرها آشنا نیستید ، پیشنهاد میکنم حتما جلسه مربوط به اشاره گرها را از لینک زیر بخوانید:

 

 این خطوط هم که مقادیر مربوط به داده ها را در پنجره سریال نمایش می دهند. این خطوط واضح می باشند و نیاز به توضیحی بیشتر ندارند. 

در نهایت ، در صورتی که همه موارد بالا به درستی انجام شده باشد، پس از آپلود کد بر روی برد آردوینو و باز کردن پنجره سریال ، باید داده ها را به شکل زیر ببینید:

راه اندازی MPU6050 با آردوینو - داده های خروجی

تبدیل داده های خام به شتاب و سرعت زاویه ای

نکته ای که در مورد این داده ها وجود دارد این است که این داده ها صرفا یک سری اعداد دیجیتال هستند و سرعت زاویه ای و شتابی که ما انتظار داشتیم نیستند. به همین علت باید یک سری محاسبات ریاضی بر روی آنها انجام شود تا داده های نهایی برای ما بدست آید. اینجاست که از پارامتر حساسیت (Sensitivity) باید استفاده کنیم. ما این پارامتر را در جلسه مربوط به ژیروسکوپ توضیح داده بودیم. پس حتما آن جلسه را مطالعه کنید. 

ابتدا داده های مربوط به ژیروسکوپ  را محاسبه میکنیم:

برای این کار ابتدا به جدول زیر که از دیتاشیت MPU6050 گرفته شده است ، نگاه کنید:

حساسیت ژیروسکوپ در MPU6050

در جدول بالا، متناسب با هر رنج ، یک حساسیت وجود دارد. در این جا ما از رنج  250dps± استفاده کرده ایم. پس باید از حساسیت مربوط به همین رنج نیز استفاده کنیم. این حساسیت مطابق شکل برابر با 131 LSB بر درجه بر ثانیه است.  شاید در نگاه اول کمی این واحد عجیب و غریب به نظر برسد.  معنای این واحد هم به این صورت است که به ازای هر یک درجه بر ثانیه  تغییر سرعت زاویه ای ، مقدار خروجی   ، خروجی دیجیتال ژیروسکوپ ، 131 واحد تغییر می کند. حال به عنوان مثال ، اگر خروجی ژیروسکوپ برابر 765 بود ، سرعت زاویه ای برابر با 765/131 یعنی  حدود 6 درجه بر ثانیه است. ( و این یعنی ژیروسکوپ هر ثانیه 6 درجه می چرخد. )

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

حال همین محاسبات را برای شتاب سنج نیز باید انجام دهیم. ابتدا جدول مربوط به محدوده اندازه گیری و حساسیت را در نظر بگیرید:

حساسیت شتاب سنج در MPU6050

مطابق جدول بالا ، چون ما از رنج 2g± استفاده کرده ایم ، پس باید حساسیت مربوط به آن یعنی 16384 LSB بر g را استفاده کنیم. معنای این واحد هم به این صورت است که به ازای هر g ، مقدار خروجی دیجیتال شتاب سنج 16384 واحد تغییر میکند. البته توجه داشته باشید که یک g شتاب زیادی است. مقدار این شتاب برابر با 9.81 متر بر مجذور ثانیه. بنابراین با تقسیم مقدار خروجی شتاب سنج بر 16384 میتوانیم شتاب را بر حسب g بدست آوریم. البته شاید ملموس تر آن باشد که شتاب را بر حسب متر بر مجذور ثانیه بدست آوریم. بنابراین اگر کل عبارت را بر g تقسیم کنیم ، آنگاه شتاب را بر حسب متر بر مجذور ثانیه بدست می آید. به زبان ساده تر داریم : 

[/post_shop]

نحوه تبدیل شتاب بر حسب متر بر مجذور ثانیه در MPU6050

بنابراین کدهای زیر را باید به مجموعه کدهای بالا اضافه کنیم تا داده های شتاب سنج نیز بر حسب متر بر مجذور ثانیه بدست می آید. 

حال اگر بار دیگر نتایج را نشان دهیم ، در این صورت خواهیم داشت : 

همانطور که مشاهده می کنید ، وقتی سنسور را در به موازات سطح زمین قرار می دهیم ، در جهت z مقدار تقریبی 9.9 متر بر مجذور ثانیه را به ما نشان می دهد. این شتاب همان شتاب جاذبه زمین است. چون در این حالت محور z سنسور در راستای شتاب جاذبه می باشد. 

توجه کنید که اگر سنسور را 90 درجه بچرخانیم و محورهای x و y آن را در جهت شتاب جاذبه قرار دهیم ، در این صورت شتاب های مربوط به x و y مقدار تقریبی 9.9 متر بر مجذور ثانیه را به خود خواهند گرفت. (این موضوع را خودتان تست کنید.)

به پایان این جلسه رسیدیم. مثل همیشه میتوانید برای اطلاع از مطالب جدید و دیگر مطالبی که در سایت منتشر نمی شوند ، ما را در تلگرام و یا اینستاگرام دنبال کنید:

 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

12 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • سلام خسته نباشید ممنون از مطلبی که گذاشتید
    من دوتا سوال داشتم:
    1-آیا ما به کدهای کتابخونه دسترسی داریم ؟اگر داریم چه جوری می تونیم ببینیمشون؟ برای مثال ببینیم کد sensor.getAcceleration را چه جوری نوشتید؟
    2-در اینجا آردینو به عنوان مستر هست و 6050 به عنوان slave که براشون آدرس تعریف نشده. اما اگر بخواهیم چندتا سنسور رو هم زمان استفاده کنیم و نیاز به آدرس دهی باشه چه جوری باید این کار رو انجام داد؟

    • با سلام خدمت شما.
      سوال 1 : کدهای مربوط به توابع را میتوانید از همان کتابخانه ی MPU6050 و I2Cdev که لینک آن در متن قرار داده شده است و آن را در محل library نرم افزار arduino کپی کرده اید مشاهده کنید و توابع را بررسی کنید.
      سوال 2 : روی MPU6050 یک پایه AD0 وجود دارد که با آن میتوانید آدرس را مشخص کنید. اگر بخواهید فقط دو سنسور به برد وصل کنید میتوانید یک بار این پایه را رها کنید و بار دیگر به VCC وصل کنید و یک آدرس دگیر برای این مازول مشخص کنید. (در جلسه اول MPU6050 در مورد این مازول توضیحات لازم ارایه گردید. )
      در صورتی که بخواهید تعداد بیشتری سنسور هم متصل کنید باید از مازول هایی که پورت I2C را گسترش می دهند استفاده کنید.
      موفق باشید.

  • یعنی تو اون قسمتی که if نوشتم برای تست کانکشن بخش elseif رو اجرا میکنه

  • سلان/من این کد رو نوشتم ولی نمیدونم چرا داده هام صفر میشن

    • با سلام. در اولین مورد لطفا اتصالات خود را چک کنید. آیا از سالم بودن MPU6050 خود اطمینان دارید؟
      سیم های خود را و جای MPU6050 را نیز بر روی برد برد تعویض کنید و ببینید که مشکل حل می شود یا خیر.
      موفق باشید.

دیدگاهتان را بنویسید