pyboard平衡车学习(二)

前言

上一篇把总体的架构好像搭建起来了,之后就每个模块开始学习应用了,今天从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来求

今天就到这,明天继续奥利给!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值