آموزش راه اندازی 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 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام خسته نباشید ممنون از مطلبی که گذاشتید
من دوتا سوال داشتم:
1-آیا ما به کدهای کتابخونه دسترسی داریم ؟اگر داریم چه جوری می تونیم ببینیمشون؟ برای مثال ببینیم کد sensor.getAcceleration را چه جوری نوشتید؟
2-در اینجا آردینو به عنوان مستر هست و 6050 به عنوان slave که براشون آدرس تعریف نشده. اما اگر بخواهیم چندتا سنسور رو هم زمان استفاده کنیم و نیاز به آدرس دهی باشه چه جوری باید این کار رو انجام داد؟
با سلام خدمت شما.
سوال 1 : کدهای مربوط به توابع را میتوانید از همان کتابخانه ی MPU6050 و I2Cdev که لینک آن در متن قرار داده شده است و آن را در محل library نرم افزار arduino کپی کرده اید مشاهده کنید و توابع را بررسی کنید.
سوال 2 : روی MPU6050 یک پایه AD0 وجود دارد که با آن میتوانید آدرس را مشخص کنید. اگر بخواهید فقط دو سنسور به برد وصل کنید میتوانید یک بار این پایه را رها کنید و بار دیگر به VCC وصل کنید و یک آدرس دگیر برای این مازول مشخص کنید. (در جلسه اول MPU6050 در مورد این مازول توضیحات لازم ارایه گردید. )
در صورتی که بخواهید تعداد بیشتری سنسور هم متصل کنید باید از مازول هایی که پورت I2C را گسترش می دهند استفاده کنید.
موفق باشید.
سلام
آیا این کد برای MPU 92-65 هم جواب میده؟
با سلام. آیا منظور شما MPU9250 می باشد?
در این صورت بهتر است ابتدا جلسه مربوط به راه اندازی MPU9150 را از لینک های زیر بخوانید:
آموزش راه اندازی MPU9150 با آردوینو – بخش اول
آموزش راه اندازی MPU9150 با آردوینو – بخش دوم
از آنجا که به لحاظ ساختاری MPU9150 با MPU9250 شباهت بسیار زیادی دارد ، احتمالا کدهای مربوط به یکی از آنها ، دیگری را نیز راه اندازی کند. اما این موضوع در عمل تست نشده است و ممکن است با مشکلاتی همراه باشد.
موفق باشید.
یعنی تو اون قسمتی که if نوشتم برای تست کانکشن بخش elseif رو اجرا میکنه
با سلام.
در کامنت قبل پاسخ داده شد.
موفق باشید.
سلان/من این کد رو نوشتم ولی نمیدونم چرا داده هام صفر میشن
با سلام. در اولین مورد لطفا اتصالات خود را چک کنید. آیا از سالم بودن MPU6050 خود اطمینان دارید؟
سیم های خود را و جای MPU6050 را نیز بر روی برد برد تعویض کنید و ببینید که مشکل حل می شود یا خیر.
موفق باشید.