مقدمه
- ماژول سنسور 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 به رزبریپای» براتون مفید واقع شده باشه. کامنت یادتون نره 🙂
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.