ماژول ژایرو MPU6050 یکی از محبوبترینها در بین نمونه های موجود برای اندازهگیری مقادیر x,y,z است. در کل ایده اینکه این مقادیر را بدست آورده و در ادامه یک وسیله را با آن کنترل کنیم همواره جذاب بوده! در این آموزش قصد داریم با استفاده از این مقادیر یعنی x و y اقدام به کنترل سروو موتور کنیم. با استفاده از سناریو های مختلف، که میتوانید با فراگیری این آموزش پروژه های جذابی را توسعه دهید. در ادامه آموزش کنترل سرو با ماژول MPU6050 با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
ماژول MPU6050
حالا زمان این رسیده با سخت افزار اصلی این آموزش، یعنی MPU6050 بیشتر آشنا بشیم. Mpu6050 دارای یک شتاب سنج سه محوره و یک ژیروسکوپ سه محوره MEMS میباشد. دقت ماژول مبدل آنالوگ به دیجیتال ۱۲ بیت بوده و میتواند مقادیر X ، Y ، Z را در یک زمان اندازه گیری کند. بافر این ماژول از نوع FIFO با ظرفیت ۱۰۲۴ بایت میباشد. این ماژول به عنوان Slave به آردوینو توسط پایههای SCL و SDA متصل میشود. با استفاده از پردازشگر دیجیتال، ۴ خروجی برای دستیابی به دقت قابل توجه، در حرکتهای کند و سریع در سنسور فراهم کرده است. با این روش کاربر میتواند بازه اندازه گیری را متناسب با شتاب یا سرعت تغییر دهد. به همین منظور در قسمت ژیروسکوپ سنسور چهار بازه ۲۵۰±، ۵۰۰±، ۱۰۰۰± و ۲۰۰۰± درجه بر ثانیه و در قسمت شتاب سنج سنسور چهار بازه ۲g، ±۴g، ±۸g، ±۱۶g± برای کاربر قابل انتخاب خواهد بود. توجه داشته باشید که ولتاژ کاری این ماژول ۳ الی ۵ ولت میباشد.
سروو موتور Servo Motor
سروو موتور نوعی موتور است که می تواند با دقت زیادی بچرخد. به طور معمول این نوع موتور از یک مدار کنترل تشکیل شده است که بازخوردی را در مورد موقعیت فعلی شافت موتور ارائه می دهد، این بازخورد به موتورهای سروو اجازه می دهد تا با دقت زیادی بچرخند. انواع سرو موتورها بر اساس کاربرد آنها در انواع مختلف طبقه بندی می شوند ، مانند سروو موتور AC و موتور سروو DC.
برد آردوینو Arduino
مجموعه بردهای آردوینو از جمله بردهای توسعه پرطرفدار بین مهندسین امبدد هستند که در مدلهای مختلفی از جمله Micro , proMini , Nano , Uno و همچنین Mega قابل تهیه هستند. هسته مرکزی این بردهای محبوب از سری AtMega328 میباشد. آردوینو پلتفرم سخت افزاری و نرم افزاری متن باز است. همان طور که پیش از این اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تکبردی متنباز است که قسمت سختافزار آردوینو را تشکیل میدهد. علاوه بر این، پلتفرم آردوینو یک نرمافزار آردوینو IDE که به منظور برنامهنویسی برای بردهای آردوینو طراحی شدهاست و یک بوت لودر نرمافزاری که بر روی میکروکنترلر بارگذاری میشود را در بر میگیرد.
موج مربعی یا PWM
موج مربعی یا pwm یا Pulse Width Modulation به معنی مدولاسیون پهنای پالس، روشی برای تنظیم توان الکتریکی، با تغییردادن زمان قطع و وصل شدن منبع در هر سیکل است. در واقع pwm یک سیگنال مربعی میباشد که در یک زمان می تواند ۱ یعنی ۵لت و یا ۰ که یعنی ۰ولت باشد که در این بین ما با تغییر Duty Cycle به نتیجه دلخواه که در نور led، حرکت در سروو و موارد دیگر می شویم. برای مثال اگر Duty Cycle یک موج PWM برابر با ۸۰% باشد یعنی در هر سیکل ۸۰% ولتاژ برابر ۵ولت و ۲۰% ولتاژ برابر۰ است.در شکل زیر PWM نشان داده شده است.
توضیح تکمیلی
در پروژه کنترل سرو با ماژول MPU6050 ابتدا مقادیر x و y را توسط ماژول MPU6050 بدست می آوریم. سپس این مقادیر به زوایای مختلفی از سروو اختصاص خواهیم داد. بطوری که با تغییر این مقادیر در محدوده ای خاص زاویه سروو تغییر خواهد کرد، البته این پروژه را با چند سناریوی مختلف تست خواهیم کرد، برای مثال زمانی که تغییر در محور x ها داشته باشیم یک سروو و زمانی که محور y تغییر داشته باشد دومین سروو تغییراتی را داشته باشد.
وسایل مورد نیاز
راهاندازی با یک سروو موتور
در این مرحله تنها با استفاده از یک سروو پروژه را راهاندازی می کنیم، به این شکل که با تغییر مقادیر x شاهد تغییر زاویه سروو در جهت های ساعتگرد و پادساعتگرد خواهیم بود. اتصالات را مطابق جدول و شماتیک زیر برقرار کنید.
در این مرحله نوبت به کد های این بخش از پروژه می رسد که بخش هایی از آن را ابتدا بررسی خواهیم کرد، ابتدا کتابخانه های مورد نیاز، برای راهاندازی ماژول های استفاده شده در این آموزش را فراخوانی خواهیم کرد.
#include <Wire.h> #include <MPU6050.h> #include <Servo.h>
در این قسمت یک آبجکت با استفاده از کتابخانه servo.h تعریف می کنیم که نمایان گر سروو استفاده شده است، همچنین اسمی برای آن نیز مشخص می کنیم که من از اسم خود سروو استفاده کردم.
Servo sg90;
در ادامه پین های مربوط را مشخص می کنیم با تعریف دو متغیر
int servo_pin = 2; int servo_pin1 = 3;
پس مشخص شدن تنظیمات سروو موتور نوبت به تعریف مقادیر ماژول MPU6050 است.
MPU6050 sensor ; int16_t ax, ay, az ; int16_t gx, gy, gz ;
در این خط از کد مقادیر ژایرو و accelerometer را از سنسور دریافت و ذخیره خواهیم کرد.
sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);
در این بخش مقادیر سنسور و سروو موتور را معادل سازی می کنیم تا نسبت به تغییرات یکدیگر واکنش نشان دهند.
ax = map (ax, -17000, 17000, 0, 180) ;
و در نهایت با این خط کد فرمان اجرا خواهیم داد.
sg90.write (ax);
کد کامل این بخش از پروژه کنترل سرو با ماژول MPU6050
#include <Wire.h> #include <MPU6050.h> #include <Servo.h> Servo sg90; int servo_pin = 2; MPU6050 sensor ; int16_t ax, ay, az ; int16_t gx, gy, gz ; void setup ( ) { sg90.attach ( servo_pin ); Wire.begin ( ); Serial.begin (9600); Serial.println ( "Initializing the sensor" ); sensor.initialize ( ); Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); delay (1000); Serial.println ( "Taking Values from the sensor" ); delay (1000); } void loop ( ) { sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz); ax = map (ax, -17000, 17000, 0, 180) ; Serial.println (ax); sg90.write (ax); delay (200); }
راهاندازی با دو عدد سروو موتور
در این بخش از پروژه کنترل سرو با ماژول MPU6050 با استفاده از دو عدد سروو اقدام به راهاندازی این پروژه خواهیم کرد، در واقع این بخش به این شکل است که با تغییر مقادیر y یک سروو و با تغییر مقادیر x دومین سروو شروع به حرکت خواهد کرد. اتصالات را مطابق جدول و شماتیک زیر برقرار کنید.
کد های این بخش پروژه کنترل سرو با ماژول MPU6050 تفاوت چندانی با کد قبلی ندارد تنها یک سروو چدید تعریف کردیم و همچنین مقادیر y را به سروو جدید نسب دادیم. کد کامل این بخش را می توانید در کادر زیر مشاهده کنید.
#include <Wire.h> #include <MPU6050.h> #include <Servo.h> Servo sg90; Servo sg90two; int servo_pin = 2; int servo_pin1 = 3; MPU6050 sensor ; int16_t ax, ay, az ; int16_t gx, gy, gz ; void setup ( ) { sg90.attach ( servo_pin ); sg90two.attach ( servo_pin1 ); Wire.begin ( ); Serial.begin (9600); Serial.println ( "Initializing the sensor" ); sensor.initialize ( ); Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); delay (1000); Serial.println ( "Taking Values from the sensor" ); delay (1000); } void loop ( ) { sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz); ax = map (ax, -17000, 17000, 0, 180) ; ay = map (ay, -17000, 17000, 0, 180) ; Serial.println (ax); sg90.write (ax); sg90two.write (ay); delay (200); }
جمع بندی
در آموزش کنترل سرو با ماژول MPU6050 با استفاده از سروو موتور SG90 و همچنین ماژول MPU6050 توانستیم مقادیر x, y را نسبت به زوایای سروو map کنیم، در این پروژه از برد آردوینو نانو استفاده شد که با اسفاده از همین کد و اتصالات می توانید از برد آردوبنو UNO نیز استفاده کنید و براحتی پروژه را راهاندازی کنید.
- تنظیمات منوی tools در نرم افزار آردوینو نیز مانند تصویر زیر است.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
درود استاد.. من میخوام از دو سروو موتور MG945 استفاده کنم… از همین کد میتونم استفاده کنم یا نمیشه؟! ممنون میشم راهنمایی کنید
سلام، ممنونم. خیر مشکلی پیش نمیاد فقط جریان بیشتری مصرف میشه.
سلام،ببخشید میشه راهنمایی کنید چطور میتونم این مجموعه رو به یک هواپیمای مدل اضافه کنم..میخوام بدونم چطور میشه سروو هارو هم با رادیو کنترل،حرکت داد،و هم با ماژول ژیروسکوپ.ینی زمانی ک نیاز نیست هواپیما مسیرش یا ارتفاعش عوض بشه،با ژیروسکوپ کنترل بشه،و زمانی ک میخای هواپیما روبلند کنی یا بچرخونی همونسروو هارو با رادیو کنترل ،کنترل کنی،،
طریقه اتصال سیمهاشو میخام بدونم،و اینکه برنامه نویسیش هم عوض میشه یا نه،،ممنون
با سلام
این مورد توسط بنده تست نشده است، از دیگر کاربرانی که در این زمینه تجربه ای دارند، تقاضا میکنم در بحث شرکت کنند.