مقدمه
- ماژول سنسور MPU6050 (شتابسنج + ژیروسکوپ) یک دستگاه ۶ محوره ردیابی حرکت مجتمع است.
- این دستگاه داری یک ژیروسکوپ سه محوره، شتابسنج سه محوره، پردازندهی حرکت دیجیتالی و یک سنسور دماسنج است، که در یک IC مجتمع شدهاند.
- این سنسور با استفاده از گذرگاه I2C کمکی خود، میتواند از دیگر سنسورها مانند مغناطیسسنج سه محوره و سنسور فشار نیز ورودی دریافت کند.
- اگر مغناطیسسنج سه محورهی خارجی متصل باشد، یک خروجی حرکتی ۹ محوره کامل را فراهم میآورد.
- یک میکروکنترلر با استفاده از پروتکل ارتباطی I2C با این ماژول ارتباط برقرار میکند. با خواندن آدرس رجیسترهای مشخص از طریق ارتباط I2C، میتوان پارامترهای مختلف را به دست آورد.
- اطلاعات ژیروسکوپ و شتابسنج در محورهای X ،Y و Z برای خواندن در حالت مکمل ۲ موجود هستند.
- خواندن ژیروسکوپ در واحد درجه برثانیه (dps) صورت میگیرد؛ خواندن شتابسنج در واحد g صورت میگیرد.
برای دریافت اطلاعات بیشتر درباره ماژول سنسور MPU6050 و نحوهی استفاده از آن، به مطلب ماژول سنسور MPU6050 در بخش سنسورها و ماژولها رجوع کنید.
برای برقرار کردن ارتباط MPU6050 با رزبریپای، باید اطمینان حاصل کنیم که پروتکل I2C رزبریپای روشن است. بنابراین پیش از برقراری ارتباط باید پیکربندی I2C را روی رزبریپای انجام دهیم، میتوانید به مطلب I2C رزبریپای رجوع کنید.
پس از پیکربندی I2C در رزبریپای، میتوان ارتباط آن را با MPU6050 برقرار کرد.
دیاگرام اتصالات

