ویژگی های ماژول GY-521 (سنسور MPU6050)
ماژول GY-521 در حقیقت بر پایه سنسور MPU6050 که یک ژیروسکوپ و شتاب سنج 3 محوره است، طراحی شده است. پروتکل ارتباطی این ماژول I2C بوده و با استفاده از 2 پایه SCL و SDA می توانید خروجی های MPU6050 را بخوانید.
توجه
سنسور MPU6050 علاوه بر ژیروسکوپ و شتاب سنج ، دارای یک دماسنج دیجیتال هم می باشد.
دیتاشیت سنسور MPU6050 را می توانید از اینجا دانلود کنید.
معرفی پایه ها (Pinout) ماژول GY-521 (سنسور MPU6050)
ماژول GY-521 دارای 8 پایه به شرح زیر است:
- VCC: تغذیه ماژول – 3 تا 5 ولت
- GND: زمین
- SCL: پایه کلاک پروتکل I2C
- SDA: پایه دیتا پروتکل I2C
- XDA: پایه دیتا پروتکل I2C کمکی
- XCL: پایه کلاک پروتکل I2C کمکی
- ADO: تنظیمات آدرس پروتکل I2C
- INT: وقفه
پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی ماژول GY-521 MPU6050 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
گام دوم: نصب کتابخانه
به Library manager رفته و کتابخانه سنسور MPU6050 را نصب کنید.
گام سوم: کد
کد زیر را روی برد آردوینو آپلود کنید. این کد خروجی سنسور ژیروسکوپ و شتاب سنج خوانده شده را در پنجره ی سریال نمایش می دهد. همچنین می توانید از Serial plotter برای رسم نمودار به صورت گرافیکی استفاده کنید.
/*
GY-521 (MPU6050) 3-Axis Accelerometer-Gyroscope Sensor
modified on 28 Sep 2020
by Mohammad Reza Akbari @ Electropeak
Home<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="“Home” — Electropeak" src="https://electropeak.com/learn/embed/#?secret=kfXo4lM0Qc" data-secret="kfXo4lM0Qc" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
Based on Adafruit Example
*/
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;
void setup(void) {
Serial.begin(115200);
while (!Serial) {
delay(10); // will pause Zero, Leonardo, etc until serial console opens
}
// Try to initialize!
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
mpu.setGyroRange(MPU6050_RANGE_250_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
//Serial.println("");
delay(100);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
Serial.print("Temperature:");
Serial.print(temp.temperature);
Serial.print("\tx-acceleration:");
Serial.print(a.acceleration.x);
Serial.print("\ty-acceleration:");
Serial.print(a.acceleration.y);
Serial.print("\tz-acceleration:");
Serial.print(a.acceleration.z);
Serial.print("\tx-gyro:");
Serial.print(g.gyro.x);
Serial.print("\ty-gyro:");
Serial.print(g.gyro.y);
Serial.print("\tz-gyro:");
Serial.println(g.gyro.z);
delay(10);
}
خروجی کد به شکل زیر است.
Comments (37)
سلام یه سوال میشه ۶ تا از این ماژول رو به برد اردوینو وصل کرد و خروجی رو وايرلس بفرسته ؟
سلام،
بله مشکلی نداره و امکان این کار وجود داره.
از اون جایی پروتکل ارتباطی این ماژول i2c هست و آدرس i2c یکسانی هم دارند، شما نمیتونید مستقیما بیش از یک عدد از این ماژول رو به پایههای i2c آردوینو متصل کنید. برای وصل کردن ماژولهایی که آدرس i2c یکسانی دارند به آردوینو میتونید از ماژول توسعه 8 کاناله i2c به اسم tca9548a استفاده کنید:
“https://thecaferobot.com/store/tca9548a-1-to-8-i2c-8-way-multi-channel-expansion-board”
با استفاده از این برد میتونید تا 8 ماژول با آدرس یکسان رو به برد آردوینو متصل کنید.
برای ارسال اطلاعات به صورت وایرسل هم، میتونید این کار رو با انواع ماژولهای بلوتوثی یا ارتباط رادیویی مثل ماژولهای nrf انجام بدید. میتونید برای ارسال اطلاعات به صورت وایرلس، این آموزش رو هم مطالعه کنید:
“https://thecaferobot.com/learn/interfacing-nrf24l01-wireless-2-4-ghz-transceiver-module-with-arduino/”
با سلام
ببخشید من مو به مو تمام کار هایی که گفتید انجام دادم و تمامی اموزش های توی نت رو امتحان کردم اما همش تو سریال مانیتورم یه سری پیام عجیب قریب میاد که اصلا معلوم نیست چی هستند .
تمام پروژه هارو که تست میکنم این جوریه
میشه راهنماییم کنید چون نه سریال مانیتور نه سریال پلاتر چیز درستی نشون نمیدن و فقط یه سری علامت عجیب قریبه
سلام.
چک کنید که baudrate سریال مانیتور رو حتما رو همون مقداری تنظیم کرده باشید که تو کد مورد استفادتون هم نوشته شده. مثلا در کد این آموزش، همونطور که در خط 11 میبینید، baudrate روی 115200 قرار داده شده، در نتیجه وقتی شما هم میخواید چیزی رو توی سریال مانیتور نمایش بدید، باید بعد از باز کردن سریال مانیتور، baudrate اون رو روی 115200 بذارید در غیر این صورت دیتای دریافت شده به صورت بی معنا نمایش داده میشه.
توی این کد تو قسمت Serial.begin(115200); نوشته شده . شما وقتی سریال مانیتور رو باز میکنی باید baund رو روی 115200 بزاری. وگرنه علامتای عجیب غریب میبینی . باید ببینید Serial begin برنامه هات چیه.
نوار پایین توی سریال مانیتور هست .
سلام پورت سریالتو درست انتخاب نکردی .
مثلا 9600 یا 115200 . این مقدار توی setup تعیین میشه تا پیام ها با این بادریت جابجا بشن .
سلام میشه راهنمایی کنید که سریال مانیتور را چطوری میتونم پیدا کنم
سلام
در نرم افزار آردوینوتون، از قسمت Tools -> Serial Monitor میتونید Serial Monitor را باز کنید. از میانبر CTRL+Shift+M هم میتونید Serial Monitor رو پیدا کنید. یک راه دیگه ای هم که هست، یک آیکون شبیه ذرهبین در قسمت بالا راست نرم افزار آردوینو قرار داده شده که با کلیک کردن روی اون هم Serial Monitor باز میشه.
یه سوال
اردوینو من سوخته ؟
کد های قبل رو اجرا می کنه
مو به مو
اما زمانی که خواستم کد شما رو بریزم دیگه فلش نمی کنه
و error
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x1b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x1b
avrdude done. Thank you.
هر کاری شد هم کردم خواستم ایسی رو بر دارم و روی یه برد دیگه امتحان کنم
اما باز هم همین
راستی تو پروژم نوشته بودم که سریال رو بیاره و یه عددی رو نشون بده اما اون هم نمیاد اما برد رو می شناسه
و سریال مانیتور باز می شه
اما چیزی ارسال می کنم LED های RX TX تکون نمی خورن
چه ارسال می کنم
چه در یافت می کنم
انگار LED ها سوخته
اما سالمه امتخان کردم LED ها رو
سلام.
بعد از امتحان کد مربوط به این آموزش این اتفاق افتاد؟ و بعد از این با کدهای دیگه هم همین مشکل وجود داره؟ امکانش هست که بهر دلیلی مثل کم و زیاد شدن ولتاژ یا دلایل دیگه یا آردوینوتون سوخته باشه یا اینکه فریمورش پریده باشه. همچین میتونید این سوالتون رو توی بخش انجمن کافهربات در لینک زیر مطرح کنید تا مشاوره بهتری بگیرید.
https://thecaferobot.com/forum/
سلام . ممنون برای توضیحات خوبتون .
یک سئوالی داشتم .
امکان داره خط 1 و 2 در void loop را توضیح بدید که چه می کنند و چی داره میگه ؟
منظورم دو خط زیر هست :
sensors_event_t a, g, temp
mpu.getEvent(&a, &g, &temp)
ممنون
سلام.
در خط اول a و g و temp به ترتیب به عنوان eventهای شتاب (accelaration)، مقدار میدان مغناطیسی (gyro) و دما (temperature) تعریف شدن و در خط دوم به عنوان ورودی برای تابع سنسور mpu در نظر گرفته شدن. به این ترتیب این تابع این مقادیر رو از سنسور دریافت میکنه.
سلام خسته نباشید چجوری میشه کتابخانه های این ماژول و ماژول های دیگه رو خودمون بنویسیم
سلام.
نوشتن کتابخونه نیاز به تسلط و تجربه کافی در برنامهنویسی به زبان C و ++C و همچنین درک بالا از پروتکلهای ارتباطی در میکروکنترلرها مثل UART، SPI و I2C داره. اگر تسلط کافی به این موارد داشته باشید میتونید با مطالعه دقیق دیتاشیت یک ماژول، کتابخونه اون رو بنویسید.
سلام چگونه میشه کتابخانه هارو توابع شون رو خودم پیدا کنم و استفاده کنم
مثل ماژول DS3231 توابع کتابخانه اش هیجا نبود میشه خودم برم داخل کتابخانه اونجا آیا نوشته؟؟؟
سلام
بله میشه
فقط باید اون فایل h. رو باز کنی و توابعی که توش ذکر شده رو هر کدوم که می خواستی ببینی چی کار می کنه رو توی فایل cpp. سرچ کنی
اکثر کتابخونه ها برا این توابع کامنت گذاشتند یا از اسم متغیر ها میشه فهمید که چی کار می کنن
سلام لطفا همین اموزش رو برای برد esp32 هم بذارین
با سلام
با تشکر از نظر خوبتون.
برای راهاندازی این آموزش در سمت ESP ها نیازی به تغییر کد نمی باشد و فقط کافی است شما سیم کشی های خود را به پایه های I2C میکروکنترلر ESP خود وصل کنید.
با سلام.
نمیدونم چرا وقتی مقادیر رو یکی یکی روی سریال مانیتور نمایش دادم مقادیر y و z رو جابه جا نشون داد نمیدونم مشکل از کجا بوده. یه کمکی میتونید بکنید. ممنون
جناب آقای اکبری
و دیگر دوستان و مشارکت کنندگان
من این ژیروسکوپ را به آردوینو پرو میکرو ( لنوناردو ) بستم. اول مقاومت پول آپ نگذاشتم. بعد مقاومت های پول آپ 5.6 کیلو یکبار و یکبار 2.2 کیلو و یکبار هم 1 کیلو را امتحان کردم. همیشه بعد از حدود یک دقیقه یا سی ثانیه ارسال و دریافت، آردینو هنگ می کند و باید ریست شود. جستجوهای من نشان از این دارد که باس I2C با ولتاژ 5 خوب کار نمی کند و مثلا ولتاژ high برای سیستم 5 ولت لااقل 3.5 ولت است و سیستم 3.3 ولت نمی تواند ان را تامین کند. و کتابخانه wire.h با دیدن کوجکترین خطا هنگ می کند. بنابرین باید برای وقتی که سنسور می خواهیم به میکرو ببندیم و این سنسور از باس i2c استفاده می کند، بهتر است از میکرو هایی استفاده کنیم که خودشان 3.3 ولت هستند.
با سلام
این مورد که از میکرو های 3.3 ولتی استفاده بشود یکی از پیشنهاد های همیشگی بنده می باشد، اما در بعضی از پروژه ها امکان این کار وجود ندارد.
در مورد سطح ولتاژ، تا زمانی که ولتاژ پالس های دیتا بالاتر از 2.5 ولت (نصف 5 ولت) باشد میکروکنترلر آن را به عنوان دیتا HIGH در نظر میگیرد. مگر اینکه دیتا دارای نویز زیادی باشد که باعث بشود ریز پالس های زیر 2.5 ولت بخورد.
برای حل این مشکل استفاده از خازن اضافی در ورودی برق ( روی لاین دیتا نگذارید)
استفاده از میکرو دیگر (گاهی میکرو ها یک مقدار حساسیت بیشتری دارند و درست عمل نمیکنند)
استفاده از Logic Level Converter برای تبدیل سطح ولتاژ 3.3 به 5 و برعکس.
اما به صورت کلی پیشنهاد بنده استفاده از میکرو های 3.3 ولتی می باشد که هم سرعت بالاتری دارند و هم دقت بالاتری برای مثال ESP ها و STM ها گزینه های مناسبی می باشند.
سلام وقتتون بخیر ببخشید من میخوام از این سنسور برای کنترل پایداری ربات(زیر دریایی) استفاده کنم ولی هنوز اول راه هستم میتونید یک نقشه کلی رو برام توضیح بدین که چطور تعادل رباتم رو تنظیم کنم ؟
با سلام
برای این موارد باید یک PID بنویسید، کد های آماده این موارد داخل اینترنت می توانید پیدا کنید و از آنها استفاده کنید.
سلام،من میخوام موشک بسازم که با زاویه ۹۰ درجه رو به بالا حرکت کنه،میتونم از این ژیرسکوپ استفاده کنم؟
با سلام
ماژول ژیرسکوپ به شما اطلاعات شتاب و زاویه را میدهد. پیشنهاد میکنم از سنسور های 9 محوره استفاده کنید که اطلاعات بیشتری به شما بدهند.
فقط این سنسور ها به شما اطلاعات را میدهد و نحوه حرکت و نحوه دستور دادن باله ها برای موضوع را باید کد نویسی ایجاد کنید.
سلام وقت بخیر میتونیم ازین ماژول برای تعیین مقدار جابجایی استفاده کنیم؟از مقدار شتاب ۲بار انتگرال بگیریم که مقدار جابجایی بدست بیاد
اگ میشه لطفا اطلاع بدید
با سلام
از ماژول های ژیروسکوپ برای این موضوع استفاده میشود.
شما میتوانید از دیتا های دریافتی توسط سنسور انتگرال بگیرید
پیشنهاد میکنم نمونه مثال های داخل اینترنت در مورد این موضوع را مطالعه نمایید.
سلام من میخوام یه سیستم تعلیق هوشمند بسازم که به این فکر رسیدم با ژیروسکوپ بسازم اما متاسفانه کسی نتونست منو راهنمایی کنه که این امکان وجود داره یا نه .
از اون طرف هم کار با اردونیو رو بلد نیستم و تازه میخوام شروع کنم
ممنون میشم جواب بدید ?
با سلام
پیشنهاد میکنم این موضوع را داخل انجمن مطرح بکنید. همچنین این سیستم را بر روی چه دستگاهی میخواهید پیاده سازی بکنید؟
سلام من برای موقعیت یا بی استفاده کردم در سرعت پایین دقیق .مثلا اگر داخل کوچه بچرخی وبعد به موقعیت اول برگردی درسته اما اگر سرعت بیشتری داشته باشی (مثلا با ماشین تو دو تا خیابون بگردی وبه جای اول برگردی جای اول را با خطا میبینی .که احتمالا باتوجه سرعت کم نمونه گیری سنسور و انتگرال گیری این خطا پیش آمده است. کسی تجربه ای در این مورد دارد.
سلام برنامه ی من داره کار میکنه ولی شتاب z را در حالت بدون حرکت عدد 11.4 نشون میده. درسته یا؟؟؟؟
باسلام
ماژول دیگری هم تست کرده اید و همین مقدار را به شما برمیگرداند؟؟
با کد داخل آموزش نیز همین عدد را دریافت کرده اید؟؟
در همین آموزش شما هم ظاهرا همین طور هست. خط نارنجی رنگ را ببینید.
من با سه ماژول تست کردم و هر سه موقعی که بی حرکت هستند خروجی شان تقییر میکند.
یک لینک هم هست که همین مشکل را بیان کرده :https://www.youtube.com/watch?v=3-IBOJ5FQvI&list=PLnq7JUnBumAx–5D-zOeUzBDUzy10e3_-
نظر شما چیست؟
سلام وقت بخیر
ایا با این ماژول میشه شتاب فشار دست هنگام cpr رو اندازه گرفت و روی مانیتور نشان داد؟
با سلام
این ماژول برای اندازه گیری شتاب خرکتی می باشد. این سنسور ، اندازه گیر فشار را ندارد، و سنسور های شبیه این ماژول که قابلیت اندازه گیری فشار را دارند فقط امکان اندازه گیری فشار از سطح دریا (فشار جو) را دارند.
شما به سنسور فشار که در بخش لرزش، نیرو، خمش وجود دارد باید مراجعه بفرمایید.