所以我在使用raspberry pi pico和MPU6050的步长计数器上工作,昨晚我的代码工作得很好,所以我拔掉了pico的插头,然后今天早上我去把pico插头插回去,现在它显示的是零。我相应地将代码配置为这些连接:
VCC到3v3
GND到GND
SCL到GP1
SDA到GP0
以下是代码:
#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),但是我不知道这意味着什么,我没有足够多的提到来评论这个问题,所以我不能问。
发布于 2022-11-22 05:03:07
我添加了这段代码来初始化代码末尾的MPU6050: mpu6050_init(i2c) (就在'steps =0 #step计数器‘位之前)。这是在代码顶部附近调用一个函数来初始化板以脱离睡眠模式,这就是导致设备上的“睡眠模式”的原因。
https://stackoverflow.com/questions/74518571
复制相似问题