ME 405 Romi
Loading...
Searching...
No Matches
imu.py
Go to the documentation of this file.
1from pyb import I2C
2from struct import calcsize, unpack_from
3from micropython import const
4
7class IMU:
8
9 DEV_ADDR = 0x28
10
11
14 class reg:
15 EUL_HEADING_MSB = (const(0x1B), b"<B")
16 EUL_HEADING_LSB = (const(0x1A), b"<B")
17 EUL_HEADING = (const(0x1B), b"<h")
18 EUL_DATA_ALL = (const(0x1A), b"hhh")
19
20 OPR_MODE = (const(0x3D), b"<B")
21 CALIB_STAT = (const(0x35), b"<B")
22
23 CALIB_COEFF_START = (const(0x55), b"hhhhhhhhhhh")
24 CALIB_COEFF_STOP = (const(0x81), b"b")
25
26 ACC_OFFSET= (const(0x55), b"<hhh")
27 MAG_OFFSET=(const(0x5B), b"<hhh")
28 GYR_OFFSET=(const(0x61), b"<hhh")
29
30
31
32 EUL_Data_X= (const(0x01A), b"<h")
33 EUL_Data_Y= (const(0x01C), b"<h")
34 EUL_Data_Z= (const(0x01E), b"<h")
35
36
37 GYR_DATA_X = (const(0x014), b"<h")
38 GYR_DATA_Y = (const(0x016), b"<h")
39 GYR_DATA_Z = (const(0x018), b"<h")
40
41
42
43
45 def __init__(self, i2c):
46
47 self._buf = bytearray((0 for n in range(22)))
48 self._i2c = i2c
49 self._buf_8 = bytearray((0))
50
51 return
52
53
58 def _read_reg(self, reg):
59
60 # Determine number of bytes to read
61 length = calcsize(reg[1])
62
63 # Create a memoryview object of the right size
64 buf = memoryview(self._buf)[:length]
65
66 # Read from the I2C bus into the memoryview
67
68 self._i2c.mem_read(buf, self.DEV_ADDR, reg[0])
69
70 # Unpack the bytes into a tuple
71 return unpack_from(reg[1], buf)
72
73
76 def euler(self):
77
78 head, roll, pitch = self._read_reg(IMU.reg.EUL_DATA_ALL)
79
80 return (head/16, roll/16, pitch/16)
81
82
88 data = self._read_reg(self.reg.CALIB_STAT)
89 sys=(data[0]>>6) & 0x03
90 gyro=(data[0]>>4) & 0x03
91 accel=(data[0]>>2) & 0x03
92 mag= data[0] & 0x03
93
94 print ("returning tuple")
95 return (sys,gyro,accel,mag)
96
97
103 self._buf_8[0] = self._read_reg(self.reg.CALIB_STAT)[0]
104 sys=(self._buf_8[0]>>6) & 0x03
105 return sys
106
107
113 data=self._read_reg(self.reg.CALIB_STAT)[0]
114 gyro=(data>>4) & 0x03
115 return gyro
116
117
123 data=self._read_reg(self.reg.CALIB_STAT)[0]
124 accel=(data>>2) & 0x03
125 return accel
126
127
133 data=self._read_reg(self.reg.CALIB_STAT)[0]
134 mag= data & 0x03
135 return mag
136
137
141 (acc_x, acc_y, acc_z)=self._read_reg(self.reg.ACC_OFFSET)
142
143 #a= ( f"{acc_x & 0xFFFF:016b}",f"{acc_y & 0xFFFF:016b}",f"{acc_z & 0xFFFF:016b}")
144
145 return (acc_x, acc_y, acc_z)
146
150 (mag_x, mag_y, mag_z)=self._read_reg(self.reg.MAG_OFFSET)
151 #b= ( f"{mag_x & 0xFFFF:016b}",f"{mag_y & 0xFFFF:016b}",f"{mag_z & 0xFFFF:016b}")
152
153 return (mag_x, mag_y, mag_z)
154
155
159 (gyr_x, gyr_y, gyr_z)=self._read_reg(self.reg.GYR_OFFSET)
160 #c= ( f"{gyr_x & 0xFFFF:016b}",f"{gyr_y & 0xFFFF:016b}",f"{gyr_z & 0xFFFF:016b}")
161
162
163 return (gyr_x, gyr_y, gyr_z)
164
165
169 (acc_x, acc_y, acc_z,mag_x, mag_y, mag_z,gyr_x, gyr_y, gyr_z, acc_rad, mag_rad)=self._read_reg(self.reg.CALIB_COEFF_START)
170 return (acc_x, acc_y, acc_z,mag_x, mag_y, mag_z,gyr_x, gyr_y, gyr_z, acc_rad, mag_rad)
171
172
173 def change_mode(self, mode):
174 #current_reg = self._read_reg(self.reg.OPR_MODE)[0]
175 #current_reg = (current_reg & 0b11110000) | (mode & 0b00001111)
176 #current_reg = mode & 0b00001111
177 self._i2c.mem_write(bytes([mode & 0b00001111]), self.DEV_ADDR, self.reg.OPR_MODE[0])
178 return
179
182 def write_calibration_coeff(self, coef1, coef2, coef3, coef4, coef5, coef6, coef7, coef8, coef9, coef10, coef11):
183 coeffs=[coef1,coef2, coef3, coef4, coef5, coef6, coef7, coef8, coef9, coef10, coef11 ]
184 coeff_bits=b''.join(coeffs)
185
186 self._i2c.mem_write(coeff_bits,self.DEV_ADDR, self.reg.CALIB_COEFF_START[0])
187 return
188
189
192 def get_Euler_x(self):
193 (eul_x,)=self._read_reg(self.reg.EUL_Data_X)
194 # x= eul_x & 0xFFFF
195 # return f"{x:016b}"
196 x=(eul_x/900.00)
197 return x
198
201 def get_Euler_y(self):
202 (eul_y,)=self._read_reg(self.reg.EUL_Data_Y)
203 # x= eul_y & 0xFFFF
204 # return f"{x:016b}"
205 x=(eul_y/900.00)
206 return x
207
210 def get_Euler_z(self):
211 (eul_z,)=self._read_reg(self.reg.EUL_Data_Z)
212 # x= eul_z & 0xFFFF
213 # return f"{x:016b}"
214 x=(eul_z/900.00)
215 return x
216
220 (gyr_z,) = self._read_reg(self.reg.GYR_DATA_Z)
221 x=(gyr_z/900.00)
222 return x
223
227 (gyr_x,) = self._read_reg(self.reg.GYR_DATA_X)
228 x=(gyr_x/900.00)
229 return x
230
234 (gyr_y,) = self._read_reg(self.reg.GYR_DATA_Y)
235 x=(gyr_y/900.00)
236 return x
Register Class.
Definition imu.py:14
Initializes IMU Sensor.
Definition imu.py:7
_i2c
Definition imu.py:48
_buf
Definition imu.py:47
write_calibration_coeff(self, coef1, coef2, coef3, coef4, coef5, coef6, coef7, coef8, coef9, coef10, coef11)
Write Calibration Coefficients.
Definition imu.py:182
change_mode(self, mode)
Change the IMU Operating Mode.
Definition imu.py:173
euler(self)
Read Euler Angles.
Definition imu.py:76
_read_reg(self, reg)
Read Register.
Definition imu.py:58
get_Euler_x(self)
Get Euler x data.
Definition imu.py:192
get_Pitch_Velocity(self)
Get Pitch Angular Velocity data.
Definition imu.py:233
calibration_check_mag(self)
Check Magnetometer Calibration.
Definition imu.py:132
__init__(self, i2c)
Initialization.
Definition imu.py:45
calibration_check(self)
Check IMU Calibration.
Definition imu.py:87
calibration_check_sys(self)
Check System Calibration.
Definition imu.py:102
get_Euler_z(self)
Get Euler Z data.
Definition imu.py:210
get_calibration_coeff_accel(self)
Get the Accelerometer Calibration Coefficients.
Definition imu.py:140
get_Roll_Velocity(self)
Get Roll Angular Velocity data.
Definition imu.py:226
get_calibration_coeff_mag(self)
Get the Magnetometer Calibration Coefficients.
Definition imu.py:149
get_calibration_coeff_gyro(self)
Get the Gyroscope Calibration Coefficients.
Definition imu.py:158
get_Yaw_Velocity(self)
Get Yaw Angular Velocity data.
Definition imu.py:219
calibration_check_gyro(self)
Check Gyroscope Calibration.
Definition imu.py:112
int DEV_ADDR
Definition imu.py:9
_buf_8
Definition imu.py:49
calibration_check_accel(self)
Check Accelerometer Calibration.
Definition imu.py:122
get_calibration_coeff(self)
Get the Accelerometer, Magnetometer and Gyroscope Calibration Coefficients Method.
Definition imu.py:168
get_Euler_y(self)
Get Euler Y data.
Definition imu.py:201