mpu6050使用(1)—(理想平面校准)
0 票
mpu6050a.py class accel(): def __init__(self, i2c, addr=0x68): self.iic = i2c self.addr = addr self.iic.start() self.iic.writeto(self.addr, bytearray([107, 0])) self.iic.stop() def get_raw_values(self): self.iic.start() a = self.iic.readfrom_mem(self.addr, 0x3B, 14) self.iic.stop() return a def get_ints(self): b = self.get_raw_values() c = [] for i in b: c.append(i) return c def bytes_toint(self, firstbyte, secondbyte): if not firstbyte & 0x80: return firstbyte << 8 | secondbyte return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1) def get_values(self): raw_ints = self.get_raw_values() vals = {} vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53 vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) return vals # returned in range of Int16 # -32768 to 32767 mean = 16384 def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC import utime while 1: print(self.get_values()) utime.sleep_ms(100)
calibrate.py import mpu6050a import utime from machine import I2C, Pin import gc gc.collect() def calib(accelerometer): cali_mpu = {} i = 0 GyZ = [] GyY = [] GyX = [] AcZ = [] AcY = [] AcX = [] utime.sleep(5) while i <= 500: mpu = accelerometer.get_values() GyZ.append(mpu['GyZ']) GyY.append(mpu['GyY']) GyX.append(mpu['GyX']) AcZ.append(mpu['AcZ']) AcY.append(mpu['AcY']) AcX.append(mpu['AcX']) utime.sleep_ms(10) i += 1 meanGyZ = sum(GyZ) / len(GyZ) meanGyY = sum(GyY) / len(GyY) meanGyX = sum(GyX) / len(GyX) meanAcZ = sum(AcZ) / len(AcZ) meanAcY = sum(AcY) / len(AcY) meanAcX = sum(AcX) / len(AcX) cali_mpu["AcX"] = int(meanAcX) cali_mpu["AcY"] = int(meanAcY) cali_mpu["AcZ"] = int(meanAcZ) - 16384 cali_mpu["GyX"] = int(meanGyX) cali_mpu["GyY"] = int(meanGyY) cali_mpu["GyZ"] = int(meanGyZ) gc.collect() return cali_mpu
boot.py
from machine import I2C, Pin
import mpu6050a
import utime
import gc
import calibrate
pin = Pin(2, Pin.OUT)
pin.value(0)
utime.sleep(10)
pin.value(1)
i2c = I2C(scl=Pin(5), sda=Pin(4))
accelerometer = mpu6050a.accel(i2c)
G = 9.7936 # wuhan_G = 9.7936 acc_z_ori = 16384 mean= sum(list)/len(list)
tem_mpu = calibrate.calib(accelerometer) # get calibrate_veu
gc.collect()
cal_AcX, cal_AcY, cal_AcZ, cal_GyX, cal_GyY, cal_GyZ = tem_mpu["AcX"], tem_mpu["AcY"], tem_mpu["AcZ"], tem_mpu["GyX"], tem_mpu["GyY"], tem_mpu["GyZ"]
# AcX-cal_AcX AcY-cal_AcY AcZ-cal_AcZ GyX-cal_GyX GyY-cal_GyY GyZ-cal_GyZ
def calied_mpu(cal_AcX, cal_AcY, cal_AcZ, cal_GyX, cal_GyY, cal_GyZ):
calied_mpu={}
ori_mpu = accelerometer.get_values() # {'GyZ':2,'GyY':57,'GyX':368,'Tmp':28.78,'AcZ':-1068,'AcY':-66,'AcX':-16026}
calied_mpu["AcX"] = ori_mpu["AcX"]-cal_AcX
calied_mpu["AcY"] = ori_mpu["AcY"]-cal_AcY
calied_mpu["AcZ"] = ori_mpu["AcZ"]-cal_AcZ
calied_mpu["Tmp"] = ori_mpu["Tmp"]-10
calied_mpu["GyX"] = ori_mpu["GyX"]-cal_GyX
calied_mpu["GyY"] = ori_mpu["GyY"]-cal_GyY
calied_mpu["GyZ"] = ori_mpu["GyZ"]-cal_GyZ
return calied_mpu
while 1 :
print(calied_mpu(cal_AcX, cal_AcY, cal_AcZ, cal_GyX, cal_GyY, cal_GyZ))
utime.sleep(0.05)