def spi(self): spi = SPI(1, 0) spi.mode = self.mode spi.cshigh = False spi.msh = 1000000 spi.bpw = 8 spi.lsbfirst = False spi.open(1, 0) # set cycle counts spi.writebytes([0x04, 0x03, 0x20, 0x03, 0x20, 0x03, 0x20]) # 800 cycle counts time.sleep(.01) resolution = 3.3 # nT/LSB; corresponding to 800 cycle counts # set sampling rate, in hertz rate = 32 # display device settings cycleX = spi.xfer2([0x84, 0x00, 0x00]) cycleY = spi.xfer2([0x86, 0x00, 0x00]) cycleZ = spi.xfer2([0x88, 0x00, 0x00]) sensor_settings1 = 'Cycle count [x, y, z]: [' + str( int(hex(cycleX[1]) + hex(cycleX[2])[2:], 16)) + ', ' + str( int(hex(cycleY[1]) + hex(cycleY[2])[2:], 16)) + ', ' + str( int(hex(cycleZ[1]) + hex(cycleZ[2])[2:], 16)) + ']' sensor_settings2 = 'Measurement rate: ' + str(rate) + ' Hz' print(sensor_settings1) print(sensor_settings2) # list of timestamps for each measurement read timestamp = [] # list to store raw data raw = [] # set the total measuring time, in seconds run_time = 30 print('Total measuring time: ' + str(run_time) + ' seconds') t_end = time.time() + run_time # main loop trigger = time.time() while time.time() < t_end: timestamp.append(time.time()) target = (len(raw) + 1) * (1 / rate) + trigger # initiate single measurement spi.writebytes([0x00, 0x70]) condition = True # loop to keep checking until measurement is completed while condition: # if DRDY is high (measurement is completed) if format(spi.xfer2([0xB4, 0x00])[1], '#010b')[2] == '1': # read measurement results raw.append( spi.xfer2([ 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ])) condition = False # if there is time remaining before next measurement if time.time() < target: # wait until appropriate time time.sleep(target - time.time()) else: print('Timing error.') return spi.close() magX = [] magY = [] magZ = [] magn = [] for i in range(len(raw)): results = [] for j in range(0, 9, 3): data = float( self.recast24to32(raw[i][j + 1], raw[i][j + 2], raw[i][j + 3])) * resolution status = float results.append(data) magX.append(results[0]) magY.append(results[1]) magZ.append(results[2]) magn.append(np.sqrt(results[0]**2 + results[1]**2 + results[2]**2)) start_time = timestamp[0] time_diff = [0] for k in range(len(timestamp)): timestamp[k] = timestamp[k] - start_time if k > 0: time_diff.append(timestamp[k] - timestamp[k - 1]) mag_data = np.transpose( np.array([magX, magY, magZ, magn, timestamp, time_diff])) np.savetxt('mag_data_short_32Hz.txt', mag_data, header=sensor_settings1 + ' ; ' + sensor_settings2) print('Successful measurement.') return
def spi(self): spi = SPI(1, 0) spi.mode = self.mode spi.cshigh = False spi.msh = 1000000 spi.bpw = 8 spi.lsbfirst = False spi.open(1, 0) # set cycle counts spi.writebytes([0x04, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8]) # 1000 cycle counts time.sleep(.01) # set continuous measurement mode spi.writebytes([0x01, 0x79]) time.sleep(.01) # set measurement rate spi.writebytes([0x0B, 0x95]) time.sleep(.01) resolution = 2.7 # nT/LSB; corresponding to 800 cycle counts # display device settings cycleX = spi.xfer2([0x84, 0x00, 0x00]) cycleY = spi.xfer2([0x86, 0x00, 0x00]) cycleZ = spi.xfer2([0x88, 0x00, 0x00]) sensor_settings1 = 'Cycle count [x, y, z]: [' + str( int(hex(cycleX[1]) + hex(cycleX[2])[2:], 16)) + ', ' + str( int(hex(cycleY[1]) + hex(cycleY[2])[2:], 16)) + ', ' + str( int(hex(cycleZ[1]) + hex(cycleZ[2])[2:], 16)) + ']' sensor_settings2 = 'Measurement rate: ' + hex( spi.xfer2([0x8B, 0x00])[1]) print(sensor_settings1) print(sensor_settings2) # list of timestamps for each measurement read timestamp = [] # list to check for rate errors: use this list to display an error if there are consecutive measurements where DRDY (status) is high. error_check = [] # list to store the time values corresponding to each error error_log = [] # list to store export data mag_data = [] # set the total measuring time, in seconds run_time = 10 print('Total measuring time: ' + str(run_time) + ' seconds') t_end = time.time() + run_time # Main loop while time.time() < t_end: # if the DRDY (status) pin is high if format(spi.xfer2([0xB4, 0x00])[1], '#010b')[2] == '1': # append appropriate values to lists timestamp.append(time.time()) error_check.append(1) # read measurement results raw = spi.xfer2([ 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]) results = [] for i in range(0, 9, 3): data = float( self.recast24to32(raw[i + 1], raw[i + 2], raw[i + 3])) * resolution status = float results.append(data) magXYZ = results magn = np.sqrt(magXYZ[0]**2 + magXYZ[1]**2 + magXYZ[2]**2) # if mag_data already contains some data if len(mag_data) > 0: # if DRDY was high two times in a row if error_check[-2] == 1: # store and display the error error_log.append(timestamp[-1] - timestamp[0]) print('Error at t = ' + str(error_log[-1]) + ': Consecutive iterations with DRDY high.') # append results to mag_data mag_data = np.vstack( (mag_data, np.array([ magXYZ[0], magXYZ[1], magXYZ[2], magn, timestamp[-1] - timestamp[0], timestamp[-1] - timestamp[-2] ]))) # if mag_data contains nothing else: # create first line in mag_data mag_data = np.array( [magXYZ[0], magXYZ[1], magXYZ[2], magn, 0, 0]) # if the DRDY pin was NOT high else: # store appropriate value in error_check error_check.append(0) spi.close() # if mag_data is empty, display error if len(mag_data) == 0: print('Error: DRDY never went high.') return # save data as txt file np.savetxt('mag_data_short.txt', mag_data, header=sensor_settings1 + ' ; ' + sensor_settings2, comments='') # if there was a rate error -> save an additional txt file containing the corresponding time values if len(error_log) > 0: error_log = np.array(error_log) np.savetxt( 'error_log_short.txt', error_log, header= 'Time values for which DRDY was high for consecutive measurements' ) print('Successful measurement, with DRDY errors.') return print('Successful measurement.') return