MicroPython for ESP8266 驱动MPU6050

MicroPython 官方网站:http://www.micropython.org

之前使用这个做过ESP8266的小板子,因为需要用到MPU6050去做一些动作,但是当时没有找到这个驱动,所以就自己写了个,只是简单的读取原始数据。使用的固件是“Firmware for ESP8266 boards”下面的,可以选择最新的稳定版本。

mpu6050.py

import machine
from machine import I2C,Pin
import time

MPU_ADDR	= const(0X68)

MPU_DEVICE_ID_REG       = 0x75
MPU_PWR_MGMT1_REG		= 0x6B
MPU_PWR_MGMT2_REG		= 0x6C
MPU_SELF_TESTX_REG		= 0x0D
MPU_SELF_TESTY_REG		= 0x0E
MPU_SELF_TESTZ_REG		= 0x0F
MPU_SELF_TESTA_REG		= 0x10
MPU_SAMPLE_RATE_REG		= 0x19
MPU_CFG_REG				= 0x1A
MPU_GYRO_CFG_REG		= 0x1B
MPU_ACCEL_CFG_REG		= 0x1C
MPU_MOTION_DET_REG		= 0x1F
MPU_FIFO_EN_REG			= 0x23
MPU_I2CMST_CTRL_REG		= 0x24
MPU_I2CSLV0_ADDR_REG	= 0x25
MPU_I2CSLV0_REG			= 0x26
MPU_I2CSLV0_CTRL_REG	= 0x27
MPU_I2CSLV1_ADDR_REG	= 0x28
MPU_I2CSLV1_REG			= 0x29
MPU_I2CSLV1_CTRL_REG	= 0x2A
MPU_I2CSLV2_ADDR_REG	= 0x2B
MPU_I2CSLV2_REG			= 0x2C
MPU_I2CSLV2_CTRL_REG	= 0x2D
MPU_I2CSLV3_ADDR_REG	= 0x2E
MPU_I2CSLV3_REG			= 0x2F
MPU_I2CSLV3_CTRL_REG	= 0x30
MPU_I2CSLV4_ADDR_REG	= 0x31
MPU_I2CSLV4_REG			= 0x32
MPU_I2CSLV4_DO_REG		= 0x33
MPU_I2CSLV4_CTRL_REG	= 0x34
MPU_I2CSLV4_DI_REG		= 0x35

MPU_I2CMST_STA_REG		= 0x36
MPU_INTBP_CFG_REG		= 0x37
MPU_INT_EN_REG			= 0x38
MPU_INT_STA_REG			= 0x3A

MPU_ACCEL_XOUTH_REG		= 0x3B
MPU_ACCEL_XOUTL_REG		= 0x3C
MPU_ACCEL_YOUTH_REG		= 0x3D
MPU_ACCEL_YOUTL_REG		= 0x3E
MPU_ACCEL_ZOUTH_REG		= 0x3F
MPU_ACCEL_ZOUTL_REG		= 0x40

MPU_TEMP_OUTH_REG		= 0x41
MPU_TEMP_OUTL_REG		= 0x42

MPU_GYRO_XOUTH_REG		= 0x43
MPU_GYRO_XOUTL_REG		= 0x44
MPU_GYRO_YOUTH_REG		= 0x45
MPU_GYRO_YOUTL_REG		= 0x46
MPU_GYRO_ZOUTH_REG		= 0x47
MPU_GYRO_ZOUTL_REG		= 0x48

MPU_I2CSLV0_DO_REG		= 0x63
MPU_I2CSLV1_DO_REG		= 0x64
MPU_I2CSLV2_DO_REG		= 0x65
MPU_I2CSLV3_DO_REG		= 0x66

MPU_I2CMST_DELAY_REG	= 0x67
MPU_SIGPATH_RST_REG		= 0x68
MPU_MDETECT_CTRL_REG	= 0x69
MPU_USER_CTRL_REG		= 0x6A
MPU_PWR_MGMT1_REG		= 0x6B
MPU_PWR_MGMT2_REG		= 0x6C
MPU_FIFO_CNTH_REG		= 0x72
MPU_FIFO_CNTL_REG		= 0x73
MPU_FIFO_RW_REG			= 0x74
MPU_DEVICE_ID_REG		= 0x75

MPU_ADDR_ADDR			= 0x68

