-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMMA7660.py
169 lines (123 loc) · 3.41 KB
/
MMA7660.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# from machine import I2C
class MMA7660_DATA:
def __init__(self):
self.X = None
self.Y = None
self.Z = None
self.TILT = None
self.SRST = None
self.SPCNT = None
self.INTSU = None
self.MODE = None
self.SR = None
self.PDET = None
self.PD = None
# class MMA7660_ACC_DATA:
# def __init__(self,x,y,z):
# self.x = x
# self.y = y
# self.z = z
class MMA7660_LOOKUP(object):
def __init__(self):
self.g = None
self.xyAngle = None
self.zAngle = None
class Accelerometer(object):
MMA7660_ADDR = 0x4c
MMA7660TIMEOUT = 500
MMA7660_X = 0x00
MMA7660_Y = 0x01
MMA7660_Z = 0x02
MMA7660_TILT = 0x03
MMA7660_SRST = 0x04
MMA7660_SPCNT = 0x05
MMA7660_INTSU = 0x06
MMA7660_SHINTX = 0x80
MMA7660_SHINTY = 0x40
MMA7660_SHINTZ = 0x20
MMA7660_GINT = 0x10
MMA7660_ASINT = 0x08
MMA7660_PDINT = 0x04
MMA7660_PLINT = 0x02
MMA7660_FBINT = 0x01
MMA7660_MODE = 0x07
MMA7660_STAND_BY = 0x00
MMA7660_ACTIVE = 0x01
MMA7660_SR = 0x08 # sample rate register
AUTO_SLEEP_120 = 0X00 # 120 sample per second
AUTO_SLEEP_64 = 0X01
AUTO_SLEEP_32 = 0X02
AUTO_SLEEP_16 = 0X03
AUTO_SLEEP_8 = 0X04
AUTO_SLEEP_4 = 0X05
AUTO_SLEEP_2 = 0X06
AUTO_SLEEP_1 = 0X07
MMA7660_PDET = 0x09
MMA7660_PD = 0x0A
accLookup = []
for i in range(64):
s = MMA7660_LOOKUP()
accLookup.insert(i,s)
def __init__(self, i2c, address, interrupts=False):
self.i2c = i2c
self.address = address
i2c.init(I2C.MASTER, baudrate=20000)
initAccelTable()
setMode(MMA7660_STAND_BY)
setSampleRate(AUTO_SLEEP_32)
if interrupts:
write(MMA7660_INTSU, interrupts)
setMode(MMA7660_ACTIVE)
def write(self, register, data):
register = bytearray([register])
data = bytearray([data])
self.i2c.writeto_mem(self.address, register, data)
def read(self, register):
register = bytearray([register])
data = bytearray([data])
buf = ''
i2c.readfrom_mem_into(self.address,register,buf)
return buf
def initAccelTable(self):
val = 0
for i in range(32):
accLookup[i].g = val
val += 0.047
val = -0.047
for i in range(63,31,-1):
accLookup[i].g = val
val -= 0.047
val = 0
valZ = 90
for i in range(22):
accLookup[i].xyAngle = val
accLookup[i].zAngle = valZ
val -= 2.69
valZ += 2.69
val = -2.69
valZ = -87.31
for i in range(63, 42,-1):
accLookup[i].xyAngle = val
accLookup[i].zAngle = valZ
val -= 2.69
valZ += 2.69
for i in range(22,43):
accLookup[i].xyAngle = 255
accLookup[i].zAngle = 255
def setMode(self, mode):
write(MMA7660_MODE,mode)
def setSampleRate(self):
write(MMA7660_SR,rate)
def getXYZ(self, x, y, z):
count = 0
val = [64,64,64]
i2c.readfrom(self.address,1)
i2c.readfrom(self.address,3)
return data = (x,y,z)
def getAcceleration(self):
return True
return False
def getAllData(self):
count = 0
return True
return False