در این سری از آموزش های آردوینو به نحوه کارکرد سنسور MPU6050، طریقه اتصال آن به برد آردوینو و خواندن مقادیر شتاب و سرعت زاویه ای توسط سریال مانیتور نرم افزار آردوینو پرداخته ایم.
ماژول شتاب سنج و ژیروسکوپ MPU6050
قبل از شرروع پروژه باید یک سری اطلاعات پایه درباره سنسور MPU6050 را بررسی و شرح دهیم تا با دید کاملتری از نحوه عملکرد این سنسور پیش برویم. MPU6050 زیرمجموعه ای از سنسور IMU می باشد که دارای یک شتاب سنج و ژیروسکوپ و یک تراشه است.
این سنسور وسیله ای برای اندازه گیری شتاب و سرعت زاویه ای در سه محور X Y Z است. سنسورهای IMU در ربات های تعادل، کنترل پروازها، تلفن های همراه، تبلت ها، فضاپیماها و هواپیماهای بدون سرنشین و …. مورد استفاده قرار می گیرند. دو نوع معمول این سنسور ADXL335 و MPU6050 که دارای شتاب سنج سه محوره هستند، در بازار موجودیت دارند.
ویژگی های ماژول MPU6050
ماژول MPU6050 یک دستگاه اندازه گیری و ردیابی 6 محوره ساخته شرکت InvenSense است. ویژگی های اصلی ماژول MPU6050 در زیر آمده است.
1. دارای سه محور شتاب سنج
2. دارای سه محور ژیروسکوپ
3. سنسور دما خروجی دیجیتال
4. دارای 6 عدد مبدل آنالوگ به دیجیتال 16 بیتی (که سه عدد مبدل مربوط به شتاب سنج و سه عدد دیگر آن مربوط به ژیروسکوپ است)
5. پردازنده مجتمع دیجیتال
6. بافر 1024 بیتی
این ماژول دارای پروتکل ارتباطی I2C است، که به راحتی به برد آردوینو اتصال می یابد.
لیست قطعات مورد نیاز
برد آردوینو Arduino UNO R3 مدل DIP | 1 عدد |
ماژول سه محوره شتاب سنج و ژیروسکوپ MPU6050 مدل GY-521 | 1 عدد |
برد بورد (پروجکت برد) مدل GL | 1 عدد |
سیم جامپر برد بوردی مدل دو سر نری (سری 40تایی) | 1 عدد |
اتصال ماژول MPU6050 به برد آردوینو
همانطور که گفته شد ماژول MPU6050 برای ارتباط از پروتوکل ارتباطی I2C استفاده می کند بنابراین برای اتصال به برد آردوینو باید به پایه های A4 و A5 که به پایه های SDA و SCL نامیده می شوند، اتصال داده شود.
در این پروژه ما از پایه های SDA، SCL، INT، VCC و GND ماژول MPU6050 برای اتصال به برد آردوینو استفاده می کنیم. نحوه اتصال ماژول به برد آردوینو بسیار راحت است و با توجه به شماتیک شکل زیر به راحتی می توانید ماژول MPU6050 را به برد آردوینو اتصال دهید.
برنامه نویسی
قبل از برنامه نویسی کامل پروژه ابتدا یک برنامه ساده نوشتیم و می توانید آن را برای تست به برد آردوینو آپلود کنید. برای این کار کافیست ابتدا اتصالات فوق را انجام دهید و با باز کردن سریال نرم افزار آردوینو، مقادیر خام شتاب سنج و ژیرسکوپ را ببینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include<Wire.h> const int MPU6050_addr=0x68; int16_t AccX,AccY,AccZ,Temp,GyroX,GyroY,GyroZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU6050_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU6050_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU6050_addr,14,true); AccX=Wire.read()<<8|Wire.read(); AccY=Wire.read()<<8|Wire.read(); AccZ=Wire.read()<<8|Wire.read(); Temp=Wire.read()<<8|Wire.read(); GyroX=Wire.read()<<8|Wire.read(); GyroY=Wire.read()<<8|Wire.read(); GyroZ=Wire.read()<<8|Wire.read(); Serial.print("AccX = "); Serial.print(AccX); Serial.print(" || AccY = "); Serial.print(AccY); Serial.print(" || AccZ = "); Serial.print(AccZ); Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53); Serial.print(" || GyroX = "); Serial.print(GyroX); Serial.print(" || GyroY = "); Serial.print(GyroY); Serial.print(" || GyroZ = "); Serial.println(GyroZ); delay(100); } |
اما برای اندازه گیری دقیق تر و بهتر باید محاسبات بیشتری را در نظر بگیریم. برای انجام این مهم ابتدا کتابخانه را از لینک زیر دانلود کرده و نصب کنید . بعد از نصب اقدام به فراخوانی کتابخانه MPU6050 کنید و یا برنامه کامل پروژه را از زیر به نرم افزار آردوینو کپی کرده و به برد آردوینو آپلود کنید. لازم به ذکر است که بادریت برنامه را بر روی 115200 قرار دهید.
نصب کتابخانه
لازم به ذکر است که نرم افزار برنامه نویسی آردوینو به صورت پیش فرض توانایی پشتیبانی از MPU6050 را ندارد بنابراین ما باید library (کتابخانه یا برنامه) مورد نیاز را بر روی آن نصب کنیم. این فرآیند بسیار ساده و راحت است که در زیر نحوه استفاده از آن را توضیح داده ایم.
1. در مرحله اول ابتدا آخرین (جدیدترین) نسخه کتابخانه (MPU6050 ) را از لینک فوق دانلود کنید.
2. پس از دانلود فایل، نرم افزار آردوینو را باز کنید.
3. مسیر زیر را دنبال کنید و در پنجره باز شده فایل کتابخانه MPU6050 را که قبلا دانلود کرده اید را انتخاب نمائید: …
Sketch > Include Library > Add .ZIP Library
برنامه کامل پروژه در محیط نرم افزار آردوینو
بعد از اتصال قطعات به یکدیگر و نصب کتابخانه، کدهای زیر را در نرم افزار آردوینو کپی نموده سپس به برد آردوینو آپلود کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include "I2Cdev.h" #include "MPU6050.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif MPU6050 accelgyro; int16_t ax, ay, az; int16_t gx, gy, gz; #define OUTPUT_READABLE_ACCELGYRO #define LED_PIN 13 bool blinkState = false; void setup() { #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif Serial.begin(115200); Serial.println("Initializing I2C devices..."); accelgyro.initialize(); Serial.println("Testing device connections..."); Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); pinMode(LED_PIN, OUTPUT); } void loop() accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); #ifdef OUTPUT_READABLE_ACCELGYRO Serial.print("a/g:\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); #endif #ifdef OUTPUT_BINARY_ACCELGYRO Serial.write((uint8_t)(ax >> 8)); Serial.write((uint8_t)(ax & 0xFF)); Serial.write((uint8_t)(ay >> 8)); Serial.write((uint8_t)(ay & 0xFF)); Serial.write((uint8_t)(az >> 8)); Serial.write((uint8_t)(az & 0xFF)); Serial.write((uint8_t)(gx >> 8)); Serial.write((uint8_t)(gx & 0xFF)); Serial.write((uint8_t)(gy >> 8)); Serial.write((uint8_t)(gy & 0xFF)); Serial.write((uint8_t)(gz >> 8)); Serial.write((uint8_t)(gz & 0xFF)); #endif blinkState = !blinkState; digitalWrite(LED_PIN, blinkState); } |
سلام. خروجی کد دوم با تصویری که گذاشته شده فرق داره. الآن کدی که بتونیم با اون yaw, pitch, roll رو با استفاده از dmp بدست بیاریم چیه؟
یک سوال دیگه. من وقتی کد موجود توی لینک زیر بررسی میکنم خییییلی نویز داره. ولی کد دوم شما اینطوری نبود. کار خاصی روی کد دوم انجام شده؟ ممنون.