首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带MPU6050读取零点的树莓皮皮

带MPU6050读取零点的树莓皮皮
EN

Stack Overflow用户
提问于 2022-11-21 11:59:59
回答 1查看 36关注 0票数 0

所以我在使用raspberry pi pico和MPU6050的步长计数器上工作,昨晚我的代码工作得很好,所以我拔掉了pico的插头,然后今天早上我去把pico插头插回去,现在它显示的是零。我相应地将代码配置为这些连接:

VCC到3v3

GND到GND

SCL到GP1

SDA到GP0

以下是代码:

代码语言:javascript
复制
#import PIN and I2C from machine library 
from machine import Pin, I2C
import time

#Define I2C bus 
i2c = I2C(0, sda=machine.Pin(0), scl=machine.Pin(1))

#Device address on the I2C bus
MPU6050_ADDR = 0x68

#PWR_MGMT_1 memory address
MPU6050_PWR_MGMT_1 = 0x6B

#Accelerometer's high and low register for each axis
MPU6050_ACCEL_XOUT_H = 0x3B
MPU6050_ACCEL_XOUT_L = 0x3C
MPU6050_ACCEL_YOUT_H = 0x3D
MPU6050_ACCEL_YOUT_L = 0x3E
MPU6050_ACCEL_ZOUT_H = 0x3F
MPU6050_ACCEL_ZOUT_L = 0x40

#Accelerometer's LSB/g (least significant bits per gravitational force) sensitivity
MPU6050_LSBG = 16384.0

#Set all bits in the PWR_MGMT_1 register to 0
def mpu6050_init(i2c):
    i2c.writeto_mem(MPU6050_ADDR, MPU6050_PWR_MGMT_1, bytes([0])) #needs to be 0 to have device in 'awake' mode change to 1 for 'sleep' mode
    
#define x, y, and z values
def accel_x_value(h, l):
    if not h[0] & 0x80:
        return h[0] << 8 | l[0]
    return -((h[0] ^ 255) << 8) |  (l[0] ^ 255) + 1

def accel_y_value(h, l):
    if not h[0] & 0x80:
        return h[0] << 8 | l[0]
    return -((h[0] ^ 255) << 8) |  (l[0] ^ 255) + 1

def accel_z_value(h, l):
    if not h[0] & 0x80:
        return h[0] << 8 | l[0]
    return -((h[0] ^ 255) << 8) |  (l[0] ^ 255) + 1

#Get Accelerometer values
def get_accel_x(i2c):
    accel_x_h = i2c.readfrom_mem(MPU6050_ADDR, MPU6050_ACCEL_XOUT_H, 1)
    accel_x_l = i2c.readfrom_mem(MPU6050_ADDR, MPU6050_ACCEL_XOUT_L, 1)
    return accel_x_value(accel_x_h, accel_x_l) / MPU6050_LSBG        

def get_accel_y(i2c):
    accel_y_h = i2c.readfrom_mem(MPU6050_ADDR, MPU6050_ACCEL_YOUT_H, 1)
    accel_y_l = i2c.readfrom_mem(MPU6050_ADDR, MPU6050_ACCEL_YOUT_L, 1)
    return accel_y_value(accel_y_h, accel_y_l) / MPU6050_LSBG

def get_accel_z(i2c):
    accel_z_h = i2c.readfrom_mem(MPU6050_ADDR, MPU6050_ACCEL_ZOUT_H, 1)
    accel_z_l = i2c.readfrom_mem(MPU6050_ADDR, MPU6050_ACCEL_ZOUT_L, 1)
    return accel_z_value(accel_z_h, accel_z_l) / MPU6050_LSBG


steps = 0 #step counter
while True:
    if get_accel_x(i2c) > 0.6: #minimum x value for counter
        steps += 1
    elif get_accel_y(i2c) > 3: #minimum y value for counter
        steps += 1
    elif get_accel_z(i2c) > 3: #minimum z value for counter
        steps += 1
    print("\nsteps:", steps)
    print("Accelerometer:\t", get_accel_x(i2c), get_accel_y(i2c), get_accel_z(i2c), "g") 
#Print Accelerometer values (X,Y,Z)
    time.sleep(0.75) #Delay between values in seconds

首先,我更换了硬件,我尝试了不同的MPU6050和新线路(我只有一个微微,所以我不能尝试另一个),但我仍然得到相同的零错误。接下来,我尝试用我找到的一些测试代码测试MPU6050 (从这个网站:https://www.hackster.io/mr-alam/how-to-use-i2c-pins-in-raspberry-pi-pico-i2c-scanner-code-8f489f),它在两个MPU6050s上重新工作,但仍然是零错误。接下来,我更改了引脚和代码,以反映这一点,但仍然是相同的零错误。最后,我在网上寻找帮助,找不到任何有用的东西,除了有人提到“在PWR_MGMT_1寄存器中把睡眠绑得低一点”( for:MPU6050 only outputs 0x00 on I2C with MicroPython),但是我不知道这意味着什么,我没有足够多的提到来评论这个问题,所以我不能问。

EN

回答 1

Stack Overflow用户

发布于 2022-11-22 05:03:07

我添加了这段代码来初始化代码末尾的MPU6050: mpu6050_init(i2c) (就在'steps =0 #step计数器‘位之前)。这是在代码顶部附近调用一个函数来初始化板以脱离睡眠模式,这就是导致设备上的“睡眠模式”的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74518571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档