2626'''
2727
2828import machine
29+ from time import sleep_ms as sleep
2930
3031# from stackoverflow J.F. Sebastian
3132def _twos_comp (val , bits = 8 ):
@@ -54,7 +55,7 @@ def __init__(self, i2c):
5455 except OSError :
5556 raise OSError ('no BMA2X2 connected' )
5657 self .set_range (16 ) # default range 16g
57- self .set_filter_bw (125 ) # default filter bandwith 125Hz
58+ self .set_filter_bw (128 ) # default filter bandwith 125Hz
5859
5960 def _read_accel (self , addr ):
6061 """return accel data from addr"""
@@ -78,19 +79,45 @@ def set_range(self, accel_range):
7879 return self .get_range ()
7980
8081 def get_range (self ):
81- return self .i2c .readfrom_mem (self .acc_addr , 0x0F , 1 )
82+ return { 3 : 2 , 5 : 4 , 8 : 8 , 12 : 16 }[ self .i2c .readfrom_mem (self .acc_addr , 0x0F , 1 )[ 0 ]]
8283
8384 def set_filter_bw (self , freq ):
84- freqs = {8 :b'\x08 ' , 16 :b'\x09 ' , 32 :b'\x0A ' , 63 :b'\x0B ' , 125 :b'\x0C ' , 250 :b'\x0D ' , 500 :b'\x0E ' , 1000 :b'\x0F ' }
85+ freqs = {8 :b'\x08 ' , 16 :b'\x09 ' , 32 :b'\x0A ' , 64 :b'\x0B ' , 128 :b'\x0C ' , 256 :b'\x0D ' , 512 :b'\x0E ' , 1024 :b'\x0F ' }
8586 try :
8687 freq_byte = freqs [freq ]
8788 except :
88- raise ValueError ('invalid filter bandwith, use 8, 16, 32, 63, 125, 250, 500 or 1000 ' )
89+ raise ValueError ('invalid filter bandwith, use 8, 16, 32, 64, 128, 256, 512 or 1024 ' )
8990 self .i2c .writeto_mem (self .acc_addr , 0x10 , freq_byte )
9091 return self .get_filter_bw ()
9192
9293 def get_filter_bw (self ):
93- return self .i2c .readfrom_mem (self .acc_addr , 0x10 , 1 )
94+ return 2 ** (self .i2c .readfrom_mem (self .acc_addr , 0x10 , 1 )[0 ]- 5 )
95+
96+ def compensation (self , active = None ):
97+ accel_range = self .get_range ()
98+ self .set_range (2 )
99+ self .i2c .writeto_mem (self .acc_addr , 0x37 , b'\x21 ' ) # settings x0y0z1 10Hz
100+ self .i2c .writeto_mem (self .acc_addr , 0x36 , b'\x80 ' ) # reset
101+ if active is None : # trigger fast comp
102+ active = 'compensated'
103+ print (self .i2c .readfrom_mem (self .acc_addr , 0x36 , 1 ))
104+ self .i2c .writeto_mem (self .acc_addr , 0x36 , b'\x20 ' ) # x
105+ sleep (100 )
106+ print (self .i2c .readfrom_mem (self .acc_addr , 0x36 , 1 ))
107+ self .i2c .writeto_mem (self .acc_addr , 0x36 , b'\x40 ' ) # y
108+ sleep (100 )
109+ print (self .i2c .readfrom_mem (self .acc_addr , 0x36 , 1 ))
110+ self .i2c .writeto_mem (self .acc_addr , 0x36 , b'\x60 ' ) # z
111+ sleep (100 )
112+ print (self .i2c .readfrom_mem (self .acc_addr , 0x36 , 1 ))
113+ elif active : # activate slow comp
114+ self .i2c .writeto_mem (self .acc_addr , 0x36 , b'\x07 ' )
115+ elif not active : # deactivate slow comp
116+ self .i2c .writeto_mem (self .acc_addr , 0x36 , b'\x00 ' )
117+ else :
118+ raise TypeError ('pass a boolean or no argument' )
119+ self .set_range (accel_range )
120+ return active
94121
95122 def x (self ):
96123 return self ._read_accel (0x02 )
0 commit comments