用的是wiringpi库
具体如何导入wiringpi库大家就先自行百度哈
#小灰灰原创
import threading#这是一个线程库 用于定时器 先不管这个
import wiringpi#导入wiringpi库
from math import atan2#导入一个数学公式
def getdata(mpu,address):#定义一个函数:把mpu读取的16位数据进行合成,并判断数据的正负
x=((wiringpi.wiringPiI2CReadReg8(mpu,address)<<8 |wiringpi.wiringPiI2CReadReg8(mpu,address+1)))#(wiringpi.wiringPiI2CReadReg8(mpu,address)表示从address这个地址读取一个8位数据 然后合成这两个8位数据
return x-65536 if x>=32767 else x#python是不能判断第一位是正还是负,所以我们要对数据进行处理
def read_ax_angle():#定义一个函数来读取x轴与z的夹角
x=getdata(mpu,0x3B)
z=getdata(mpu,0x3F)
ax_angle=atan2(x,z)*57.2957804
return ax_angle
def gyroyinit():#陀螺仪初始化
global angle#声明全局变量以达到时刻更改当前角度
wiringpi.wiringPiI2CWriteReg16(0x68,0x1B,0x08)#500dbs--0x08#设置陀螺仪的精度位500dps
angle=read_ax_angle()#把陀螺仪的初始角度设置为加速度计读取出来的角度
ef interrupt1():定义定时器中断后执行的操作
fileter()#一阶滤波(合成最终的角度)
timer=threading.Timer(0.005,interrupt1)#重新配置定时器
timer.start()#定时器开始
def fileter():#定义如何一阶滤波(如何合成角度)
global angle,gyroy#声明角度和陀螺仪数据两个全局变量
k1=0.02
accel=read_ax_angle()
gyroy=(-getdata(mpu,0x45)/66)*0.005
angle=k1*accel+(1-k1)*(angle+gyroy)
mpu=wiringpi.wiringPiI2CSetup(0x68)#设置I2C读取mpu的地址
angle=0#定义角度变量
gyroy=0#定义陀螺仪变量
gyroyinit()初始化陀螺仪
timer=threading.Timer(0.005,interrupt1)#设置定时器
timer.start()#定时器开始
while True:
print("angle={} ax={}".format(angle,read_ax_angle()))#打印合成的角度和读取的加速度处理后的角度
下面是树莓派运行后的图片