初始化提交
This commit is contained in:
91
boards/default_src/micropython/origin/build/lib/mxc6655xa.py
Normal file
91
boards/default_src/micropython/origin/build/lib/mxc6655xa.py
Normal file
@@ -0,0 +1,91 @@
|
||||
"""
|
||||
MXC6655XA
|
||||
|
||||
Micropython library for the MXC6655XA Accelerometer
|
||||
=======================================================
|
||||
#Changed from circuitpython to micropython 20220224
|
||||
#Format unified 20220623
|
||||
|
||||
dahanzimin From the Mixly Team
|
||||
"""
|
||||
import time
|
||||
from math import atan,sqrt,degrees
|
||||
from micropython import const
|
||||
|
||||
MXC6655XA_ADDRESS = const(0x15)
|
||||
MXC6655XA_REG_DATA = const(0x03)
|
||||
MXC6655XA_REG_CTRL = const(0x0D)
|
||||
MXC6655XA_REG_DEVICE_ID = const(0x0E)
|
||||
MXC6655XA_CMD_8G_POWER_ON = const(0x40)
|
||||
MXC6655XA_CMD_4G_POWER_ON = const(0x20)
|
||||
MXC6655XA_CMD_2G_POWER_ON = const(0x00)
|
||||
|
||||
_Range = (
|
||||
MXC6655XA_CMD_2G_POWER_ON, # 2g
|
||||
MXC6655XA_CMD_4G_POWER_ON, # 4g
|
||||
MXC6655XA_CMD_8G_POWER_ON, # 8g
|
||||
)
|
||||
|
||||
_Range_X = (
|
||||
1024, # 2g
|
||||
512, # 4g
|
||||
256, # 8g
|
||||
)
|
||||
|
||||
MXC6655XA_T_ZERO =25
|
||||
MXC6655XA_T_SENSITIVITY =0.586
|
||||
|
||||
class MXC6655XA:
|
||||
|
||||
def __init__(self,i2c_bus,set_range=2, front=False):
|
||||
self._device = i2c_bus
|
||||
self._address = MXC6655XA_ADDRESS
|
||||
self._range = set_range #default 8g range
|
||||
self._front = front
|
||||
|
||||
if self._chip_id() != 0x02:
|
||||
raise AttributeError("Cannot find a MXC6655XA")
|
||||
self._Enable() #star
|
||||
#time.sleep(0.3)
|
||||
|
||||
def _wreg(self, reg, val):
|
||||
'''Write memory address'''
|
||||
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
|
||||
|
||||
def _rreg(self, reg,nbytes=1):
|
||||
'''Read memory address'''
|
||||
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
|
||||
|
||||
def _chip_id(self):
|
||||
return self._rreg(MXC6655XA_REG_DEVICE_ID)
|
||||
|
||||
def _Enable(self):
|
||||
self._wreg(MXC6655XA_REG_CTRL,_Range[self._range])
|
||||
|
||||
def u2s(self,n):
|
||||
return n if n < (1 << 7) else n - (1 << 8)
|
||||
|
||||
@property
|
||||
def getdata(self):
|
||||
data_reg=self._rreg(MXC6655XA_REG_DATA,7)
|
||||
x_acc=float((self.u2s(data_reg[0])<<8|data_reg[1])>>4)/_Range_X[self._range]
|
||||
y_acc=float((self.u2s(data_reg[2])<<8|data_reg[3])>>4)/_Range_X[self._range]
|
||||
z_acc=float((self.u2s(data_reg[4])<<8|data_reg[5])>>4)/_Range_X[self._range]
|
||||
t_acc=float(self.u2s(data_reg[6]))*MXC6655XA_T_SENSITIVITY + MXC6655XA_T_ZERO
|
||||
return (-y_acc,-x_acc,z_acc,round(t_acc,1)) if self._front else (y_acc,-x_acc,z_acc,round(t_acc,1))
|
||||
|
||||
def acceleration(self):
|
||||
return self.getdata[0:3]
|
||||
|
||||
def strength(self):
|
||||
from math import sqrt
|
||||
return sqrt(self.getdata[0]**2+self.getdata[1]**2+self.getdata[2]**2)
|
||||
|
||||
def temperature(self):
|
||||
return self.getdata[3]
|
||||
|
||||
def eulerangles(self,upright=False):
|
||||
x,y,z=self.acceleration()
|
||||
pitch = degrees(atan(z / sqrt(x ** 2 + y ** 2))) if upright else degrees(atan(y / sqrt(x ** 2 + z ** 2)))
|
||||
roll = degrees(atan(x / sqrt(y ** 2 + z ** 2)))
|
||||
return round(pitch,2),round(roll,2)
|
||||
Reference in New Issue
Block a user