Micropython——九轴传感器(MPU6050)的使用及算法(一)

本文介绍了MPU60X0这款9轴运动传感器,它集成了加速度、角速度和数字运动处理器。通过I2C协议与传感器交互,读取并解析角速度、加速度和温度数据。文中还提供了硬件原理图、实物图以及驱动文件的详细说明,包括数据输出寄存器地址和温度换算公式。此外,还展示了Python代码示例,用于从传感器获取原始和转换后的数据。最后,文章预告了后续将深入讲解参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

MPU-60X0是全球首例9轴运动处理传感器。集成了三轴加速度,三轴角速度,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor:数字运动处理器),能够通过I2C协议进行获取数据,并返回到电脑或者显示在OLED屏幕上,直观地表现出来。

MPU6050将使用I2C协议进行通讯,获取角速度、加速度以及温度数据,使用串口显示在电脑上。


 

1、硬件原理图以及实物图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

图一:硬件原理图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

 

图二:实物图MCU6050

2、如何连接及使用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

 这里的XDA 和 XCL 作为次I2C接口,可以接磁力计等器件。这里我们未使用。

3、驱动文件

  • 使用I2C通信。
  • 检测到设备。
  • 定时读取加速度、角速度及温度数据。
  • 返回数据到单片机上。

陀螺仪数据输出寄存器(共6个寄存器,地址为0x43-0x48)

加速度传感器数据输出寄存器(6个,地址为0x3B-0x40)

温度传感器数据输出寄存器(0x41-0x42)

温度换算公式为    :Tem = 36.53  +  regval  /340

import machine

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 = {}
        vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])
        vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])
        vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])
        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])
        vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])
        vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])
        return vals  # returned in range of Int16
        # -32768 to 32767

    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.05)

关于程序的一些解释说明:

  • 0X68是I2C从机地址,0x69也是I2C从机地址,判断需要那个地址的时候是根据MPU_AD0时是悬空还是接VCC。接VCC时,地址是0X69,悬空或者接地时,地址是0X68


 


主程序:

import mpu6050
from machine import SoftI2C,Pin
import utime

i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
accel = mpu6050.accel(i2c)
while True:
    accel_dict = accel.get_values()
    print(accel_dict)
    utime.sleep(3)

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

今天只是简单地实现功能,下一篇文章将详细地讲解参数以及如何设置。 

 

 

 

### 使用 MPU6050 读取四元数数据 MPU6050款集成三加速度计和三陀螺仪的惯性测量单元 (IMU),通常用于姿态估计。为了获得更精确的姿态表示,可以采用四元数来描述旋转状态。 #### 初始化设置 在开始使用 MPU6050 获取四元数前,需完成必要的初始化工作。这涉及通过 I2C 接口向设备发送命令以配置其内部寄存器[^1]: ```python from mpu6050 import MPU6050 import time i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4)) sensor = MPU6050(i2c) # 设置采样率、量程等参数 sensor.set_accel_range(MPU6050.ACCEL_RANGE_8G) sensor.set_gyro_range(MPU6050.GYRO_RANGE_500DEG) ``` #### 四元数计算方法 由于 MPU6050 并不直接提供四元数值输出,因此需要借助外部算法处理原始加速计与陀螺仪数据并转化为四元数形式。种常见做法是应用互补滤波或卡尔曼滤波技术融合两种传感器的信息源[^3]。 对于简化实现,可考虑调用现成库函数执行 DMP(Digital Motion Processor) 功能,该功能内置了复杂的数学运算逻辑,可以直接得到较为准确的结果而无需自行编写复杂代码。 如果选择手动实现,则可以通过 Madgwick 或 Mahony 滤波器更新四元数 q=[w,x,y,z] 的各个分量值。以下是基于 PythonMicroPython 实现的个简单例子: ```python class QuaternionFilter: def __init__(self, beta=0.1): self.q = [1.0, 0.0, 0.0, 0.0] # 初始单位四元数 self.beta = beta def update(self, gx, gy, gz, ax, ay, az, dt): """ 更新四元数 """ pass # 这里省略具体实现细节 def get_quaternion(sensor_data): filter = QuaternionFilter() while True: accel_data = sensor.get_accel_data() gyro_data = sensor.get_gyro_data() # 假设已知时间间隔dt dt = 0.01 wx, wy, wz = gyro_data[&#39;x&#39;], gyro_data[&#39;y&#39;], gyro_data[&#39;z&#39;] ax, ay, az = accel_data[&#39;x&#39;], accel_data[&#39;y&#39;], accel_data[&#39;z&#39;] filter.update(wx,wy,wz,ax,ay,az,dt) yield tuple(filter.q) for quat in get_quaternion(sensor): print(f"Quaternion: {quat}") time.sleep_ms(100) ``` 上述代码片段展示了如何定义个简单的四元数过滤类 `QuaternionFilter` 来持续接收来自 MPU6050 的传感数据,并据此不断调整当前物体的空间朝向表达——即四元数。实际项目中建议选用成熟的第三方库来提高精度和稳定性[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xa_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值