【发布时间】:2022-11-22 13:29:45
【问题描述】:
所以我正在使用 raspberry pi pico 和 MPU6050 开发计步器,昨晚我的代码工作正常,所以我拔掉了 pico,然后我在今天早上把 pico 插回去,现在它显示为零。我根据这些连接配置了代码:
VCC 转 3v3
接地到接地
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 和新电线(我只有一个 pico,所以我不能尝试不同的)但我仍然得到相同的零错误。接下来,我尝试使用我找到的一些测试代码(来自本网站:https://www.hackster.io/mr-alam/how-to-use-i2c-pins-in-raspberry-pi-pico-i2c-scanner-code-8f489f)测试 MPU6050,结果它在两个 MPU6050 上都能正常工作,但仍然是相同的零错误。接下来我更改了引脚和代码以反映这一点,但仍然是相同的零错误。最后,我在网上寻求帮助,除了有人提到“将 PWR_MGMT_1 寄存器中的 SLEEP 位低位”(来自:MPU6050 only outputs 0x00 on I2C with MicroPython)之外,找不到任何有用的东西,但是我不知道那是什么意思,而且我没有足够的提到对那个问题发表评论,所以我不能问。
【问题讨论】:
-
你可以用我的MPU6050 driver。它绝对有效。我为 RPi Pico 制作了它。
-
就睡眠位而言,寄存器0x6B的第6位为睡眠位。通过将其设置为 0,您可以退出睡眠模式。我上面发布的驱动程序已经有一个用于所有选项的界面,包括启用/禁用睡眠。
-
抱歉,我对 micropython 和 Thonny 还是有点菜鸟,所以我可能需要一些帮助。我下载并运行了 MPU6050.py 并将其上传到 pico,我知道这有点违背 GitHub 页面上的说明,但我不知道如何冻结代码或如何运行 .mpy 文件Thonny 说它无法识别 .mpy 文件。当我运行 .py 代码时,它只是在 shell 中创建了一个空行,所以我认为我运行的代码不正确,但我不知道如何让它工作。所以错误仍然存在,我仍然得到所有的零
-
我不知道还能为你做什么。我给了你一个绝对有效的驱动程序,我的文档非常详尽。有字面上的复制/粘贴示例和解释段落。
.mpy版本只是.py版本,编译为.mpy。使用哪个并不重要,除非您关心少量的额外空间并且可能会稍微加快速度。如果是这样,请使用“.mpy” -
感谢您的帮助,我在过去几天尝试查找如何访问第 6 位,因为我已经使 0x6B 等于 0,我认为这会让它保持清醒。如上所述,我无法打开界面,所以我确信我做错了什么,再次感谢
标签: python micropython raspberry-pi-pico mpu6050