مثال
در اینجا، باید ارتباط ماژول MPU6050 را با رزبریپای برقرار کرده و مقادیر ژیروسکوپ و شتابسنج را خوانده و چاپ کنیم.
میتوان ارتباط بین ماژول MPU6050 با رزبریپای را با استفاده از زبان پایتون یا زبان C برقرار کرد. مقادیر ژیروسکوپ و شتابسنجی که از ماژول میخوانیم را روی ترمینال نمایش خواهیم داد.
برای مطالعه توابع پرکاربرد I2C در پایتون، به مطلب توابع پرکاربرد I2C پایتون برای رزبریپای رجوع کنید.
برنامه پایتون
'''
Read Gyro and Accelerometer by Interfacing Raspberry Pi with MPU6050 using Python
http://www.electronicwings.com
'''
import smbus #import SMBus module of I2C
from time import sleep #import
#some MPU6050 Registers and their Address
PWR_MGMT_1 = 0x6B
SMPLRT_DIV = 0x19
CONFIG = 0x1A
GYRO_CONFIG = 0x1B
INT_ENABLE = 0x38
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
GYRO_XOUT_H = 0x43
GYRO_YOUT_H = 0x45
GYRO_ZOUT_H = 0x47
def MPU_Init():
#write to sample rate register
bus.write_byte_data(Device_Address, SMPLRT_DIV, 7)
#Write to power management register
bus.write_byte_data(Device_Address, PWR_MGMT_1, 1)
#Write to Configuration register
bus.write_byte_data(Device_Address, CONFIG, 0)
#Write to Gyro configuration register
bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
#Write to interrupt enable register
bus.write_byte_data(Device_Address, INT_ENABLE, 1)
def read_raw_data(addr):
#Accelero and Gyro value are 16-bit
high = bus.read_byte_data(Device_Address, addr)
low = bus.read_byte_data(Device_Address, addr+1)
#concatenate higher and lower value
value = ((high << 8) | low)
#to get signed value from mpu6050
if(value > 32768):
value = value - 65536
return value
bus = smbus.SMBus(1) # or bus = smbus.SMBus(0) for older version boards
Device_Address = 0x68 # MPU6050 device address
MPU_Init()
print (" Reading Data of Gyroscope and Accelerometer")
while True:
#Read Accelerometer raw value
acc_x = read_raw_data(ACCEL_XOUT_H)
acc_y = read_raw_data(ACCEL_YOUT_H)
acc_z = read_raw_data(ACCEL_ZOUT_H)
#Read Gyroscope raw value
gyro_x = read_raw_data(GYRO_XOUT_H)
gyro_y = read_raw_data(GYRO_YOUT_H)
gyro_z = read_raw_data(GYRO_ZOUT_H)
#Full scale range +/- 250 degree/C as per sensitivity scale factor
Ax = acc_x/16384.0
Ay = acc_y/16384.0
Az = acc_z/16384.0
Gx = gyro_x/131.0
Gy = gyro_y/131.0
Gz = gyro_z/131.0
print ("Gx=%.2f" %Gx, u'\u00b0'+ "/s", "\tGy=%.2f" %Gy, u'\u00b0'+ "/s", "\tGz=%.2f" %Gz, u'\u00b0'+ "/s", "\tAx=%.2f g" %Ax, "\tAy=%.2f g" %Ay, "\tAz=%.2f g" %Az)
sleep(1)
برنامه C
در اینجا، از کتابخانهی Wiring Pi به زبان C برای خواندن داده از ماژول MPU6050 استفاده میکنیم.
/*
MPU6050 Interfacing with Raspberry Pi
http://www.electronicwings.com
*/
#include <wiringPiI2C.h>
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#define Device_Address 0x68 /*Device Address/Identifier for MPU6050*/
#define PWR_MGMT_1 0x6B
#define SMPLRT_DIV 0x19
#define CONFIG 0x1A
#define GYRO_CONFIG 0x1B
#define INT_ENABLE 0x38
#define ACCEL_XOUT_H 0x3B
#define ACCEL_YOUT_H 0x3D
#define ACCEL_ZOUT_H 0x3F
#define GYRO_XOUT_H 0x43
#define GYRO_YOUT_H 0x45
#define GYRO_ZOUT_H 0x47
int fd;
void MPU6050_Init(){
wiringPiI2CWriteReg8 (fd, SMPLRT_DIV, 0x07); /* Write to sample rate register */
wiringPiI2CWriteReg8 (fd, PWR_MGMT_1, 0x01); /* Write to power management register */
wiringPiI2CWriteReg8 (fd, CONFIG, 0); /* Write to Configuration register */
wiringPiI2CWriteReg8 (fd, GYRO_CONFIG, 24); /* Write to Gyro Configuration register */
wiringPiI2CWriteReg8 (fd, INT_ENABLE, 0x01); /*Write to interrupt enable register */
}
short read_raw_data(int addr){
short high_byte,low_byte,value;
high_byte = wiringPiI2CReadReg8(fd, addr);
low_byte = wiringPiI2CReadReg8(fd, addr+1);
value = (high_byte << 8) | low_byte;
return value;
}
void ms_delay(int val){
int i,j;
for(i=0;i<=val;i++)
for(j=0;j<1200;j++);
}
int main(){
float Acc_x,Acc_y,Acc_z;
float Gyro_x,Gyro_y,Gyro_z;
float Ax=0, Ay=0, Az=0;
float Gx=0, Gy=0, Gz=0;
fd = wiringPiI2CSetup(Device_Address); /*Initializes I2C with device Address*/
MPU6050_Init(); /* Initializes MPU6050 */
while(1)
{
/*Read raw value of Accelerometer and gyroscope from MPU6050*/
Acc_x = read_raw_data(ACCEL_XOUT_H);
Acc_y = read_raw_data(ACCEL_YOUT_H);
Acc_z = read_raw_data(ACCEL_ZOUT_H);
Gyro_x = read_raw_data(GYRO_XOUT_H);
Gyro_y = read_raw_data(GYRO_YOUT_H);
Gyro_z = read_raw_data(GYRO_ZOUT_H);
/* Divide raw value by sensitivity scale factor */
Ax = Acc_x/16384.0;
Ay = Acc_y/16384.0;
Az = Acc_z/16384.0;
Gx = Gyro_x/131;
Gy = Gyro_y/131;
Gz = Gyro_z/131;
printf("\n Gx=%.3f °/s\tGy=%.3f °/s\tGz=%.3f °/s\tAx=%.3f g\tAy=%.3f g\tAz=%.3f g\n",Gx,Gy,Gz,Ax,Ay,Az);
delay(500);
}
return 0;
}
خروجی MPU6050
پنجرهی خروجی همه مقادیر زیر را نشان میدهد.
Gx: دادهی محور X ژیرو در واحد درجه/ثانیه.
Gy: دادهی محور Y ژیرو در واحد درجه/ثانیه.
Gy: دادهی محور Z ژیرو در واحد درجه/ثانیه.
Ax: دادهی محور X شتابسنج در واحد g.
Ay: دادهی محور Y شتابسنج در واحد g.
Az: دادهی محور Z شتابسنج در واحد g.

- منبع: ترجمه از سایت electronicwings.com
امیدواریم آموزش «اتصال MPU6050 به رزبریپای» براتون مفید واقع شده باشه. کامنت یادتون نره 🙂
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
آموزش طراحی و ساخت پروژه های الکترونیک و برنامه نویسی میکروکنترلر ها آموزش الکترونیک,آموزش رزبری پای,آموزش راه اندازی ماژول و سنسور,آموزش آردوینو,نرم افزار های الکترونیک, طراحیPCB,برنامه نویسی میکروکنترلرها ARM AVR PIC FPGA