i2c_mpu6050.py K230 I2C接口外接六軸加速度計MPU6050功能演示。
MPU6050模塊介紹
MPU6050 是全球首款整合 3軸MEMS陀螺儀 和 3軸MEMS加速度計 的6軸運動處理傳感器。其核心亮點包括:
- 高精度測量:陀螺儀量程可配置(±250°/s至±2000°/s),加速度計量程(±2g至±16g),16位ADC確保數據精度。
- 內置DMP引擎:數字運動處理器(DMP)可直接輸出融合後的姿態數據(四元數、歐拉角等),減輕主控計算負擔。
- 低功耗設計:支持多種省電模式,加速度計最低功耗僅40μA@10Hz。
- 擴展性強:支持通過I2C接口外接磁力計,實現9軸數據融合。
模塊化優勢:MPU6050芯片封裝極小(4×4×0.9mm),直接焊接難度高,因此通常使用模塊化設計。模塊集成了:
- 電平轉換電路(兼容3.3V/5V系統)
- 濾波電容和穩壓電路
- 清晰的引腳標識(如SCL、SDA、INT等)
|
MPU6050模塊引腳
|
k230引腳
|
功能説明
|
|
VCC
|
3.3V/5V
|
電源正極
|
|
GND
|
GND
|
電源地
|
|
SCL
|
IO11-FPIOA.IIC2_SCL
|
I2C時鐘線
|
|
SDA
|
IO12-FPIOA.IIC2_SDA
|
I2C數據線
|
源代碼如下:
import machine
import time
import ustruct
def test_mpu6050():
fpioa = machine.FPIOA()
fpioa.set_function(11, machine.FPIOA.IIC2_SCL)
fpioa.set_function(12, machine.FPIOA.IIC2_SDA)
i2c = machine.I2C(2, freq=100000)
print("I2C devices:", [hex(x) for x in i2c.scan()])
# Initialize MPU6050
i2c.writeto_mem(0x68, 0x6B, b'\x00') # Wake up
time.sleep_ms(200)
# Verify registers
whoami = i2c.readfrom_mem(0x68, 0x75, 1)
print(f"WHO_AM_I: {hex(whoami[0])}")
# Read loop
while True:
try:
accel = i2c.readfrom_mem(0x68, 0x3B, 6)
ax = ustruct.unpack('>h', accel[0:2])[0]
ay = ustruct.unpack('>h', accel[2:4])[0]
az = ustruct.unpack('>h', accel[4:6])[0]
print(f"Accel: {ax} {ay} {az}")
#time.sleep_ms(10)
except Exception as e:
print(f"Error: {e}")
break
test_mpu6050()
關鍵程序説明:
i2c.writeto_mem(0x68, 0x6B, b'\x00') #向MPU6050的電源管理寄存器(0x6B)寫入0,喚醒設備
whoami = i2c.readfrom_mem(0x68, 0x75, 1)#讀取WHO_AM_I寄存器(0x75)的值 print(f"WHO_AM_I: {hex(whoami[0])}")#正常應該返回0x68,用於確認設備連接正確
accel = i2c.readfrom_mem(0x68, 0x3B, 6)#從加速度數據寄存器(0x3B)連續讀取6個字節,這6個字節包含X、Y、Z三軸的加速度數據(每個軸2字節)
ustruct.unpack('>h', data):將2字節數據轉換為有符號整數 ,分別解析X、Y、Z軸的數據>:大端字節序(高位在前)h:16位有符號整數
輸出數據説明
- 輸出的ax、ay、az是原始數據
- 需要根據傳感器的量程設置進行轉換才能得到實際的加速度值(g或m/s²)
- 默認量程為±2g時,靈敏度為16384 LSB/g
程序完整展示瞭如何初始化MPU6050並連續讀取加速度數據。