From 2ce8c348bd6e0bbe2326286eecbb353fa62c7657 Mon Sep 17 00:00:00 2001 From: GuyCarver Date: Fri, 20 Mar 2015 02:19:59 -0400 Subject: [PATCH] Updated --- Lib/ESP8266.py | 76 ++++++ Lib/GY521.py | 561 ++++++++++++++++++++++++++++++++++++++++++ _SYNCAPP/metadata.xml | Bin 20928 -> 22418 bytes main.py | 28 ++- 4 files changed, 660 insertions(+), 5 deletions(-) create mode 100644 Lib/ESP8266.py create mode 100644 Lib/GY521.py diff --git a/Lib/ESP8266.py b/Lib/ESP8266.py new file mode 100644 index 0000000..02bd041 --- /dev/null +++ b/Lib/ESP8266.py @@ -0,0 +1,76 @@ +from pyb import UART, udelay + +#AT commands for the ESP8266 +#For comprehensive instructions visit http://www.electrodragon.com/w/Wi07c +#AT command strings must end with "\r\n" to trigger command processing. +#Any commands takin ssid or passwords must have id or password surrounded by quotes. +#AT - return "ok" if connection works. +#AT+RST - reset. Will write back a bunch of gibberish then "ready" +#AT+GMR - firmware version. +#AT+CIOBAUD? or AT+CIOBAUD=? - return baud rate, AT+CIOBAUD=xxx - set baud rate. +#AT+CWMODE or CWMODE? 1=Sta, 2=AP, 3=both. AP for devices STA for router. +#AT+CWJAP=ssid,pwd or CWJAP? Join or report AP. +#AT+CWLAP - list APs. +#AT+CWQAP - Quit AP. +#AT+CWSAP=ssid,pwd,chnl,encryption or CWSAP? = Set AP params. +#AT+CWLIF - Check join devices. +#AT+CIPSTATUS - Get connection status. +#AT+CIPSTART +#AT+CIPMODE=mode - 0 no data mode, 1 data mode, CIPMODE? reports mode. +#AT+CIPSEND=lengh - send data. +#AT+CIPCLOSE - Close TCP/UDP connection. +#AT+CIFSR - Get IP addresses +#AT+CIPMUX=mode or CIPMUX? - set/get multiple connection mode. +#AT+CIPSERVER=mode,port - Set as server. +#AT+CIPSTO=timout or CIPSTO? - Set/get server timout. +#AT+IPD - Receive data +#AT+CSYSWDTENABLE or DISABLE - enable/disable restart on error watchdog. + +class WIFI: + """docstring for wifi""" + + def __init__(self, uart, baudrate = 115200): + """ uart = uart #1-6, baudrate must match what is set on the ESP8266. """ + self._uart = UART(uart, baudrate) + + def write( self, aMsg ) : + self._uart.write(aMsg) + res = self._uart.readall() + if res: + print(res.decode("utf-8")) + + def read( self ) : return self._uart.readall().decode("utf-8") + + def _cmd( self, cmd ) : + """ Send AT command, wait a bit then return results. """ + self._uart.write("AT+" + cmd + "\r\n") + udelay(500) + return self.read() + + @property + def IP(self): return self._cmd("CIFSR") + + @property + def networks( self ) : return self._cmd("CWLAP") + + @property + def baudrate(self): return self._cmd("CIOBAUD?") + + @baudrate.setter + def baudrate(self, value): return self._cmd("CIOBAUD=" + str(value)) + + @property + def mode(self): return self._cmd("CWMODE?") + + @mode.setter + def mode(self, value): self._cmd("CWMODE=" + str(value)) + + def connect( self, ssid, password = "" ) : + """ Connect to the given network ssid with the given password """ + constr = "CWJAP=\"" + ssid + "\",\"" + password + "\"" + return self._cmd(constr) + + def disconnect( self ) : return self._cmd("CWQAP") + + def reset( self ) : return self._cmd("RST") + diff --git a/Lib/GY521.py b/Lib/GY521.py new file mode 100644 index 0000000..f6f163c --- /dev/null +++ b/Lib/GY521.py @@ -0,0 +1,561 @@ +#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) + diff --git a/_SYNCAPP/metadata.xml b/_SYNCAPP/metadata.xml index a0fe76f8ac20ceca712c5edc05b89d1d1ef474a4..bc57bb883be4d20171a6cf72e5ff7befc72a735e 100644 GIT binary patch literal 22418 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 XMvxs&m6=1X;`h((fgKO3hyMQp#^*y$ diff --git a/main.py b/main.py index 7b9cade..0914077 100644 --- a/main.py +++ b/main.py @@ -67,9 +67,27 @@ else: # Bluetooth board ---------------------------------------- -from JYMCU import JYMCU +# from JYMCU import JYMCU -u = JYMCU(6, 57600) -u.write("Testing.") -u.readline() -u.setrepl() +# u = JYMCU(6, 57600) +# u.write("Testing.") +# u.readline() +# u.setrepl() + +# from pyb import ExtInt + +# x = 0 +# def cb(line): +# global x +# x += 1 +# print(x) + +# f = ExtInt("Y2", ExtInt.IRQ_RISING, pyb.Pin.PULL_UP, cb) + +from ESP8266 import WIFI + +v = WIFI(6) + +from pyb import Pin +p = Pin("X11", Pin.IN, Pin.PULL_DOWN) +def v(): return p.value()