天天看點

一起玩轉樹莓派(18)——MPU6050螺旋儀加速度傳感器子產品應用(二)

4. 加速計資料寄存器

加速計資料寄存器的位址為59到64,共48個二進制位,如下:

一起玩轉樹莓派(18)——MPU6050螺旋儀加速度傳感器子產品應用(二)

其使用方法與陀螺儀資料寄存器類似,同樣需要在寄存器28來對加速計進行配置與設定量程,通過量程對應的靈敏度來計算得到真實的加速度值。

5. 加速計配置寄存器

陀螺儀配置寄存器的位址為28,是一個可讀可寫的寄存器,如下:

一起玩轉樹莓派(18)——MPU6050螺旋儀加速度傳感器子產品應用(二)

XA_ST,YA_ST,ZA_ST都是自檢執行控制位,AFS_SEL用來設定量程,其與靈敏度對應關系如下:

AFS_SEL 量程範圍 靈敏度參數

0 ±2 16384

1 ±4g 8192

2 ±8g 4096

3 ±16g 2048

6. 溫度資料寄存器

溫度資料寄存器的位址為65到66,共16個二進制位,如下:

一起玩轉樹莓派(18)——MPU6050螺旋儀加速度傳感器子產品應用(二)

對于測量到的溫度資料為有符号數,需要采用如下的計算公式得到真實的攝氏度資料:

攝氏溫度 = TEMP_OUT / 340 + 36.53

除此之外,還有許多功能傳感器,如采樣率配置等,有需要可以從晶片手冊查到。

三. 編寫代碼

完成了前面的基礎準備工作,編寫代碼擷取傳感器子產品的資料則非常容易,示例代碼如下:

#coding:utf-8

import smbus

import math

import time

# 電源控制寄存器位址

power_regist = 0x6b

# I2C子產品初始化

bus = smbus.SMBus(1)

# 外接I2C裝置的位址

address = 0x68

# 封裝一些讀取資料的功能函數

# 讀取一個字長度的資料(16位)

def readWord(adr):

   high = bus.read_byte_data(address, adr)

   low = bus.read_byte_data(address, adr+1)

   val = (high << 8) + low

   return val

# 将讀取到的資料轉換為原碼 (有符号數本身是采用補碼方式存儲的)

def readWordReal(adr):

   val = readWord(adr)

   x = 0xffff

   # 首位為1 表示是負數

   if (val >= 0x8000):

       # 求原碼

       return -((x - val)+1)

   else:

       return val

# 已知加速度求角度值

def dist(a, b):

   return math.sqrt((a*a)+(b*b))

def getRotationX(x, y, z):

   radians = math.atan2(y, dist(x,z))

   return math.degrees(radians)

def getRotationY(x, y, z):

   radians = math.atan2(x, dist(y,z))

# 設定電源模式

bus.write_byte_data(address, power_regist, 0)

while True:

   time.sleep(0.5)

   print("螺旋儀資料-----------")

   gyroX = readWordReal(0x43)

   gyroY = readWordReal(0x45)

   gyroZ = readWordReal(0x47)

   print("X軸陀螺儀原始資料:", gyroX, "X軸每秒旋轉度數:", gyroX/131)

   print("Y軸陀螺儀原始資料:", gyroY, "Y軸每秒旋轉度數:", gyroY/131)

   print("Z軸陀螺儀原始資料:", gyroZ, "Z軸每秒旋轉度數:", gyroZ/131)

   print("加速度資料----------")

   accelX = readWordReal(0x3b)

   accelY = readWordReal(0x3d)

   accelZ = readWordReal(0x3f)

   print("X軸加速度原始資料:", accelX, "X軸加速度:", accelX/16384)

   print("Y軸加速度原始資料:", accelY, "Y軸加速度:", accelY/16384)

   print("Z軸加速度原始資料:", accelZ, "Z軸加速度:", accelZ/16384)

   print("攝氏溫度資料--------")

   temp = readWordReal(0x41)

   print("溫度原始資料:", temp, "攝氏度:", temp/340 + 36.53)

   print("旋轉家角度資料-------")

   print("X軸旋轉度數:", getRotationX(accelX/16384, accelY/16384, accelZ/16384))

   print("Y軸旋轉度數:", getRotationX(accelX/16384, accelY/16384, accelZ/16384))

一起玩轉樹莓派(18)——MPU6050螺旋儀加速度傳感器子產品應用(二)

在樹莓派上運作上面代碼,效果如下圖所示:

繼續閱讀