آموزش راه اندازی MPU6050 با آردوینو – بخش دوم
مقدمه
در این جلسه قصد داریم نحوه راه اندازی MPU6050 را با یکدیگر مرور کنیم. پیشنهاد میکنم برای فهم بهتر این مطلب ، ابتدا جلسه قبل را که در آن به معرفی MPU6050 پرداختیم ، مطالعه بفرمایید:
کد راه اندازی ماژول
کد راه اندازی سنسور:
[post_shop]
کد راه اندازی ماژول به شکل زیر می باشد. ابتدا به صورت کلی به کد نگاهی بیندازید تا در ادامه خطوط کد را کاملا دقیق توضیح دهیم:
// I2C Libraries to control mpu6050 // library MPU6050.h needs I2Cdev.h, I2Cdev.h needs Wire.h #include "I2Cdev.h" #include "MPU6050.h" #include "Wire.h" // The address of the MPU6050 can be 0x68 or 0x69, depending // on the state of AD0. If not specified, 0x68 will be implicit MPU6050 sensor; // RAW values (unprocessed) of the accelerometer and gyroscope on the axes x, y, z int ax, ay, az; int gx, gy, gz; void setup () { Serial.begin (57600); // Starting serial port Wire.begin (); // Starting I2C sensor.initialize (); // Starting the sensor if (sensor.testConnection ()) Serial . println ( "Sensor started correctly" ); else Serial.println( "Failed to start sensor"); } void loop () { // Read the accelerations and angular velocities sensor.getAcceleration (& ax, & ay, & az); sensor.getRotation (& gx, & gy, & gz); // Display the readings separated by a [tab] Serial.print("a [xyz] g [xyz]: \t"); Serial.print(ax); Serial . print ("\t"); Serial.print(ay); Serial . print ("\t"); Serial.print(az); Serial . print ("\t"); Serial.print(gx); Serial . print ("\t"); Serial.print(gy); Serial . print ("\t"); Serial.println(gz); delay (100); }
حال بیایید کد را کمی دقیق تر بررسی کنیم.
#include "I2Cdev.h" #include "MPU6050.h" #include "Wire.h"
در این سه خط کتابخانه های لازم برای اجرای این برنامه آورده شده اند. در اینجا ما به سه کتابخانه Wire.h و MPU6050.h و I2Cdev.h نیاز داریم. کتابخانه Wire.h که جزو کتابخانه های داخلی آردوینو هست و نیاز به نصب ندارد ولی بقیه کتابخانه ها نیاز به نصب دارند. لینک دانلود دو کتابخانه دیگر در زیر آورده شده است:
ما قبلا در یک جلسه به صورت کامل در مورد نصب کتابخانه ها در آردوینو صحبت کرده بودیم. اگر با نحوه نصب کتابخانه آشنا نیستید ، پیشنهاد میکنم حتما جلسه مربوطه رو از لینک زیر مطالعه بفرمایید:
MPU6050 sensor;
در این خط یک متغیر ( به زبان دقیق تر یک Object ) از کلاس MPU6050 با نام sensor تعریف می شود.
int ax, ay, az; int gx, gy, gz;
در این دو خط نیز ، 6 متغیر تعریف می شود. سه متغیر برای داده های ژیروسکوپ ( هر متغیر برای یک محور) و سه متغیر دیگر برای داده های شتاب سنج ( هر متغیر برای یک محور ) .
Serial . begin (57600); // Starting serial port Wire . begin (); // Starting I2C sensor.initialize (); // Starting the sensor
با استفاده از خط Serial.begin نرخ ارتباط سریال مشخص می شود. همچنین با استفاده از خط Wire.begin ، مشخص اعلام حضور خود را در باس I2C مشخص میکنیم. اگر در این تابع یک پارامتر وارد کنیم ، به عنوان یک Slave وارد باس I2C شده ایم و آن پارامتر ، آدرس ما می باشد. اما اگر آدرسی وارد نکنیم ( مثل همین خط ) نشان می دهد که به عنوان یک Master وارد باس شده ایم.
خط مربوط به MPU.initialize نیز تنظیمات اولیه مربوط به سنسور MPU6050 را انجام می دهد. این تنظیمات شامل رنج اندازه گیری شتاب سنج و ژیروسکوپ و همچنین خارج کردن ماژول از مد Sleep و … می باشد.( رنج اندازه گیری ژیروسکوپ 250dps± و رنج اندازه گیری شتاب 2g± قرار داده شده اند. )
if (sensor.testConnection ()) Serial . println ( "Sensor started correctly" ); else Serial . println ( "Failed to start sensor" ); }
این دستورات نیز ارتباط بین آردوینو و MPU6050 را بررسی می کنند. در صورت برقراری ارتباط عبارت sensor started correctly روی پنجره سریال نمایش داده می شود. همچنین در صورت عدم برقراری ارتباط ، عبارت Failed to start sensor روی پنجره سریال نمایش داده می شود. اگر این عبارت را بر صفحه نمایش دیدید، یک بار دیگر اتصالات بین آردوینو و ماژول را چک کنید.
sensor.getAcceleration (& ax, & ay, & az); sensor.getRotation (& gx, & gy, & gz);
این دو خط نیز بسیار واضح می باشند. در این دو خط ما داده های مربوط به شتابسنج و ژیروسکوپ را میخوانیم و در آدرسی که متغیرهای ax ay az و gx gy gz به آن اشاره می کنند، ذخیره می کنیم. اگر با مفهوم اشاره گرها آشنا نیستید ، پیشنهاد میکنم حتما جلسه مربوط به اشاره گرها را از لینک زیر بخوانید:
Serial . print ( "a [xyz] g [xyz]: \ t" ); Serial . print (ax); Serial . print ( "\ t" ); Serial . print (ay); Serial . print ( "\ t" ); Serial . print (az); Serial . print ( "\ t" ); Serial . print (gx); Serial . print ( "\ t" ); Serial . print (gy); Serial . print ( "\ t" ); Serial . println (gz); delay (100);
این خطوط هم که مقادیر مربوط به داده ها را در پنجره سریال نمایش می دهند. این خطوط واضح می باشند و نیاز به توضیحی بیشتر ندارند.
در نهایت ، در صورتی که همه موارد بالا به درستی انجام شده باشد، پس از آپلود کد بر روی برد آردوینو و باز کردن پنجره سریال ، باید داده ها را به شکل زیر ببینید:
تبدیل داده های خام به شتاب و سرعت زاویه ای
نکته ای که در مورد این داده ها وجود دارد این است که این داده ها صرفا یک سری اعداد دیجیتال هستند و سرعت زاویه ای و شتابی که ما انتظار داشتیم نیستند. به همین علت باید یک سری محاسبات ریاضی بر روی آنها انجام شود تا داده های نهایی برای ما بدست آید. اینجاست که از پارامتر حساسیت (Sensitivity) باید استفاده کنیم. ما این پارامتر را در جلسه مربوط به ژیروسکوپ توضیح داده بودیم. پس حتما آن جلسه را مطالعه کنید.
ابتدا داده های مربوط به ژیروسکوپ را محاسبه میکنیم:
برای این کار ابتدا به جدول زیر که از دیتاشیت MPU6050 گرفته شده است ، نگاه کنید:
در جدول بالا، متناسب با هر رنج ، یک حساسیت وجود دارد. در این جا ما از رنج 250dps± استفاده کرده ایم. پس باید از حساسیت مربوط به همین رنج نیز استفاده کنیم. این حساسیت مطابق شکل برابر با 131 LSB بر درجه بر ثانیه است. شاید در نگاه اول کمی این واحد عجیب و غریب به نظر برسد. معنای این واحد هم به این صورت است که به ازای هر یک درجه بر ثانیه تغییر سرعت زاویه ای ، مقدار خروجی ، خروجی دیجیتال ژیروسکوپ ، 131 واحد تغییر می کند. حال به عنوان مثال ، اگر خروجی ژیروسکوپ برابر 765 بود ، سرعت زاویه ای برابر با 765/131 یعنی حدود 6 درجه بر ثانیه است. ( و این یعنی ژیروسکوپ هر ثانیه 6 درجه می چرخد. )
بنابراین اگر خروجی های دیجیتال مربوط به ژیروسکوپ ، در هر سه محور را بر عدد 131 تقسیم کنیم ، مقدار واقعی سرعت زاویه ای بدست می آید. بنابراین سه خط کد زیر را نیز باید به کد خود اضافه کنیم:
gx /= 131; gy /= 131; gz /= 131;
حال همین محاسبات را برای شتاب سنج نیز باید انجام دهیم. ابتدا جدول مربوط به محدوده اندازه گیری و حساسیت را در نظر بگیرید:
مطابق جدول بالا ، چون ما از رنج 2g± استفاده کرده ایم ، پس باید حساسیت مربوط به آن یعنی 16384 LSB بر g را استفاده کنیم. معنای این واحد هم به این صورت است که به ازای هر g ، مقدار خروجی دیجیتال شتاب سنج 16384 واحد تغییر میکند. البته توجه داشته باشید که یک g شتاب زیادی است. مقدار این شتاب برابر با 9.81 متر بر مجذور ثانیه. بنابراین با تقسیم مقدار خروجی شتاب سنج بر 16384 میتوانیم شتاب را بر حسب g بدست آوریم. البته شاید ملموس تر آن باشد که شتاب را بر حسب متر بر مجذور ثانیه بدست آوریم. بنابراین اگر کل عبارت را بر g تقسیم کنیم ، آنگاه شتاب را بر حسب متر بر مجذور ثانیه بدست می آید. به زبان ساده تر داریم :
[/post_shop]
بنابراین کدهای زیر را باید به مجموعه کدهای بالا اضافه کنیم تا داده های شتاب سنج نیز بر حسب متر بر مجذور ثانیه بدست می آید.
ax = (ax * 9.81 / 16384); ay = (ay * 9.81 / 16384); az = (az * 9.81 / 16384);
حال اگر بار دیگر نتایج را نشان دهیم ، در این صورت خواهیم داشت :
همانطور که مشاهده می کنید ، وقتی سنسور را در به موازات سطح زمین قرار می دهیم ، در جهت z مقدار تقریبی 9.9 متر بر مجذور ثانیه را به ما نشان می دهد. این شتاب همان شتاب جاذبه زمین است. چون در این حالت محور z سنسور در راستای شتاب جاذبه می باشد.
توجه کنید که اگر سنسور را 90 درجه بچرخانیم و محورهای x و y آن را در جهت شتاب جاذبه قرار دهیم ، در این صورت شتاب های مربوط به x و y مقدار تقریبی 9.9 متر بر مجذور ثانیه را به خود خواهند گرفت. (این موضوع را خودتان تست کنید.)
به پایان این جلسه رسیدیم. مثل همیشه میتوانید برای اطلاع از مطالب جدید و دیگر مطالبی که در سایت منتشر نمی شوند ، ما را در تلگرام و یا اینستاگرام دنبال کنید:
12 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
با سلام
ممنون از مطالب مفیدتون
ایا میشه با ارتباط سریال چند تا از همین سنسور ها رو استفاده کرد
با سلام و احترام.
بله – این سنسور از پروتکل های I2C و SPI پشتیبانی می کند. این سنسور به صورت پیش فرض دو آدرس برای I2C پشتیبانی می کند. علاوه بر این موضوع میتوانید از SPI نیز استفاده کنید. در صورتی که قصد دارید تعداد زیادی سنسور متصل کنید ، میتوانید از I2C Multiplexer ها استفاده کنید.
موفق باشید.
با عرض سلام و خدا قوت
واقعا خسته نباشید آموزش بسیار مفهوم و کاملی بود
از کجا میشه اطلاعات بیشتری درمورد کتابخونه MPU6050 بدست آورد اینکه چه متد هایه دیگه ایی داره و ….
با سلام و احترام.
بهترین منبع برای MPU6050 دیتاشیت مربوط به این قطعه است. فقط توجه فرمایید که آخرین نسخه دیتاشیت را دانلود کنید.
موفق باشید.