سنسور ژیروسکوپ MPU6050 و Raspberry Pi

اتصال سنسور ژیروسکوپ MPU6050 با Raspberry Pi

سنسور MPU6050 دارای عملکردهای زیادی بر روی یک تراشه است. این قطعه شامل یک شتاب سنج MEMS، یک ژیروسکوپ MEMS و یک سنسور دما است. این ماژول هنگام تبدیل مقادیر آنالوگ به دیجیتال بسیار دقیق است زیرا دارای یک سخت افزار مبدل آنالوگ به دیجیتال ۱۶ بیتی برای هر کانال است. این ماژول قابلیت ضبط همزمان کانال های x ، y و z را دارد.
رابط I2C برای برقراری ارتباط با کنترل کننده هاست دارد. این ماژول MPU6050 یک تراشه جمع و جور است که هم شتاب سنج و هم ژیروسکوپ دارد. این دستگاه برای بسیاری از برنامه ها مانند هواپیماهای بدون سرنشین، ربات ها، حسگرهای حرکتی بسیار مفید است. به آن شتاب سنج ژیروسکوپ یا محور سه گانه نیز گفته می شود.
در این آموزش قصد داریم این MPU6050 را به Raspberry Pi متصل کنیم و مقادیر بالای ۱۶×۲ LCD را نشان دهیم.

قطعات مورد نیاز:

  • برد Raspberry Pi
  • مازول ژیروسکوپ MPU6050
  • ۱۶×۲ LCD

سنسور ژیروسکوپ MPU6050:

MPU-6050 یک ژیروسکوپ و شتاب سنج ۸ پین ۶ محوره در یک تراشه است. این ماژول به طور پیش فرض روی ارتباطات سریال I2C کار می کند اما با پیکربندی رجیستری می تواند برای رابط SPI پیکربندی شود. برای I2C خطوط SDA و SCL دارد. تقریباً همه پین ها چند کاره هستند اما در اینجا ما فقط با پین های حالت I2C کار می کنیم.

MPU6050

 

پیکربندی پایه ها:

Vcc: – این پین برای تأمین ولتاژ ماژول MPU6050 استفاده می شود

GND: – پایه زمین

SDA: پین SDA برای داده های بین کنترل کننده و ماژول mpu6050 بکار می رود

SCL: – از پین SCL برای ورودی ساعت استفاده می شود

XDA: – این خط داده سنسور I2C SDA برای پیکربندی و خواندن از حسگرهای خارجی است ((اختیاری) که در مورد ما استفاده نمی شود)

XCL: – این خط ساعت سنسور I2C SCL برای پیکربندی و خواندن از حسگرهای خارجی است ((اختیاری) که در مورد ما استفاده نمی شود)

ADO: – آدرس بندی I2C LSB (در مورد ما قابل استفاده نیست)

INT: – پین را برای نشان دادن داده آماده آماده کنید.

 

توضیحات عملکرد مدار:

در این آموزش، ما با استفاده از MPU6050 و Raspberry Pi، قرائت دما، ژیروسکوپ و شتاب سنج را روی LCD نشان می دهیم

ابتدا مقدار دما را از طریق LCD نشان داده و پس از مدتی مقادیر ژیروسکوپی را نشان می دهیم و پس از آن خواندن شتاب سنج را داریم که در تصاویر زیر نشان داده شده است:

temp

Gyro

 

شماتیک مدار و توضیحات:

شماتیک مدار برای این آموزش بسیار ساده است. ما از یک LCD و MPU6050 استفاده کرده ایم، پتانسیومتر ۱۰k برای کنترل روشنایی LCD بکار می رود. در ارتباط با MPU6050، ما ۴ اتصال انجام داده ایم که در آن منبع تغذیه ۳.۳v و زمین MPU6050 را به ۳.۳v و زمین Raspberry Pi متصل کرده ایم.

پین های SCL و SDA MPU6050 با پین ۳ Raspberry (GPIO2) و پایه ۵ (GPIO3) متصل می شوند. LCD های RS ، RW و EN مستقیماً به GPIO18 و ۲۳ Rasspberry pi متصل هستند. پین داده ها مستقیماً به شماره پین دیجیتال GPIO24 ، GPIO25 ، GPIO8 و GPIO7 متصل می شوند

 

