کنترل سروو موتور با آردوینو و ماژول MPU6050

الکترونیک و رباتیک -> ماژول ها و سنسور ها 2401 2 کاربر آکادمی پارتینه

مروری بر مشخصات ماژول MPU6050
ماژول MPU6050 یک IMU شش محوره (Inertial Measurement Unit) است که تلفیقی از ژیروسکوپ و شتاب‌سنج می‌باشد. سه محور اختصاص به شتاب‌زاویه‌ای و سه محور دیگر برای سنجش سرعت‌زاویه‌ای به کار گرفته می‌شود. این ماژول دارای شش عدد مبدل آنالوگ به دیجیتال (ADC) داخلی با دقت 16 بیتی است. سه عدد از این مبدل‌های ADC برای سه خروجی ژیروسکوپ و سه عدد دیگر هم برای سه خروجی شتاب‌سنج استفاده می‌شوند. بنابراین هر شش خروجی سنسور در یک زمان محاسبه می‌شوند. وجود پردازشگر حرکتی دیجیتال (DMP) در این ماژول به دلیل جمع‌آوری و پردازش داده‌ها از شتاب‌سنج و ژیروسکوپ باعث می‌شود تا بار محاسباتی از پردازشگر میزبان، مانند آردوینو و ... کم شود. پروتکل ارتباطی این ماژول از نوع I2C بوده و دارای سنسور دمای دیجیتال نیز می‌باشد. در این پروژه هدف کنترل یک سروو موتور توسط ماژول MPU6050(شتاب‌سنج و ژیروسکوپ) است به گونه‌ای که مطابق با حرکت ماژول ، سروو موتور نیز حرکت کند. 

مواد اولیه :
# عنوان تعداد لینک
0 برد آردوینو 1 لینک خرید
1 سروو موتور 1 لینک خرید
2 برد بورد 1 لینک خرید
3 سیم برد بوردی 1 لینک خرید
4 ماژول MPU6050 1 لینک خرید

مرحله 1 : اتصالات و دیاگرام مداری

در گام اول باید ماژول MPU6050  به آردوینو متصل شود. نحوه‌ی اتصالات این ماژول به صورت زیر است:

- VCC ماژول را به پین 5 ولت آردوینو وصل کنید.

 - GND ماژول را به GND آردوینو وصل کنید.

 - ماژول MPU6050 از طریق پروتکل I2C نیز ارتباط برقرار می‌کند. بنابراین SCL ماژول را به پین A5 در آردوینو و SDA را به A4 درآردوینو متصل کنید. پین های A4 و A5 در آردوینو مخصوص ارتباط I2C است. پس از برقراری اتصالات ماژول MPU6050 و آردوینو، سروو موتور را به آردوینو متصل کنید.

پس از برقراری اتصالات ماژول MPU6050 و آردوینو نوبت به اتصال سروو موتور می‌رسد. نحوه‌ی اتصال سروو موتور به آردوینو نیز به شرح زیر است:

- سیم زرد رنگ سروو موتور به پین 2 آردوینو و سیم قرمز سروو موتور به پین 5 ولت متصل می‌شود.
- سیم سیاه سروو موتور نیز به GND آردوینو متصل می‌شود.

 

مرحله 2 : کد نویسی و تنظیمات نرم‌افزاری

در وهله‌ی اول کتابخانه ماژول MPU6050 و سروو موتور را به برنامه اضافه می‌کنیم. کتابخانه "wire" مربوط به پروتکل SPI بین آردوینو و ماژول MPU6050 است.

#include <Wire.h>
#include <MPU6050.h>
#include <Servo.h>

سپس متغیری به نام sg90 ، از نوع Servo تعریف می‌کنیم. این متغیر به ما در استفاده از توابع کتابخانه سروو موتور کمک خواهد کرد. درنهایت پین 2  آردوینو را برای اتصال سروو موتور تنظیم می‌کنیم.

Servo sg90;   
int servo_pin = 2;

در این قسمت متغیری از نام و نوع ماژول تعریف می‌کنیم (   .MPU6050). این متغیر به ما در استفاده از توابع کتابخانه ماژولIMU نیز کمک خواهد کرد. 

MPU6050 sensor ;

int16_t ax, ay, az ;

int16_t gx, gy, gz ;

حال برخی متغیرها را که به منظور اندازه‌گیری خروجی ماژول MPU6050 استفاده خواهند شد، راه‌اندازی اولیه می‌کنیم. ورودی سروو موتور به پین 2 آردوینو متصل شده و سرعت انتقال داده نیز روی 9600 تنظیم می‌شود.

sg90.attach ( servo_pin );
Wire.begin ( );
Serial.begin  (9600);

در این مرحله عملکرد ماژول MPU6050 بررسی می‌شود. اگر ماژول به درستی عمل کند پیغام"Taking Values from the sensor" و در غیر این صورت پیغام 

“Connection failed" بر روی نمایشگر سریال آردوینو نشان داده خواهد شد.

Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); 
delay (1000); 
Serial.println ( "Taking Values from the sensor" );
delay (1000);

در حلقه برنامه خروجی‌های ماژول MPU6050 به مقداری که بتوانیم توسط آن سروو موتور را کنترل کنیم نگاشت می‌شود. سپس این مقدار به سروو موتور منتقل شده و آن را حرکت می‌دهد.

sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);

ax = map (ax, -17000, 17000, 0, 180) ;

Serial.println (ax);

sg90.write (ax); 

delay (200);

کد کامل برنامه:

/*
Partineh
Arduino Tutorial Series
Author: Shokoufeh Davarzani
Website: www.Partineh.com
*/
#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);

}