class MPU6050(object):
	def __init__(self,sclpin,sdapin):
		self.i2c=I2C(scl=Pin(sclpin),sda=Pin(sdapin),freq=100000)
	
	def Write_Mpu6050_REG(self,reg,dat):
		buf=bytearray(1)
		buf[0]=dat
		self.i2c.writeto_mem(MPU_ADDR,reg,buf)
	def Read_Mpu6050_REG(self,reg):
		t = self.i2c.readfrom_mem(MPU_ADDR,reg,1)[0]
		return  (t>>4)*10 + (t%16)
	def Read_Mpu6050_Len(self,reg,len,buffer):
		#buffer=bytearray(len)
		self.i2c.readfrom_mem_into(MPU_ADDR,reg,buffer)
	
	#fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
	def MPU_Set_Gyro_Fsr(self,fsr):  
		return  self.Write_Mpu6050_REG(MPU_GYRO_CFG_REG,fsr<<3)
	#fsr:0,±2g;1,±4g;2,±8g;3,±16g
	def MPU_Set_Accel_Fsr(self,fsr): 
		return  self.Write_Mpu6050_REG(MPU_ACCEL_CFG_REG,fsr<<3)
	
	def MPU_Set_LPF(self,lpf):
		if(lpf>=188):
			data=1
		elif(lpf>=98):
			data=2
		elif(lpf>=42):
			data=3
		elif(lpf>=20):
			data=4
		elif(lpf>=10):
			data=5
		else: 
			data=6;
		self.Write_Mpu6050_REG(MPU_CFG_REG,data)
	#rate:4~1000(Hz)
	def MPU_Set_Rate(self,rate):
		if(rate>1000):
			rate=1000
		if(rate<4):
			rate=4;
		data=int(1000/rate-1)
		datas=self.Write_Mpu6050_REG(MPU_SAMPLE_RATE_REG,data)
		return  self.MPU_Set_LPF(rate/2)
	def MPU_Init(self):
		self.Write_Mpu6050_REG(MPU_PWR_MGMT1_REG,0x80)
		time.sleep_ms(100)
		self.Write_Mpu6050_REG(MPU_PWR_MGMT1_REG,0x00)
		self.MPU_Set_Gyro_Fsr(3)
		self.MPU_Set_Accel_Fsr(0)
		self.MPU_Set_Rate(50)
		self.Write_Mpu6050_REG(MPU_INT_EN_REG,0x00)
		self.Write_Mpu6050_REG(MPU_USER_CTRL_REG,0x00)
		self.Write_Mpu6050_REG(MPU_FIFO_EN_REG,0x00)
		self.Write_Mpu6050_REG(MPU_INTBP_CFG_REG,0x80)
		res = self.Read_Mpu6050_REG(MPU_DEVICE_ID_REG)
		if(res == 68):
			self.Write_Mpu6050_REG(MPU_PWR_MGMT1_REG,0x01)
			self.Write_Mpu6050_REG(MPU_PWR_MGMT2_REG,0x00)
			self.MPU_Set_Rate(50)
		else:
			return 1
		return 0
	#Get raw data
	def MPU_Get_Gyroscope(self):
		buf = bytearray(6)
		res = self.Read_Mpu6050_Len(MPU_GYRO_XOUTH_REG,6,buf)
		gx=(buf[0]<<8)|buf[1]
		gy=(buf[2]<<8)|buf[3]
		gz=(buf[4]<<8)|buf[5]
		#print('MPU_Get_Gyroscope: ',gx,gy,gz)
		return gx,gy,gz
	def MPU_Get_Accelerometer(self):
		buf = bytearray(6)
		res = self.Read_Mpu6050_Len(MPU_ACCEL_XOUTH_REG,6,buf)
		ax=(buf[0]<<8)|buf[1]
		ay=(buf[2]<<8)|buf[3]
		az=(buf[4]<<8)|buf[5]
		#print('MPU_Get_Accelerometer: ',ax,ay,az)
		return ax,ay,az

使用的时候很方便,只需要在main.py里面这样写就可以了。

import machine
from mpu6050 import MPU6050
import time
import math

mpu=MPU6050(14,2) #(sclpin,sdapin)
mpu.MPU_Init()
G = 9.8
while 1:
	gyro=mpu.MPU_Get_Gyroscope()
	accel=mpu.MPU_Get_Accelerometer()
	print('MPU_Get_Gyroscope=',gyro[0],gyro[1],gyro[2])
	print('MPU_Get_Accelerometer=',accel[0],accel[1],accel[2])
	print(math.atan(accel[1] / accel[2])/math.pi*180,'  ',accel[2])
	time.sleep_ms(100)

其实就是简单的数据读取,定时打印出来,数据通过串口可以看到值。

至于其他方面的应用,就期待大家的创新啦!

发布了2 篇原创文章 · 获赞 0 · 访问量 58
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览