Source code for SEEL.SENSORS.HMC5883L

from numpy import int16
[docs]def connect(route,**args): return HMC5883L(route,**args)
[docs]class HMC5883L(): CONFA=0x00 CONFB=0x01 MODE=0x02 STATUS=0x09 #--------CONFA register bits. 0x00----------- samplesToAverage=0 samplesToAverage_choices=[1,2,4,8] dataOutputRate=6 dataOutputRate_choices=[0.75,1.5,3,7.5,15,30,75] measurementConf=0 #--------CONFB register bits. 0x01----------- gainValue = 7 #least sensitive gain_choices = [8,7,6,5,4,3,2,1] scaling=[1370.,1090.,820.,660.,440.,390.,330.,230.] #--------------Parameters-------------------- #This must be defined in order to let GUIs automatically create menus #for changing various options of this sensor #It's a dictionary of the string representations of functions matched with an array #of options that each one can accept params={ 'init':['Now'], 'setSamplesToAverage':samplesToAverage_choices, 'setDataOutputRate':dataOutputRate_choices, 'setGain':gain_choices, } ADDRESS = 0x1E name = 'Magnetometer' NUMPLOTS=3 PLOTNAMES = ['Bx','By','Bz'] def __init__(self,I2C,**args): self.I2C=I2C self.ADDRESS = args.get('address',self.ADDRESS) self.name = 'Magnetometer' ''' try: print 'switching baud to 400k' self.I2C.configI2C(400e3) except: print 'FAILED TO CHANGE BAUD RATE' ''' self.init('')
[docs] def init(self,dummy_variable_to_circumvent_framework_limitation): # I know how to fix this now. remind me. self.__writeCONFA__() self.__writeCONFB__() self.I2C.writeBulk(self.ADDRESS,[self.MODE,0]) #enable continuous measurement mode
def __writeCONFB__(self): self.I2C.writeBulk(self.ADDRESS,[self.CONFB,self.gainValue<<5]) #set gain def __writeCONFA__(self): self.I2C.writeBulk(self.ADDRESS,[self.CONFA,(self.dataOutputRate<<2)|(self.samplesToAverage<<5)|(self.measurementConf)])
[docs] def setSamplesToAverage(self,num): self.samplesToAverage=self.samplesToAverage_choices.index(num) self.__writeCONFA__()
[docs] def setDataOutputRate(self,rate): self.dataOutputRate=self.dataOutputRate_choices.index(rate) self.__writeCONFA__()
[docs] def setGain(self,gain): self.gainValue = self.gain_choices.index(gain) self.__writeCONFB__()
[docs] def getVals(self,addr,bytes): vals = self.I2C.readBulk(self.ADDRESS,addr,bytes) return vals
[docs] def getRaw(self): vals=self.getVals(0x03,6) if vals: if len(vals)==6: return [int16(vals[a*2]<<8|vals[a*2+1])/self.scaling[self.gainValue] for a in range(3)] else: return False else: return False
if __name__ == "__main__": from SEEL import interface I= interface.connect() I.set_sine1(.5) A = connect(I.I2C) A.setGain(2) t,x,y,z = I.I2C.capture(A.ADDRESS,0x03,6,400,10000,'int') #print (t,x,y,z) from pylab import * plot(t,x) plot(t,y) plot(t,z) show()