مدار

 

پیکربندی Raspberry Pi برای سنسور Gyro MPU6050:

قبل از شروع برنامه نویسی، باید I2C برد Raspberry Pi را با استفاده از روش داده شده فعال کنیم:

مرحله ۱: ارتباط I2C را فعال کنید

قبل از نصب کتابخانه Adafruit SSD1306 ، باید ارتباط I2C را در Raspberry Pi فعال کنیم.

sudo raspi-config

در این قسمت گزینه I2C را انتخاب کنیم

در بخش بعد، باید yes را انتخاب کرده و enter را فشار داده و سپس ok را فشار دهید

با دستور زیر باید Raspberry pi را مجدداً راه اندازی کنیم:

sodo reboot

مرحله ۲: کتابخانه python-pip و GPIO را نصب کنید

sudo apt-get install build-essential python-dev python-pip

پس از این، ما باید کتابخانه GPIO را نصب کنیم

sudo pip installs RPi.GPIO

مرحله ۳: کتابخانه smbus را نصب کنید

در آخر، ما باید کتابخانه smbus را با استفاده از دستور داده شده در Raspberry Pi نصب کنیم:

sudo apt-get install python-smbus

مرحله ۴: کتابخانه MPU6050 را نصب شود

بعد از این بخش با استفاده از دستور داده شده، کتابخانه MPU6050 را نصب کنیم

sudo pip install mpu6050

 

اکنون می توانیم کدهای نمونه را در مثال ها پیدا کنیم. کاربر می تواند با بارگذاری مستقیم در Raspberry Pi، کدها را تست کند یا آن را مطابق با نیاز تغییر دهد. در اینجا ما مقادیر محورهای X ، Y و Z MPU6050 را روی LCD 16×2 نمایش داده ایم. می توانید کد کامل پایتون را در انتهای آموزش مشاهده کنید.

توضیحات برنامه :

کد پایتون کامل در انتها آورده شده است که ما در اینجا چندین بخش مهم کد را توضیح می دهیم.

در برنامه پایتون، ما برخی از کتابخانه های مورد نیاز مانند زمان ، smbus و GPIO را وارد کرده ایم.

import smbus
import time

import RPi.GPIO as gpio

 

برای پیکربندی MPU6050 و بدست آوردن مقادیر از همان آدرس مقادیر ثبات را باید بگیریم. ما همچنین برخی از متغیرها را برای کالیبراسیون و مقداردهی اولیه گذرگاه برای I2C در نظر گرفته ایم.

PWR_M   = 0x6B
DIV   = 0x19
CONFIG       = 0x1A
GYRO_CONFIG  = 0x1B
INT_EN   = 0x38
ACCEL_X = 0x3B
ACCEL_Y = 0x3D
ACCEL_Z = 0x3F
GYRO_X  = 0x43
GYRO_Y  = 0x45
GYRO_Z  = 0x47
TEMP = 0x41
bus = smbus.SMBus(1)

Device_Address = 0x68   # device address
AxCal=0
AyCal=0
AzCal=0
GxCal=0
GyCal=0
GzCal=0

برخی از توابع را برای درایور ۱۶x2LCD مانند def start () ،def cmd (ch) ،def write (ch) ،def print (str) ،def clear و غیره نوشتیم.

پس از این، ما نیاز به معرفی ماژول MPU6050 داریم

def InitMPU():
     bus.write_byte_data(Device_Address, DIV, 7)
     bus.write_byte_data(Device_Address, PWR_M, 1)
     bus.write_byte_data(Device_Address, CONFIG, 0)
     bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
     bus.write_byte_data(Device_Address, INT_EN, 1)
     time.sleep(1)

 

برخی از توابع را برای خواندن مقادیر از MPU6050 بنویسید و آنها را به LCD نمایش دهید. تابع داده شده برای خواندن داده ها از MPU6050 استفاده می شود.

def readMPU(addr):
     high = bus.read_byte_data(Device_Address, addr)
     low = bus.read_byte_data(Device_Address, addr+1)
     value = ((high << 8) | low)
     if(value > 32768):
           value = value - 65536
     return value
