25
25
26
26
CircuitPython helper library for the TLV493D 3-axis magnetometer
27
27
28
-
29
28
* Author(s): Bryan Siepert
30
29
31
30
Implementation Notes
43
42
https://github.com/adafruit/circuitpython/releases
44
43
45
44
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
46
- * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register
47
45
"""
48
46
49
47
import struct
50
48
import adafruit_bus_device .i2c_device as i2cdevice
51
49
__version__ = "0.0.0-auto.0"
52
50
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_TLV493D.git"
53
- DEFAULT_TLV_ADDRESS = 0x5E
54
-
55
51
56
- class TLV493D :
57
- """IT'S A CLASS"""
52
+ class TLV493D :
53
+ """Driver for the TLV493D 3-axis Magnetometer.
54
+ :param busio.I2C i2c_bus: The I2C bus the TLV493D is connected to.
55
+ """
58
56
59
57
read_masks = {
60
58
"BX1" : (0 , 0xFF , 0 ),
@@ -87,63 +85,35 @@ class TLV493D:
87
85
"RES3" :(3 , 0x1F , 0 )
88
86
}
89
87
90
- def __init__ (self , i2c_interface , i2c_address = DEFAULT_TLV_ADDRESS ):
91
- self .i2c_device = i2cdevice .I2CDevice (i2c_interface , i2c_address )
88
+ def __init__ (self , i2c_interface ):
89
+ self .i2c_device = i2cdevice .I2CDevice (i2c_interface , 0x5E )
92
90
self .read_buffer = bytearray (10 )
93
91
self .write_buffer = bytearray (4 )
94
- self ._setup_write_buffer ()
95
92
96
- # // get all register data from sensor
97
- # tlv493d::readOut(&mInterface);
98
- # // copy factory settings to write registers
99
- # setRegBits(tlv493d::W_RES1, getRegBits(tlv493d::R_RES1)); THREE TIMES?
100
- # // enable parity detection
93
+ # read in data from sensor, including data that must be set on a write
94
+ self ._setup_write_buffer ()
101
95
102
- print ("\n Write buffer:" )
103
- self .print_bytes (self .write_buffer )
104
- self ._set_write_key ('PARITY' , 1 );
105
- print ("\n Write buffer:" )
106
- self .print_bytes (self .write_buffer )
107
- # // config sensor to lowpower mode
108
- # // also contains parity calculation and writeout to sensor
109
- # setAccessMode(TLV493D_DEFAULTMODE);
110
- self ._set_write_key ('PARITY' , 1 );
111
- self ._set_write_key ('LOWPOWER' , 1 );
112
- self ._set_write_key ('LP_PERIOD' , 1 );
113
- print ("\n Write buffer:" )
114
- self .print_bytes (self .write_buffer )
96
+ # setup MASTERCONTROLLEDMODE which takes a measurement for every read
97
+ self ._set_write_key ('PARITY' , 1 )
98
+ self ._set_write_key ('PARITY' , 1 )
99
+ self ._set_write_key ('LOWPOWER' , 1 )
100
+ self ._set_write_key ('LP_PERIOD' , 1 )
115
101
self ._write_i2c ()
116
- print ("wrote output buffer out" )
117
102
118
103
def _read_i2c (self ):
119
104
with self .i2c_device as i2c :
120
105
i2c .readinto (self .read_buffer )
121
106
# self.print_bytes(self.read_buffer)
122
107
123
- @staticmethod
124
- def print_bytes (bites ):
125
- """DOC STRING"""
126
- for byte in bites :
127
- print ("%s (%s)" % (bin (byte ), hex (byte )))
128
-
129
108
def _write_i2c (self ):
130
109
with self .i2c_device as i2c :
131
110
i2c .write (self .write_buffer )
132
111
133
112
def _setup_write_buffer (self ):
134
113
self ._read_i2c ()
135
- print ("Read buffer:" )
136
- self .print_bytes (self .read_buffer )
137
- print ("\n Write buffer:" )
138
- self .print_bytes (self .write_buffer )
139
-
140
114
for key in ['RES1' , 'RES2' , 'RES3' ]:
141
115
write_value = self ._get_read_key (key )
142
116
self ._set_write_key (key , write_value )
143
- print ("Read buffer:" )
144
- self .print_bytes (self .read_buffer )
145
- print ("\n Write buffer:" )
146
- self .print_bytes (self .write_buffer )
147
117
148
118
def _get_read_key (self , key ):
149
119
read_byte_num , read_mask , read_shift = self .read_masks [key ]
@@ -157,42 +127,25 @@ def _set_write_key(self, key, value):
157
127
current_write_byte &= ~ write_mask
158
128
current_write_byte |= value << write_shift
159
129
self .write_buffer [write_byte_num ] = current_write_byte
160
-
161
- # @staticmethod
162
- # def binPrint(number, places=16, end_str=""):
163
- # out = []
164
- # for i in range(places):
165
- # dig_shift = number >> i
166
- # if dig_shift & 1:
167
- # out.append("1")
168
- # else:
169
- # out.append("0")
170
- # out.reverse()
171
- # print("".join(out), end=end_str)
172
130
173
131
@property
174
- def x (self ):
175
- self ._read_i2c ()
132
+ def magnetic (self ):
133
+ """The processed magnetometer sensor values.
134
+ A 3-tuple of X, Y, Z axis values in microteslas that are signed floats.
135
+ """
136
+ self ._read_i2c () # update read registers
176
137
x_top = self ._get_read_key ("BX1" )
177
138
x_bot = ((self ._get_read_key ("BX2" ) << 4 ) & 0xFF )
178
- binval = struct .unpack_from (">h" , bytearray ([x_top , x_bot ]))[0 ]
179
- binval = binval >> 4
180
- return binval * 0.098
181
-
182
- @property
183
- def y (self ):
184
- self ._read_i2c ()
185
139
y_top = self ._get_read_key ("BY1" )
186
140
y_bot = ((self ._get_read_key ("BY2" ) << 4 ) & 0xFF )
187
- binval = struct .unpack_from (">h" , bytearray ([y_top , y_bot ]))[0 ]
188
- binval = binval >> 4
189
- return binval * 0.098
190
-
191
- @property
192
- def z (self ):
193
- self ._read_i2c ()
194
141
z_top = self ._get_read_key ("BZ1" )
195
142
z_bot = ((self ._get_read_key ("BZ2" ) << 4 ) & 0xFF )
196
- binval = struct .unpack_from (">h" , bytearray ([z_top , z_bot ]))[0 ]
143
+
144
+ return (self ._unpack_and_scale (x_top , x_bot ),
145
+ self ._unpack_and_scale (y_top , y_bot ),
146
+ self ._unpack_and_scale (z_top , z_bot ))
147
+
148
+ def _unpack_and_scale (self , top , bottom ):
149
+ binval = struct .unpack_from (">h" , bytearray ([top , bottom ]))[0 ]
197
150
binval = binval >> 4
198
- return binval * 0.098
151
+ return binval * 0.098
0 commit comments