前言
上一篇把总体的架构好像搭建起来了,之后就每个模块开始学习应用了,今天从mpu6050开始~
正文
参考博客:Micropython——六轴MPU6050模块的使用_Irving.Gao的博客-CSDN博客_mpu6050模块
站在大佬的肩膀上,可以看到很多东西!!!
先来看看结构:
六轴mpu6050,但是我用到的就是四个接口:VCC、GND、SCL、SDA
(tips:对应连接,还有最后记下来已经连接的接口,防止后续接口太多弄混了)
直接上代码:
mpu6050.py
import machine
import math #后续求arctan 要用
class accel():
def __init__(self, i2c, addr=0x68):
self.iic = i2c
self.addr = addr
self.iic.start()
self.iic.writeto(self.addr, bytearray([107, 0]))
self.iic.stop()
def get_raw_values(self):
self.iic.start()
a = self.iic.readfrom_mem(self.addr, 0x3B, 14)
self.iic.stop()
return a
def get_ints(self):
b = self.get_raw_values()
c = []
for i in b:
c.append(i)
return c
def bytes_toint(self, firstbyte, secondbyte):
if not firstbyte & 0x80:
return firstbyte << 8 | secondbyte
return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)
def get_values(self):
raw_ints = self.get_raw_values()
vals = {}
g = 9.70
vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) * 2 * g / 32768
vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) * 2 * g / 32768
vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) * 2 * g / 32768
vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53
vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) * 1000 /32768
vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) * 1000 /32768
vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) * 1000 /32768
#return vals # returned in range of Int16 #这是返回角加速度和角速度
# -32768 to 32767
return math.atan(vals["AcX"]/vals["AcZ"])*180/3.14 #直接返回倾角
def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC
from time import sleep
while 1:
print(self.get_values())
sleep(0.25)
main.py
from pyb import Timer
from machine import I2C,Pin
import mpu6050
from time import sleep
i2c = I2C(scl=Pin("X9"), sda=Pin("X10")) #定义接口,得注意SDA和SCL!!!
Accel = mpu6050.accel(i2c,0x68)
accel_dict = Accel.get_values()
# gy = Accel.get_values1()
#mpu6050
i2c = I2C(scl=Pin("X9"), sda=Pin("X10"))
accel = mpu6050.accel(i2c)
accel_dict = accel.get_values()
#print(accel_dict)
accel.val_test() #仅供试验的时候参考
基本大多数代码都是参考上面那个大佬的博客的,有一下自己的改动,当然暂时还没有完全解读,等后续解读之后,再加加注释啥的。
来看看mpu6050到底带来了什么:
mpu6050的输出参数:
- 加速度计的X轴分量:
ACC_X
- 加速度计的Y轴分量:
ACC_Y
- 加速度计的Z轴分量:
ACC_Z
- 当前温度:
TEMP(不需要考虑)
- 绕X轴旋转的角速度:
GYR_X
- 绕Y轴旋转的角速度:
GYR_Y
- 绕Z轴旋转的角速度:
GYR_Z
转化成加速度的公式:
所以刚刚mpu6050.py中的加速度加速度计算公式要这么写:
vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) * 2 * g / 32768
vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) * 2 * g / 32768
vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) * 2 * g / 32768
陀螺仪后续在pid算法中会用到,当然现在我还不会,所以就先不写。。。
下面当然是最重要的,mpu6050在此项目中存在的意义就是求倾角啦:
利用一下简单的数学关系就可以求出,但是在此注意的是:mpu6050安放的位置,决定是x-y求还是x-z、y-z来求
今天就到这,明天继续奥利给!