از تابع داده شده برای خواندن داده های شتاب سنج و ژیرومتر استفاده می شود
def accel():
     x = readMPU(ACCEL_X)
     y = readMPU(ACCEL_Y)
     z = readMPU(ACCEL_Z)
     Ax = (x/16384.0-AxCal)
     Ay = (y/16384.0-AyCal)
     Az = (z/16384.0-AzCal)
     #print "X="+str(Ax)
     display(Ax,Ay,Az)
     time.sleep(.01)
    
def gyro():
      global GxCal
      global GyCal
      global GzCal
      x = readMPU(GYRO_X)
      y = readMPU(GYRO_Y)
      z = readMPU(GYRO_Z)
      Gx = x/131.0 - GxCal
      Gy = y/131.0 - GyCal
      Gz = z/131.0 - GzCal
      #print "X="+str(Gx)
      display(Gx,Gy,Gz)
      time.sleep(.01)

 

تابع خواندن دما

def temp():
  tempRow=readMPU(TEMP)
  tempC=(tempRow / 340.0) + 36.53
  tempC="%.2f" %tempC
  print tempC
  setCursor(0,0)
  Print("Temp: ")
  Print(str(tempC))
  time.sleep(.2)

 

 def calibrate برای کالیبره کردن MPU6050 و از تابع def display برای نمایش مقادیر روی LCD استفاده می شود.
در بخش بعد LCD را معرفی کرده و MPU6050 را کالیبره می کنیم و سپس در حلقه while، هر سه مجموعه مقدار MPU – دما ، شتاب سنج و ژیرو را فراخوانی کرده و آنها را از طریق LCD نشان می دهیم

begin()
Print("MPU6050 Interface")
setCursor(0,1)
Print("Circuit Digest")
time.sleep(2)
InitMPU()
calibrate()

while 1:
  InitMPU()
  clear()

  for i in range(20):
    temp()
  clear()
  Print("Accel")
  time.sleep(1)
  for i in range(30):
    accel()
  clear()
  Print("Gyro")
  time.sleep(1)
  for i in range(30):
  gyro()

 

کد کامل برنامه به زبان پایتون:

import smbus
import time
 
import RPi.GPIO as gpio
 
PWR_M   = 0x6B
DIV   = 0x19
CONFIG       = 0x1A
GYRO_CONFIG  = 0x1B
INT_EN   = 0x38
ACCEL_X = 0x3B
ACCEL_Y = 0x3D
ACCEL_Z = 0x3F
GYRO_X  = 0x43
GYRO_Y  = 0x45
GYRO_Z  = 0x47
TEMP = 0x41
bus = smbus.SMBus(1)
Device_Address = 0x68   # device address
 
AxCal=0
AyCal=0
AzCal=0
GxCal=0
GyCal=0
GzCal=0
 
 
RS =18
EN =23
D4 =24
D5 =25
D6 =8
D7 =7
 
gpio.setwarnings(False)
gpio.setmode(gpio.BCM)
gpio.setup(RS, gpio.OUT)
gpio.setup(EN, gpio.OUT)
gpio.setup(D4, gpio.OUT)
gpio.setup(D5, gpio.OUT)
gpio.setup(D6, gpio.OUT)
gpio.setup(D7, gpio.OUT)
 
 
def begin():
  cmd(0x33) 
  cmd(0x32) 
  cmd(0x06)
  cmd(0x0C) 
  cmd(0x28) 
  cmd(0x01) 
  time.sleep(0.0005)
 
def cmd(ch): 
  gpio.output(RS, 0)
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x10==0x10:
    gpio.output(D4, 1)
  if ch&0x20==0x20:
    gpio.output(D5, 1)
  if ch&0x40==0x40:
    gpio.output(D6, 1)
  if ch&0x80==0x80:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  # Low bits
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x01==0x01:
    gpio.output(D4, 1)
  if ch&0x02==0x02:
    gpio.output(D5, 1)
  if ch&0x04==0x04:
    gpio.output(D6, 1)
  if ch&0x08==0x08:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  
