一起玩转树莓派(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))

   return math.degrees(radians)


# 设置电源模式

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螺旋仪加速度传感器模块应用(二)



在树莓派上运行上面代码,效果如下图所示:

上一篇:一起玩转树莓派(13)——雨滴检测传感器


下一篇:Mybatis学习第三天:Mybatis 连接池 多表操作