ESP32、MicroPython、MPU6050

部署运行你感兴趣的模型镜像

         最近需要简单测量人体运动姿态,主要使用pitch和roll,故选用了最常见的MPU6050惯导单元。

一、MPU6050

        MPU6050是一个6轴姿态传感器,包含3 轴陀螺仪和 3 轴加速度传感器,可以测量芯片自身X、Y、Z轴的加速度等参数,通过数据融合,可以得到姿态角(欧拉角)。本文通过micropython、esp32s3解析欧拉角。

二、硬件连接

ESPMPU

3.3v

VCC
GNDGND
1SCL
2SDA

三、主要程序

程序来源(转自),做了一些简单修改:(演示)mpu6050+esp32 mpy,dmp姿态角运算。三行代码实现调用_哔哩哔哩_bilibili

驱动程序请见该Up的视频。 

 但是时间久了,会出现温漂现象,数据很奇怪,准备从软硬件两方面尝试解决这个问题。

3.1  软件

        思路是通过定时器,在软件层面上实现硬件重启。(突发奇想的)

import mpu6050, time, math
from machine import SoftI2C, Pin, Timer, reset

class Compute:
    # 测试偏差 yaw pitch roll 用于归零
    def __init__(self, i2c, bias=(-0, -0, 1.5)):
        self.mpu = mpu6050.MPU6050(i2c)
        self.mpu.dmpInitialize()
        self.mpu.setDMPEnabled(True)
        self.packetSize = self.mpu.dmpGetFIFOPacketSize()
        self.bias = bias

    def Wait4Ypr(self):
        while self.mpu.getIntStatus() < 2:
            # check for DMP data ready interrupt (this should happen frequently) 
            # get current FIFO count
            time.sleep_ms(10)
        fifoCount = self.mpu.getFIFOCount()

        # check for overflow (this should never happen unless our code is too inefficient)
        if fifoCount == 1024:
            # reset so we can continue cleanly
            self.mpu.resetFIFO()
            print('FIFO overflow!')

        # wait for correct available data length, should be a VERY short wait
        fifoCount = self.mpu.getFIFOCount()
        while fifoCount < self.packetSize:
            fifoCount = self.mpu.getFIFOCount()

        result = self.mpu.getFIFOBytes(self.packetSize)
        q = self.mpu.dmpGetQuaternion(result)
        g = self.mpu.dmpGetGravity(q)
        ypr = self.mpu.dmpGetYawPitchRoll(q, g)
        ypr = (ypr['yaw'] * 180 / math.pi + self.bias[0], 
               ypr['pitch'] * 180 / math.pi + self.bias[1], 
               ypr['roll'] * 180 / math.pi + self.bias[2])
        print('pitch {:.2f}'.format(ypr[1]), end=' ')
        print('roll {:.2f}'.format(ypr[2]))
        return ypr

def restart(timer):
    print('Restarting...')
    reset()

# Main code
i2c = SoftI2C(scl=Pin(1), sda=Pin(2), freq=400000)
mpu = Compute(i2c, bias=(-0, -0, 1.4))

main_timer = Timer(-1)
main_timer.init(period=20000, mode=Timer.ONE_SHOT, callback=restart)

while True:
    mpu.Wait4Ypr()

3.2  硬件

        准备购买一款高级一点的IMU,具体效果待续,硬件还没回来。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### MicroPython ESP32 MPU6050 驱动代码及教程 #### 1. 硬件连接 为了使ESP32能够与MPU6050通信,需通过I2C协议进行硬件连接。具体接线方式如下: - SDA (数据线): 连接到ESP32的GPIO引脚(通常为GPIO21或自定义配置)。 - SCL (时钟线): 连接到ESP32的另一个GPIO引脚(通常为GPIO22或自定义配置)。 - VCC: 接到3.3V电源。 - GND: 接地。 确保使用合适的电压电平转换器来保护传感器和开发板[^1]。 #### 2. 初始化 I2C 和 MPU6050 库 在MicroPython中操作MPU6050之前,需要安装并加载相应的库文件`mpu6050.py`。以下是初始化过程: ```python from machine import Pin, I2C import mpu6050 # 定义I2C接口 i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) # 创建MPU6050对象实例 sensor = mpu6050.accel(i2c) ``` 此部分代码用于设置I2C总线频率以及创建MPU6050的对象实例[^2]。 #### 3. 获取加速度计和陀螺仪的数据 一旦完成初始化工作,则可以通过调用方法获取来自MPU6050的各种传感数值。下面展示如何读取原始加速值及其处理逻辑: ```python def read_sensor_data(): values = sensor.get_values() # 提取加速度分量 ax = float(values["AcX"]) / 16384.0 ay = float(values["AcY"]) / 16384.0 az = float(values["AcZ"]) / 16384.0 # 输出结果 print(f"Acceleration X-axis: {ax} g") print(f"Acceleration Y-axis: {ay} g") print(f"Acceleration Z-axis: {az} g") read_sensor_data() ``` 上述函数展示了如何提取三轴方向上的重力单位表示形式,并打印出来供调试查看[^2]。 #### 4. 数据可视化或其他应用扩展 如果希望进一步利用这些数据实现更复杂的功能比如姿态估计或者运动检测等,则可能还需要引入额外算法支持如卡尔曼滤波(Kalman Filter)或是互补滤波(complementary filter),以便提高精度减少噪声干扰影响最终效果表现质量水平达到预期目标要求标准范围内合理范围之内[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值