def write(ch): 
  gpio.output(RS, 1)
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x10==0x10:
    gpio.output(D4, 1)
  if ch&0x20==0x20:
    gpio.output(D5, 1)
  if ch&0x40==0x40:
    gpio.output(D6, 1)
  if ch&0x80==0x80:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  # Low bits
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x01==0x01:
    gpio.output(D4, 1)
  if ch&0x02==0x02:
    gpio.output(D5, 1)
  if ch&0x04==0x04:
    gpio.output(D6, 1)
  if ch&0x08==0x08:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
def clear():
  cmd(0x01)
 
def Print(Str):
  l=0;
  l=len(Str)
  for i in range(l):
    write(ord(Str[i]))
    
def setCursor(x,y):
        if y == 0:
                n=128+x
        elif y == 1:
                n=192+x
        cmd(n)
 
 
def InitMPU():
bus.write_byte_data(Device_Address, DIV, 7)
bus.write_byte_data(Device_Address, PWR_M, 1)
bus.write_byte_data(Device_Address, CONFIG, 0)
bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
bus.write_byte_data(Device_Address, INT_EN, 1)
time.sleep(1)
 
def display(x,y,z):
      x=x*100
      y=y*100
      z=z*100
      x= "%d" %x
      y= "%d" %y
      z= "%d" %z
      setCursor(0,0)
      Print("X     Y     Z")
      setCursor(0,1)
      Print(str(x))
      Print("   ")
      setCursor(6,1)
      Print(str(y))
      Print("   ")
      setCursor(12,1)
      Print(str(z))
      Print("   ")
 
      print x
      print y
      print z
 
 
def readMPU(addr):
high = bus.read_byte_data(Device_Address, addr)
low = bus.read_byte_data(Device_Address, addr+1)
value = ((high << 8) | low) if(value > 32768):
value = value - 65536
return value
def accel():
x = readMPU(ACCEL_X)
y = readMPU(ACCEL_Y)
z = readMPU(ACCEL_Z)
 
Ax = (x/16384.0-AxCal) 
Ay = (y/16384.0-AyCal) 
Az = (z/16384.0-AzCal)
 
#print "X="+str(Ax)
display(Ax,Ay,Az)
time.sleep(.01)
 
def gyro():
      global GxCal
      global GyCal
      global GzCal
      x = readMPU(GYRO_X)
      y = readMPU(GYRO_Y)
      z = readMPU(GYRO_Z)
      Gx = x/131.0 - GxCal
      Gy = y/131.0 - GyCal
      Gz = z/131.0 - GzCal
      #print "X="+str(Gx)
      display(Gx,Gy,Gz)
      time.sleep(.01)
 
def temp():
  tempRow=readMPU(TEMP)
  tempC=(tempRow / 340.0) + 36.53
  tempC="%.2f" %tempC
  print tempC
  setCursor(0,0)
  Print("Temp: ")
  Print(str(tempC))
  time.sleep(.2)
 
def calibrate():
  clear()
  Print("Calibrate....")
  global AxCal
  global AyCal
  global AzCal
  x=0
  y=0
  z=0
  for i in range(50):
      x = x + readMPU(ACCEL_X)
      y = y + readMPU(ACCEL_Y)
      z = z + readMPU(ACCEL_Z)
  x= x/50
  y= y/50
  z= z/50
  AxCal = x/16384.0
  AyCal = y/16384.0
  AzCal = z/16384.0
  
  print AxCal
  print AyCal
  print AzCal
 
  global GxCal
  global GyCal
  global GzCal
  x=0
  y=0
  z=0
  for i in range(50):
    x = x + readMPU(GYRO_X)
    y = y + readMPU(GYRO_Y)
    z = z + readMPU(GYRO_Z)
  x= x/50
  y= y/50
  z= z/50
  GxCal = x/131.0
  GyCal = y/131.0
  GzCal = z/131.0
 
  print GxCal
  print GyCal
  print GzCal
 
 
begin();
Print("MPU6050 Interface")
setCursor(0,1)
Print("Circuit Digest")
time.sleep(2)
InitMPU()
calibrate()
while 1:
  InitMPU()
  clear()
  for i in range(20):
    temp()
  clear()
  Print("Accel")
  time.sleep(1)
  for i in range(30):
    accel()
  clear()
  Print("Gyro")
  time.sleep(1)
  for i in range(30):
    gyro()

 


مطالب پیشنهادی برای شما


 

محمد صداقتی

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

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