مهندس موفق الکترونیک

اتصال MPU6050 به رزبری‌پای

مقدمه

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

برای دریافت اطلاعات بیشتر درباره ماژول سنسور MPU6050 و نحوه‌ی استفاده از آن، به مطلب ماژول سنسور MPU6050 در بخش سنسورها و ماژول‌ها رجوع کنید.

برای برقرار کردن ارتباط MPU6050 با رزبری‌پای، باید اطمینان حاصل کنیم که پروتکل I2C رزبری‌پای روشن است. بنابراین پیش از برقراری ارتباط باید پیکربندی I2C را روی رزبری‌پای انجام دهیم، می‌توانید به مطلب I2C رزبری‌پای رجوع کنید.

پس از پیکربندی I2C در رزبری‌پای، می‌توان ارتباط آن را با MPU6050 برقرار کرد.

مطلب پیشنهادی:  ژیروسکوپ چیست؟ معرفی سنسور های ژیروسکوپ و کاربرد آن‌ها

دیاگرام اتصالات

ارتباط 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.

ارتباط MPU6050 با رزبری‌پای

امیدواریم آموزش «اتصال MPU6050 به رزبری‌پای» براتون مفید واقع شده باشه. کامنت یادتون نره 🙂

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *