3
3
# Adapted from Sebastian Plamauer's MPU9150 driver:
4
4
# https://github.com/micropython-IMU/micropython-mpu9150.git
5
5
# Authors Peter Hinch, Sebastian Plamauer
6
- # V0.1 13th June 2015 Experimental: this code is not yet fully tested
6
+ # V0.2 17th May 2017 Platform independent: utime and machine replace pyb
7
7
8
8
'''
9
9
mpu9250 is a micropython module for the InvenSense MPU9250 sensor.
37
37
# At runtime try to continue returning last good data value. We don't want aircraft
38
38
# crashing. However if the I2C has crashed we're probably stuffed.
39
39
40
- import pyb
40
+ from utime import sleep_ms
41
+ from machine import I2C
41
42
from vector3d import Vector3d
42
43
43
44
44
45
class MPUException (OSError ):
45
46
'''
46
47
Exception for MPU devices
47
48
'''
48
-
49
49
pass
50
50
51
51
@@ -71,23 +71,18 @@ def __init__(self, side_str, device_addr, transposition, scaling):
71
71
72
72
self ._accel = Vector3d (transposition , scaling , self ._accel_callback )
73
73
self ._gyro = Vector3d (transposition , scaling , self ._gyro_callback )
74
- self .buf1 = bytearray ([0 ]* 1 ) # Pre-allocated buffers for reads: allows reads to
75
- self .buf2 = bytearray ([0 ]* 2 ) # be done in interrupt handlers
76
- self .buf3 = bytearray ([0 ]* 3 )
77
- self .buf6 = bytearray ([0 ]* 6 )
78
- self .timeout = 10 # I2C tieout mS
79
-
80
- tim = pyb .millis () # Ensure PSU and device have settled
81
- if tim < 200 :
82
- pyb .delay (200 - tim )
83
- if type (side_str ) is str :
84
- sst = side_str .upper ()
85
- if sst in {'X' , 'Y' }:
86
- self ._mpu_i2c = pyb .I2C (sst , pyb .I2C .MASTER )
87
- else :
88
- raise ValueError ('I2C side must be X or Y' )
89
- elif type (side_str ) is pyb .I2C :
74
+ self .buf1 = bytearray (1 ) # Pre-allocated buffers for reads: allows reads to
75
+ self .buf2 = bytearray (2 ) # be done in interrupt handlers
76
+ self .buf3 = bytearray (3 )
77
+ self .buf6 = bytearray (6 )
78
+
79
+ sleep_ms (200 ) # Ensure PSU and device have settled
80
+ if isinstance (side_str , str ): # Non-pyb targets may use other than X or Y
81
+ self ._mpu_i2c = I2C (side_str )
82
+ elif hasattr (side_str , 'readfrom' ): # Soft or hard I2C: issue #3097
90
83
self ._mpu_i2c = side_str
84
+ else :
85
+ raise ValueError ("Invalid I2C instance" )
91
86
92
87
if device_addr is None :
93
88
devices = set (self ._mpu_i2c .scan ())
@@ -116,14 +111,15 @@ def _read(self, buf, memaddr, addr): # addr = I2C device address, memaddr
116
111
'''
117
112
Read bytes to pre-allocated buffer Caller traps OSError.
118
113
'''
119
- self ._mpu_i2c .mem_read ( buf , addr , memaddr , timeout = self . timeout )
114
+ self ._mpu_i2c .readfrom_mem_into ( addr , memaddr , buf )
120
115
121
116
# write to device
122
117
def _write (self , data , memaddr , addr ):
123
118
'''
124
119
Perform a memory write. Caller should trap OSError.
125
120
'''
126
- self ._mpu_i2c .mem_write (data , addr , memaddr , timeout = self .timeout )
121
+ self .buf1 [0 ] = data
122
+ self ._mpu_i2c .writeto_mem (addr , memaddr , self .buf1 )
127
123
128
124
# wake
129
125
def wake (self ):
0 commit comments