Files
mixly3/boards/default_src/micropython/origin/build/lib/qmi8658.py
2024-07-19 10:16:00 +08:00

104 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
QMI8658
Micropython library for the QMI8658(Accelerometer+Gyroscope)
=======================================================
#Preliminary composition 20220716
dahanzimin From the Mixly Team
"""
import time
from micropython import const
QMI8658_REG_DEVICE_ID = const(0x00)
QMI8658_REG_Ctrl1 = const(0x02) #Serial Interface and Sensor Enable
QMI8658_REG_Ctrl2 = const(0x03) #Accelerometer Settings
QMI8658_REG_Ctrl3 = const(0x04) #Gyroscope Settings
QMI8658_REG_Ctrl5 = const(0x06) #Sensor Data Processing Settings
QMI8658_REG_Ctrl7 = const(0x08) #Sensor Data Processing Settings
QMI8658_REG_Ctrl9 = const(0x0A) #Host Commands
QMI8658_REG_StatusInt = const(0x2D) #Sensor Data Available and Lock Register Address
QMI8658_REG_DATA = const(0x33)
Qmi8658AccRange_2g = 0 #/* +/- 2g range */
Qmi8658AccRange_4g = 1 #/* +/- 4g range */
Qmi8658AccRange_8g = 2 #/* +/- 8g range */
Qmi8658AccRange_16g = 3 #/* +/- 16g range */
Qmi8658GyrRange_16dps = 0 #/* +-16 degrees per second. */
Qmi8658GyrRange_32dps = 1 #/* +-32 degrees per second. */
Qmi8658GyrRange_64dps = 2 #/* +-64 degrees per second. */
Qmi8658GyrRange_128dps = 3 #/* +-128 degrees per second. */
Qmi8658GyrRange_256dps = 4 #/* +-256 degrees per second. */
Qmi8658GyrRange_512dps = 5 #/* +-512 degrees per second. */
Qmi8658GyrRange_1024dps = 6 #/* +-1024 degrees per second. */
Qmi8658GyrRange_2048dps = 7 #/* +-2048 degrees per second. */
Qmi8658Acc_Gyr_Odr_8000Hz = 0x00 #/* High resolution 8000Hz output rate. */
Qmi8658Acc_Gyr_Odr_4000Hz = 0x01 #/* High resolution 4000Hz output rate. */
Qmi8658Acc_Gyr_Odr_2000Hz = 0x02 #/* High resolution 2000Hz output rate. */
Qmi8658Acc_Gyr_Odr_1000Hz = 0x03 #/* High resolution 1000Hz output rate. */
Qmi8658Acc_Gyr_Odr_500Hz = 0x04 #/* High resolution 500Hz output rate. */
Qmi8658Acc_Gyr_Odr_250Hz = 0x05 #/* High resolution 250Hz output rate. */
Qmi8658Acc_Gyr_Odr_125Hz = 0x06 #/* High resolution 125Hz output rate. */
Qmi8658Acc_Gyr_Odr_62_5Hz = 0x07 #/* High resolution 62.5Hz output rate. */
Qmi8658Acc_Gyr_Odr_31_25Hz= 0x08 #/* High resolution 31.25Hz output rate. */
class QMI8658:
def __init__(self, i2c_bus,addr=0x6B,AccRange=Qmi8658AccRange_8g,GyrRange=Qmi8658GyrRange_2048dps,Acc_Gyr_Odr=Qmi8658Acc_Gyr_Odr_500Hz):
self._device = i2c_bus
self._address = addr
if self._chip_id() != 0x05:
raise AttributeError("Cannot find a QMI8658")
self._wreg(QMI8658_REG_Ctrl9,0xA2) #做selftest提高精度
time.sleep(1)
self._wreg(QMI8658_REG_Ctrl1,0x60)
self._wreg(QMI8658_REG_Ctrl7,0x03) #启动
self._wreg(QMI8658_REG_Ctrl2,(AccRange<< 4)|Acc_Gyr_Odr) #ACC-500HZ/8G
self._wreg(QMI8658_REG_Ctrl3,(GyrRange<< 4)|Acc_Gyr_Odr) #Gyr-500HZ/2048dps
self._wreg(QMI8658_REG_Ctrl5,0x75) #Gyr-14%,ACC-5.32%
self.gyr_lsb_div= 2**(11-GyrRange)
self.acc_lsb_div= 1<<(14-AccRange)
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(QMI8658_REG_DEVICE_ID)
def status(self):
return self._rreg(QMI8658_REG_StatusInt)
def u2s(self,n):
return n if n < (1 << 15) else n - (1 << 16)
def getdata(self):
while self.status() == 0x81:
time.sleep(0.001)
_buffer=self._rreg(QMI8658_REG_DATA,14)
tmp= float(self.u2s(_buffer[1]<<8|_buffer[0]))/256.0
acc_x=float(self.u2s(_buffer[3]<<8|_buffer[2]))/self.acc_lsb_div
acc_y=float(self.u2s(_buffer[5]<<8|_buffer[4]))/self.acc_lsb_div
acc_z=float(self.u2s(_buffer[7]<<8|_buffer[6]))/self.acc_lsb_div
gyr_x=float(self.u2s(_buffer[9]<<8|_buffer[8]))/self.gyr_lsb_div
gyr_y=float(self.u2s(_buffer[11]<<8|_buffer[10]))/self.gyr_lsb_div
gyr_z=float(self.u2s(_buffer[13]<<8|_buffer[12]))/self.gyr_lsb_div
return (acc_x,acc_y,acc_z),(gyr_x,gyr_y,gyr_z),round(tmp,2)
def accelerometer(self):
return self.getdata()[0]
def gyroscope(self):
return self.getdata()[1]
def temperature(self):
return self.getdata()[2]