2017-11-04 21:32:28 +00:00
|
|
|
|
2015-03-20 06:19:59 +00:00
|
|
|
#driver for GY-521 Accelerometer
|
|
|
|
#Translated by Guy Carver from the MPU6050 sample code.
|
|
|
|
|
|
|
|
import pyb
|
|
|
|
|
|
|
|
ADDRESS_LOW = 0x68 #address pin low (GND), default for InvenSense evaluation board
|
|
|
|
ADDRESS_HIGH = 0x69 #address pin high (VCC)
|
|
|
|
|
|
|
|
RA_XG_OFFS_TC = 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
|
|
|
|
RA_YG_OFFS_TC = 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
|
|
|
|
RA_ZG_OFFS_TC = 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
|
|
|
|
RA_X_FINE_GAIN = 0x03 //[7:0] X_FINE_GAIN
|
|
|
|
RA_Y_FINE_GAIN = 0x04 //[7:0] Y_FINE_GAIN
|
|
|
|
RA_Z_FINE_GAIN = 0x05 //[7:0] Z_FINE_GAIN
|
|
|
|
RA_XA_OFFS_H = 0x06 //[15:0] XA_OFFS
|
|
|
|
RA_XA_OFFS_L_TC = 0x07
|
|
|
|
RA_YA_OFFS_H = 0x08 //[15:0] YA_OFFS
|
|
|
|
RA_YA_OFFS_L_TC = 0x09
|
|
|
|
RA_ZA_OFFS_H = 0x0A //[15:0] ZA_OFFS
|
|
|
|
RA_ZA_OFFS_L_TC = 0x0B
|
|
|
|
RA_XG_OFFS_USRH = 0x13 //[15:0] XG_OFFS_USR
|
|
|
|
RA_XG_OFFS_USRL = 0x14
|
|
|
|
RA_YG_OFFS_USRH = 0x15 //[15:0] YG_OFFS_USR
|
|
|
|
RA_YG_OFFS_USRL = 0x16
|
|
|
|
RA_ZG_OFFS_USRH = 0x17 //[15:0] ZG_OFFS_USR
|
|
|
|
RA_ZG_OFFS_USRL = 0x18
|
|
|
|
RA_SMPLRT_DIV = 0x19
|
|
|
|
RA_CONFIG = 0x1A
|
|
|
|
RA_GYRO_CONFIG = 0x1B
|
|
|
|
RA_ACCEL_CONFIG = 0x1C
|
|
|
|
RA_FF_THR = 0x1D
|
|
|
|
RA_FF_DUR = 0x1E
|
|
|
|
RA_MOT_THR = 0x1F
|
|
|
|
RA_MOT_DUR = 0x20
|
|
|
|
RA_ZRMOT_THR = 0x21
|
|
|
|
RA_ZRMOT_DUR = 0x22
|
|
|
|
RA_FIFO_EN = 0x23
|
|
|
|
RA_I2C_MST_CTRL = 0x24
|
|
|
|
RA_I2C_SLV0_ADDR = 0x25
|
|
|
|
RA_I2C_SLV0_REG = 0x26
|
|
|
|
RA_I2C_SLV0_CTRL = 0x27
|
|
|
|
RA_I2C_SLV1_ADDR = 0x28
|
|
|
|
RA_I2C_SLV1_REG = 0x29
|
|
|
|
RA_I2C_SLV1_CTRL = 0x2A
|
|
|
|
RA_I2C_SLV2_ADDR = 0x2B
|
|
|
|
RA_I2C_SLV2_REG = 0x2C
|
|
|
|
RA_I2C_SLV2_CTRL = 0x2D
|
|
|
|
RA_I2C_SLV3_ADDR = 0x2E
|
|
|
|
RA_I2C_SLV3_REG = 0x2F
|
|
|
|
RA_I2C_SLV3_CTRL = 0x30
|
|
|
|
RA_I2C_SLV4_ADDR = 0x31
|
|
|
|
RA_I2C_SLV4_REG = 0x32
|
|
|
|
RA_I2C_SLV4_DO = 0x33
|
|
|
|
RA_I2C_SLV4_CTRL = 0x34
|
|
|
|
RA_I2C_SLV4_DI = 0x35
|
|
|
|
RA_I2C_MST_STATUS = 0x36
|
|
|
|
RA_INT_PIN_CFG = 0x37
|
|
|
|
RA_INT_ENABLE = 0x38
|
|
|
|
RA_DMP_INT_STATUS = 0x39
|
|
|
|
RA_INT_STATUS = 0x3A
|
|
|
|
RA_ACCEL_XOUT_H = 0x3B
|
|
|
|
RA_ACCEL_XOUT_L = 0x3C
|
|
|
|
RA_ACCEL_YOUT_H = 0x3D
|
|
|
|
RA_ACCEL_YOUT_L = 0x3E
|
|
|
|
RA_ACCEL_ZOUT_H = 0x3F
|
|
|
|
RA_ACCEL_ZOUT_L = 0x40
|
|
|
|
RA_TEMP_OUT_H = 0x41
|
|
|
|
RA_TEMP_OUT_L = 0x42
|
|
|
|
RA_GYRO_XOUT_H = 0x43
|
|
|
|
RA_GYRO_XOUT_L = 0x44
|
|
|
|
RA_GYRO_YOUT_H = 0x45
|
|
|
|
RA_GYRO_YOUT_L = 0x46
|
|
|
|
RA_GYRO_ZOUT_H = 0x47
|
|
|
|
RA_GYRO_ZOUT_L = 0x48
|
|
|
|
RA_EXT_SENS_DATA_00 = 0x49
|
|
|
|
RA_EXT_SENS_DATA_01 = 0x4A
|
|
|
|
RA_EXT_SENS_DATA_02 = 0x4B
|
|
|
|
RA_EXT_SENS_DATA_03 = 0x4C
|
|
|
|
RA_EXT_SENS_DATA_04 = 0x4D
|
|
|
|
RA_EXT_SENS_DATA_05 = 0x4E
|
|
|
|
RA_EXT_SENS_DATA_06 = 0x4F
|
|
|
|
RA_EXT_SENS_DATA_07 = 0x50
|
|
|
|
RA_EXT_SENS_DATA_08 = 0x51
|
|
|
|
RA_EXT_SENS_DATA_09 = 0x52
|
|
|
|
RA_EXT_SENS_DATA_10 = 0x53
|
|
|
|
RA_EXT_SENS_DATA_11 = 0x54
|
|
|
|
RA_EXT_SENS_DATA_12 = 0x55
|
|
|
|
RA_EXT_SENS_DATA_13 = 0x56
|
|
|
|
RA_EXT_SENS_DATA_14 = 0x57
|
|
|
|
RA_EXT_SENS_DATA_15 = 0x58
|
|
|
|
RA_EXT_SENS_DATA_16 = 0x59
|
|
|
|
RA_EXT_SENS_DATA_17 = 0x5A
|
|
|
|
RA_EXT_SENS_DATA_18 = 0x5B
|
|
|
|
RA_EXT_SENS_DATA_19 = 0x5C
|
|
|
|
RA_EXT_SENS_DATA_20 = 0x5D
|
|
|
|
RA_EXT_SENS_DATA_21 = 0x5E
|
|
|
|
RA_EXT_SENS_DATA_22 = 0x5F
|
|
|
|
RA_EXT_SENS_DATA_23 = 0x60
|
|
|
|
RA_MOT_DETECT_STATUS = 0x61
|
|
|
|
RA_I2C_SLV0_DO = 0x63
|
|
|
|
RA_I2C_SLV1_DO = 0x64
|
|
|
|
RA_I2C_SLV2_DO = 0x65
|
|
|
|
RA_I2C_SLV3_DO = 0x66
|
|
|
|
RA_I2C_MST_DELAY_CTRL = 0x67
|
|
|
|
RA_SIGNAL_PATH_RESET = 0x68
|
|
|
|
RA_MOT_DETECT_CTRL = 0x69
|
|
|
|
RA_USER_CTRL = 0x6A
|
|
|
|
RA_PWR_MGMT_1 = 0x6B
|
|
|
|
RA_PWR_MGMT_2 = 0x6C
|
|
|
|
RA_BANK_SEL = 0x6D
|
|
|
|
RA_MEM_START_ADDR = 0x6E
|
|
|
|
RA_MEM_R_W = 0x6F
|
|
|
|
RA_DMP_CFG_1 = 0x70
|
|
|
|
RA_DMP_CFG_2 = 0x71
|
|
|
|
RA_FIFO_COUNTH = 0x72
|
|
|
|
RA_FIFO_COUNTL = 0x73
|
|
|
|
RA_FIFO_R_W = 0x74
|
|
|
|
RA_WHO_AM_I = 0x75
|
|
|
|
|
|
|
|
TC_PWR_MODE_BIT = 7
|
|
|
|
TC_OFFSET_BIT = 6
|
|
|
|
TC_OFFSET_LENGTH = 6
|
|
|
|
TC_OTP_BNK_VLD_BIT = 0
|
|
|
|
|
|
|
|
VDDIO_LEVEL_VLOGIC = 0
|
|
|
|
VDDIO_LEVEL_VDD = 1
|
|
|
|
|
|
|
|
CFG_EXT_SYNC_SET_BIT = 5
|
|
|
|
CFG_EXT_SYNC_SET_LENGTH = 3
|
|
|
|
CFG_DLPF_CFG_BIT = 2
|
|
|
|
CFG_DLPF_CFG_LENGTH = 3
|
|
|
|
|
|
|
|
EXT_SYNC_DISABLED = 0x0
|
|
|
|
EXT_SYNC_TEMP_OUT_L = 0x1
|
|
|
|
EXT_SYNC_GYRO_XOUT_L = 0x2
|
|
|
|
EXT_SYNC_GYRO_YOUT_L = 0x3
|
|
|
|
EXT_SYNC_GYRO_ZOUT_L = 0x4
|
|
|
|
EXT_SYNC_ACCEL_XOUT_L = 0x5
|
|
|
|
EXT_SYNC_ACCEL_YOUT_L = 0x6
|
|
|
|
EXT_SYNC_ACCEL_ZOUT_L = 0x7
|
|
|
|
|
|
|
|
DLPF_BW_256 = 0x00
|
|
|
|
DLPF_BW_188 = 0x01
|
|
|
|
DLPF_BW_98 = 0x02
|
|
|
|
DLPF_BW_42 = 0x03
|
|
|
|
DLPF_BW_20 = 0x04
|
|
|
|
DLPF_BW_10 = 0x05
|
|
|
|
DLPF_BW_5 = 0x06
|
|
|
|
|
|
|
|
GCONFIG_FS_SEL_BIT = 4
|
|
|
|
GCONFIG_FS_SEL_LENGTH = 2
|
|
|
|
|
|
|
|
GYRO_FS_250 = 0x00
|
|
|
|
GYRO_FS_500 = 0x01
|
|
|
|
GYRO_FS_1000 = 0x02
|
|
|
|
GYRO_FS_2000 = 0x03
|
|
|
|
|
|
|
|
ACONFIG_XA_ST_BIT = 7
|
|
|
|
ACONFIG_YA_ST_BIT = 6
|
|
|
|
ACONFIG_ZA_ST_BIT = 5
|
|
|
|
ACONFIG_AFS_SEL_BIT = 4
|
|
|
|
ACONFIG_AFS_SEL_LENGTH = 2
|
|
|
|
ACONFIG_ACCEL_HPF_BIT = 2
|
|
|
|
ACONFIG_ACCEL_HPF_LENGTH = 3
|
|
|
|
|
|
|
|
ACCEL_FS_2 = 0x00
|
|
|
|
ACCEL_FS_4 = 0x01
|
|
|
|
ACCEL_FS_8 = 0x02
|
|
|
|
ACCEL_FS_16 = 0x03
|
|
|
|
|
|
|
|
DHPF_RESET = 0x00
|
|
|
|
DHPF_5 = 0x01
|
|
|
|
DHPF_2P5 = 0x02
|
|
|
|
DHPF_1P25 = 0x03
|
|
|
|
DHPF_0P63 = 0x04
|
|
|
|
DHPF_HOLD = 0x07
|
|
|
|
|
|
|
|
TEMP_FIFO_EN_BIT = 7
|
|
|
|
XG_FIFO_EN_BIT = 6
|
|
|
|
YG_FIFO_EN_BIT = 5
|
|
|
|
ZG_FIFO_EN_BIT = 4
|
|
|
|
ACCEL_FIFO_EN_BIT = 3
|
|
|
|
SLV2_FIFO_EN_BIT = 2
|
|
|
|
SLV1_FIFO_EN_BIT = 1
|
|
|
|
SLV0_FIFO_EN_BIT = 0
|
|
|
|
|
|
|
|
MULT_MST_EN_BIT = 7
|
|
|
|
WAIT_FOR_ES_BIT = 6
|
|
|
|
SLV_3_FIFO_EN_BIT = 5
|
|
|
|
I2C_MST_P_NSR_BIT = 4
|
|
|
|
I2C_MST_CLK_BIT = 3
|
|
|
|
I2C_MST_CLK_LENGTH = 4
|
|
|
|
|
|
|
|
CLOCK_DIV_348 = 0x0
|
|
|
|
CLOCK_DIV_333 = 0x1
|
|
|
|
CLOCK_DIV_320 = 0x2
|
|
|
|
CLOCK_DIV_308 = 0x3
|
|
|
|
CLOCK_DIV_296 = 0x4
|
|
|
|
CLOCK_DIV_286 = 0x5
|
|
|
|
CLOCK_DIV_276 = 0x6
|
|
|
|
CLOCK_DIV_267 = 0x7
|
|
|
|
CLOCK_DIV_258 = 0x8
|
|
|
|
CLOCK_DIV_500 = 0x9
|
|
|
|
CLOCK_DIV_471 = 0xA
|
|
|
|
CLOCK_DIV_444 = 0xB
|
|
|
|
CLOCK_DIV_421 = 0xC
|
|
|
|
CLOCK_DIV_400 = 0xD
|
|
|
|
CLOCK_DIV_381 = 0xE
|
|
|
|
CLOCK_DIV_364 = 0xF
|
|
|
|
|
|
|
|
I2C_SLV_RW_BIT = 7
|
|
|
|
I2C_SLV_ADDR_BIT = 6
|
|
|
|
I2C_SLV_ADDR_LENGTH = 7
|
|
|
|
I2C_SLV_EN_BIT = 7
|
|
|
|
I2C_SLV_BYTE_SW_BIT = 6
|
|
|
|
I2C_SLV_REG_DIS_BIT = 5
|
|
|
|
I2C_SLV_GRP_BIT = 4
|
|
|
|
I2C_SLV_LEN_BIT = 3
|
|
|
|
I2C_SLV_LEN_LENGTH = 4
|
|
|
|
|
|
|
|
I2C_SLV4_RW_BIT = 7
|
|
|
|
I2C_SLV4_ADDR_BIT = 6
|
|
|
|
I2C_SLV4_ADDR_LENGTH = 7
|
|
|
|
I2C_SLV4_EN_BIT = 7
|
|
|
|
I2C_SLV4_INT_EN_BIT = 6
|
|
|
|
I2C_SLV4_REG_DIS_BIT = 5
|
|
|
|
I2C_SLV4_MST_DLY_BIT = 4
|
|
|
|
I2C_SLV4_MST_DLY_LENGTH = 5
|
|
|
|
|
|
|
|
MST_PASS_THROUGH_BIT = 7
|
|
|
|
MST_I2C_SLV4_DONE_BIT = 6
|
|
|
|
MST_I2C_LOST_ARB_BIT = 5
|
|
|
|
MST_I2C_SLV4_NACK_BIT = 4
|
|
|
|
MST_I2C_SLV3_NACK_BIT = 3
|
|
|
|
MST_I2C_SLV2_NACK_BIT = 2
|
|
|
|
MST_I2C_SLV1_NACK_BIT = 1
|
|
|
|
MST_I2C_SLV0_NACK_BIT = 0
|
|
|
|
|
|
|
|
INTCFG_INT_LEVEL_BIT = 7
|
|
|
|
INTCFG_INT_OPEN_BIT = 6
|
|
|
|
INTCFG_LATCH_INT_EN_BIT = 5
|
|
|
|
INTCFG_INT_RD_CLEAR_BIT = 4
|
|
|
|
INTCFG_FSYNC_INT_LEVEL_BIT = 3
|
|
|
|
INTCFG_FSYNC_INT_EN_BIT = 2
|
|
|
|
INTCFG_I2C_BYPASS_EN_BIT = 1
|
|
|
|
INTCFG_CLKOUT_EN_BIT = 0
|
|
|
|
|
|
|
|
INTMODE_ACTIVEHIGH = 0x00
|
|
|
|
INTMODE_ACTIVELOW = 0x01
|
|
|
|
|
|
|
|
INTDRV_PUSHPULL = 0x00
|
|
|
|
INTDRV_OPENDRAIN = 0x01
|
|
|
|
|
|
|
|
INTLATCH_50USPULSE = 0x00
|
|
|
|
INTLATCH_WAITCLEAR = 0x01
|
|
|
|
|
|
|
|
INTCLEAR_STATUSREAD = 0x00
|
|
|
|
INTCLEAR_ANYREAD = 0x01
|
|
|
|
|
|
|
|
INTERRUPT_FF_BIT = 7
|
|
|
|
INTERRUPT_MOT_BIT = 6
|
|
|
|
INTERRUPT_ZMOT_BIT = 5
|
|
|
|
INTERRUPT_FIFO_OFLOW_BIT = 4
|
|
|
|
INTERRUPT_I2C_MST_INT_BIT = 3
|
|
|
|
INTERRUPT_PLL_RDY_INT_BIT = 2
|
|
|
|
INTERRUPT_DMP_INT_BIT = 1
|
|
|
|
INTERRUPT_DATA_RDY_BIT = 0
|
|
|
|
|
|
|
|
# TODO: figure out what these actually do
|
|
|
|
# UMPL source code is not very obivous
|
|
|
|
DMPINT_5_BIT = 5
|
|
|
|
DMPINT_4_BIT = 4
|
|
|
|
DMPINT_3_BIT = 3
|
|
|
|
DMPINT_2_BIT = 2
|
|
|
|
DMPINT_1_BIT = 1
|
|
|
|
DMPINT_0_BIT = 0
|
|
|
|
|
|
|
|
MOTION_MOT_XNEG_BIT = 7
|
|
|
|
MOTION_MOT_XPOS_BIT = 6
|
|
|
|
MOTION_MOT_YNEG_BIT = 5
|
|
|
|
MOTION_MOT_YPOS_BIT = 4
|
|
|
|
MOTION_MOT_ZNEG_BIT = 3
|
|
|
|
MOTION_MOT_ZPOS_BIT = 2
|
|
|
|
MOTION_MOT_ZRMOT_BIT = 0
|
|
|
|
|
|
|
|
DELAYCTRL_DELAY_ES_SHADOW_BIT = 7
|
|
|
|
DELAYCTRL_I2C_SLV4_DLY_EN_BIT = 4
|
|
|
|
DELAYCTRL_I2C_SLV3_DLY_EN_BIT = 3
|
|
|
|
DELAYCTRL_I2C_SLV2_DLY_EN_BIT = 2
|
|
|
|
DELAYCTRL_I2C_SLV1_DLY_EN_BIT = 1
|
|
|
|
DELAYCTRL_I2C_SLV0_DLY_EN_BIT = 0
|
|
|
|
|
|
|
|
PATHRESET_GYRO_RESET_BIT = 2
|
|
|
|
PATHRESET_ACCEL_RESET_BIT = 1
|
|
|
|
PATHRESET_TEMP_RESET_BIT = 0
|
|
|
|
|
|
|
|
DETECT_ACCEL_ON_DELAY_BIT = 5
|
|
|
|
DETECT_ACCEL_ON_DELAY_LENGTH = 2
|
|
|
|
DETECT_FF_COUNT_BIT = 3
|
|
|
|
DETECT_FF_COUNT_LENGTH = 2
|
|
|
|
DETECT_MOT_COUNT_BIT = 1
|
|
|
|
DETECT_MOT_COUNT_LENGTH = 2
|
|
|
|
|
|
|
|
DETECT_DECREMENT_RESET = 0x0
|
|
|
|
DETECT_DECREMENT_1 = 0x1
|
|
|
|
DETECT_DECREMENT_2 = 0x2
|
|
|
|
DETECT_DECREMENT_4 = 0x3
|
|
|
|
|
|
|
|
USERCTRL_DMP_EN_BIT = 7
|
|
|
|
USERCTRL_FIFO_EN_BIT = 6
|
|
|
|
USERCTRL_I2C_MST_EN_BIT = 5
|
|
|
|
USERCTRL_I2C_IF_DIS_BIT = 4
|
|
|
|
USERCTRL_DMP_RESET_BIT = 3
|
|
|
|
USERCTRL_FIFO_RESET_BIT = 2
|
|
|
|
USERCTRL_I2C_MST_RESET_BIT = 1
|
|
|
|
USERCTRL_SIG_COND_RESET_BIT = 0
|
|
|
|
|
|
|
|
PWR1_DEVICE_RESET_BIT = 7
|
|
|
|
PWR1_SLEEP_BIT = 6
|
|
|
|
PWR1_CYCLE_BIT = 5
|
|
|
|
PWR1_TEMP_DIS_BIT = 3
|
|
|
|
PWR1_CLKSEL_BIT = 2
|
|
|
|
PWR1_CLKSEL_LENGTH = 3
|
|
|
|
|
|
|
|
CLOCK_INTERNAL = 0x00
|
|
|
|
CLOCK_PLL_XGYRO = 0x01
|
|
|
|
CLOCK_PLL_YGYRO = 0x02
|
|
|
|
CLOCK_PLL_ZGYRO = 0x03
|
|
|
|
CLOCK_PLL_EXT32K = 0x04
|
|
|
|
CLOCK_PLL_EXT19M = 0x05
|
|
|
|
CLOCK_KEEP_RESET = 0x07
|
|
|
|
|
|
|
|
PWR2_LP_WAKE_CTRL_BIT = 7
|
|
|
|
PWR2_LP_WAKE_CTRL_LENGTH = 2
|
|
|
|
PWR2_STBY_XA_BIT = 5
|
|
|
|
PWR2_STBY_YA_BIT = 4
|
|
|
|
PWR2_STBY_ZA_BIT = 3
|
|
|
|
PWR2_STBY_XG_BIT = 2
|
|
|
|
PWR2_STBY_YG_BIT = 1
|
|
|
|
PWR2_STBY_ZG_BIT = 0
|
|
|
|
|
|
|
|
WAKE_FREQ_1P25 = 0x0
|
|
|
|
WAKE_FREQ_2P5 = 0x1
|
|
|
|
WAKE_FREQ_5 = 0x2
|
|
|
|
WAKE_FREQ_10 = 0x3
|
|
|
|
|
|
|
|
BANKSEL_PRFTCH_EN_BIT = 6
|
|
|
|
BANKSEL_CFG_USER_BANK_BIT = 5
|
|
|
|
BANKSEL_MEM_SEL_BIT = 4
|
|
|
|
BANKSEL_MEM_SEL_LENGTH = 5
|
|
|
|
|
|
|
|
WHO_AM_I_BIT = 6
|
|
|
|
WHO_AM_I_LENGTH = 6
|
|
|
|
|
|
|
|
DMP_MEMORY_BANKS = 8
|
|
|
|
DMP_MEMORY_BANK_SIZE = 256
|
|
|
|
DMP_MEMORY_CHUNK_SIZE = 16
|
|
|
|
|
|
|
|
class Accel(object) :
|
|
|
|
"""GY-521 Accelerometer."""
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def color( aR, aG, aB ) :
|
|
|
|
'''Create a 565 rgb TFTColor value'''
|
|
|
|
return TFTColor(aR, aG, aB)
|
|
|
|
|
|
|
|
def __init__( self, aLoc, aAddress = ADDRESS_LOW ) :
|
|
|
|
"""aLoc I2C pin location is either 1 for 'X' or 2 for 'Y'.
|
|
|
|
aAddress is either ADDRESS_LOW or ADDRESS_HIGH."""
|
|
|
|
|
|
|
|
if 1 > aLoc > 2 :
|
|
|
|
raise Exception("aLoc must be 1 or 2.")
|
|
|
|
|
|
|
|
self._data = bytearray(1)
|
|
|
|
self._data6 = bytearray(6)
|
|
|
|
self._data14 = bytearray(14)
|
|
|
|
self._address = aAddress
|
|
|
|
self._i2c = pyb.I2C(aLoc, pyb.I2C.MASTER, baudrate = 400000)
|
|
|
|
|
|
|
|
self.setclocksource(CLOCK_PLL_XGYRO)
|
|
|
|
self.setfullscalegyrorange(GYRO_FS_250)
|
|
|
|
self.setfulscaleaccelrange(ACCEL_FS_2)
|
|
|
|
self.setsleepenabled(False)
|
|
|
|
|
|
|
|
def getrate( self ) :
|
|
|
|
self._readdata(RA_SMPLRT_DIV, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setrate( self, aRate ) :
|
|
|
|
self._writedata(RA_SMPLRT_DIV, aRate)
|
|
|
|
|
|
|
|
def getDLPF( self ) :
|
|
|
|
return self._readbits(RA_CONFIG, CFG_DLPF_CFG_BIT, CFG_DLPF_CFG_LENGTH)
|
|
|
|
|
|
|
|
def setDLPF( self, aMode ) :
|
|
|
|
self._writebits(RA_CONFIG, CFG_DLPF_CFG_BIT, CFG_DLPF_CFG_LENGTH, aMode)
|
|
|
|
|
|
|
|
def setclocksource( self, aSource ) :
|
|
|
|
self._writebits(RA_PWR_MGMT_1, PWR1_CLKSEL_BIT, PWR1_CLKSEL_LENGTH, aSource)
|
|
|
|
|
|
|
|
def getfullscalegyrorange( self ) :
|
|
|
|
return self._readbits(RA_GYRO_CONFIG, GCONFIG_FS_SEL_BIT, GCONFIG_FS_SEL_LENGTH)
|
|
|
|
|
|
|
|
def setfullscalegyrorange( self, aRange ) :
|
|
|
|
self._writebits(RA_GYRO_CONFIG, GCONFIG_FS_SEL_BIT, GCONFIG_FS_SEL_LENGTH, aRange)
|
|
|
|
|
|
|
|
def getfullscaleaccelrange( self ) :
|
|
|
|
self._readbits(RA_ACCEL_CONFIG, ACONFIG_AFS_SEL_BIT, ACONFIG_AFS_SEL_LENGTH)
|
|
|
|
|
|
|
|
def setfullscaleaccelrange( self, aRange ) :
|
|
|
|
self._writebits(RA_ACCEL_CONFIG, ACONFIG_AFS_SEL_BIT, ACONFIG_AFS_SEL_LENGTH, aRange)
|
|
|
|
|
|
|
|
def getsleepenabled( self ) :
|
|
|
|
self._readbits(RA_PWR_MGMT_1, PWR1_SLEEP_BIT, 1)
|
|
|
|
|
|
|
|
def setsleepenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_PWR_MGMT_1, PWR1_SLEEP_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def getfreefalldetectionthreshold( self ) :
|
|
|
|
self._readdata(RA_FF_THR, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setfreefalldetectionthreshold( self, aValue ) :
|
|
|
|
self._writedata(RA_FF_THR, aValue)
|
|
|
|
|
|
|
|
def getfreefalldetectionduration( self ) :
|
|
|
|
self._readdata(RA_FF_DUR, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setfreefalldetectionduration( self, aValue ) :
|
|
|
|
self._writedata(RA_FF_DUR, aValue)
|
|
|
|
|
|
|
|
def getmotiondetectionthreshold( self ) :
|
|
|
|
self._readdata(RA_MOT_THR, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setmotiondetectionthreshold( self, aValue ) :
|
|
|
|
self._writedata(RA_MOT_THR, aValue)
|
|
|
|
|
|
|
|
def getmotiondetectionduration( self ) :
|
|
|
|
self._readdata(RA_MOT_DUR, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setmotiondetectionduration( self, aValue ) :
|
|
|
|
self._writedata(RA_MOT_DUR, aValue)
|
|
|
|
|
|
|
|
def getzeromotiondetectionthreshold( self ) :
|
|
|
|
self._readdata(RA_ZRMOT_THR, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setzeromotiondetectionthreshold( self, aValue ) :
|
|
|
|
self._writedata(RA_ZRMOT_THR, aValue)
|
|
|
|
|
|
|
|
def getzeromotiondetectionduration( self ) :
|
|
|
|
self._readdata(RA_ZRMOT_DUR, self._data)
|
|
|
|
return self._data[0]
|
|
|
|
|
|
|
|
def setzeromotiondetectionduration( self, aValue ) :
|
|
|
|
self._writedata(RA_ZRMOT_DUR, aValue)
|
|
|
|
|
|
|
|
def getFIFOenabled( self ) :
|
|
|
|
return self._readbits(RA_USER_CTRL, USERCTRL_FIFO_EN_BIT, 1)
|
|
|
|
|
|
|
|
def setFIFFOenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_USER_CTRL, USERCTRL_FIFO_EN_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def gettempFIFOenabled( self ) :
|
|
|
|
return self._readbits(RA_FIFO_EN, TEMP_FIFO_EN_BIT, 1)
|
|
|
|
|
|
|
|
def settempFIFFOenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_FIFO_EN, TEMP_FIFO_EN_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def getxgyroFIFOenabled( self ) :
|
|
|
|
return self._readbits(RA_FIFO_EN, XG_FIFO_EN_BIT, 1)
|
|
|
|
|
|
|
|
def setxgyroFIFOenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_FIFO_EN, XG_FIFO_EN_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def getygyroFIFOenabled( self ) :
|
|
|
|
return self._readbits(RA_FIFO_EN, YG_FIFO_EN_BIT, 1)
|
|
|
|
|
|
|
|
def setygyroFIFOenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_FIFO_EN, YG_FIFO_EN_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def getzgyroFIFOenabled( self ) :
|
|
|
|
return self._readbits(RA_FIFO_EN, ZG_FIFO_EN_BIT, 1)
|
|
|
|
|
|
|
|
def setzgyroFIFOenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_FIFO_EN, ZG_FIFO_EN_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def getaccelFIFOenabled( self ) :
|
|
|
|
return self._readbits(RA_FIFO_EN, ACCEL_FIFO_EN_BIT, 1)
|
|
|
|
|
|
|
|
def setaccelFIFOenabled( self, aTF ) :
|
|
|
|
self._writebits(RA_FIFO_EN, ACCEL_FIFO_EN_BIT, 1, aTF)
|
|
|
|
|
|
|
|
def getmasterclockspeed( self ) :
|
|
|
|
return self._readbits(RA_I2C_MST_CTRL, I2C_MST_CLK_BIT, I2C_MST_CLK_LENGTH)
|
|
|
|
|
|
|
|
def setmasterclockspeed( self, aValue ) :
|
|
|
|
self._writebits(RA_I2C_MST_CTRL, I2C_MST_CLK_BIT, I2C_MST_CLK_LENGTH, aValue)
|
|
|
|
|
|
|
|
def getinterruptmode( self ) :
|
|
|
|
return self._readbits(RA_INT_PIN_CFG, INTCFG_INT_LEVEL_BIT, 1)
|
|
|
|
|
|
|
|
def setinterruptmode( self, aValue ) :
|
|
|
|
self._writebits(RA_INT_PIN_CFG, INTCFG_INT_LEVEL_BIT, 1, aValue)
|
|
|
|
|
|
|
|
def getinterruptdrive( self ) :
|
|
|
|
return self._readbits(RA_INT_PIN_CFG, INTCFG_INT_OPEN_BIT, 1)
|
|
|
|
|
|
|
|
def setinterruptdrive( self, aValue ) :
|
|
|
|
self._writebits(RA_INT_PIN_CFG, INTCFG_INT_OPEN_BIT, 1, aValue)
|
|
|
|
|
|
|
|
def getinterruptlatch( self ) :
|
|
|
|
return self._readbits(RA_INT_PIN_CFG, INTCFG_LATCH_INT_EN_BIT, 1)
|
|
|
|
|
|
|
|
def setinterruptlatch( self, aValue ) :
|
|
|
|
self._writebits(RA_INT_PIN_CFG, INTCFG_LATCH_INT_EN_BIT, 1, aValue)
|
|
|
|
|
|
|
|
def getinterruptlatchclear( self ) :
|
|
|
|
return self._readbits(RA_INT_PIN_CFG, INTCFG_INT_RD_CLEAR_BIT, 1)
|
|
|
|
|
|
|
|
def setinterruptlatchclear( self, aValue ) :
|
|
|
|
self._writebits(RA_INT_PIN_CFG, INTCFG_INT_RD_CLEAR_BIT, 1, aValue)
|
|
|
|
|
|
|
|
def getacceltemprot( self ) :
|
|
|
|
self._readdata(RA_ACCEL_XOUT_H, self._data14)
|
|
|
|
return [(self._data14[i] << 8) | self._data14[i + 1] for i in range(0, len(self._data14), 2)]
|
|
|
|
|
|
|
|
def getacceleration( self ) :
|
|
|
|
self._readdata(RA_ACCEL_XOUT_H, self._data6)
|
|
|
|
return [(self._data6[i] << 8) | self._data6[i + 1] for i in range(0, len(self._data6), 2)]
|
|
|
|
|
|
|
|
def getrotation( self ) :
|
|
|
|
self._readdata(RA_GYRO_XOUT_H, self.data6)
|
|
|
|
return [(self._data6[i] << 8) | self._data6[i + 1] for i in range(0, len(self._data6), 2)]
|
|
|
|
|
|
|
|
def reset( self ) :
|
|
|
|
self._writebits(RA_PWR_MGMT_1, PWR1_DEVICE_RESET_BIT, 1, True)
|
|
|
|
|
|
|
|
def _writedata( self, aAddress, aData ) :
|
|
|
|
self._i2c.mem_write(aData, self._address, aAddress)
|
|
|
|
|
|
|
|
def _readdata( self, aAddress, aData ) :
|
|
|
|
self._i2c.mem_read(aData, self._address, aAddress)
|
|
|
|
|
|
|
|
# @micropython.native
|
|
|
|
def _readbits( self, aAddress, aStart, aLen ) :
|
|
|
|
self._readdata(aAddress, self._data)
|
|
|
|
b = (self._data[0] >> (aStart - aLen + 1)) & ((1 << aLen) - 1)
|
|
|
|
|
|
|
|
# @micropython.native
|
|
|
|
def _writebits( self, aAddress, aStart, aLen, aValue ) :
|
|
|
|
self._readdata(aAddress, self._data)
|
|
|
|
mask = ((1 << aLen) - 1) << (aStart - aLen + 1)
|
|
|
|
aValue = (buffer[0] << (aStart - aLen + 1)) & mask #shift data into correct position
|
|
|
|
val &= ~mask
|
|
|
|
self._data[0] |= aValue
|
|
|
|
self._writedata(aAddress, self._data)
|
|
|
|
|