@@ -19,6 +19,7 @@ def __init__(self, port):
19
19
self ._default_speed = 20
20
20
self .plimit (0.7 )
21
21
self .bias (0.3 )
22
+ self .current_freerun_speed = 0
22
23
23
24
def set_default_speed (self , default_speed ):
24
25
"""Sets the default speed of the motor
@@ -34,18 +35,24 @@ def start(self, speed=None):
34
35
35
36
:param speed: Speed ranging from -100 to 100
36
37
"""
38
+ if self .current_freerun_speed == speed :
39
+ # Already running at this speed, do nothing
40
+ return
41
+
37
42
if speed is None :
38
43
speed = self ._default_speed
39
44
else :
40
45
if not (speed >= - 100 and speed <= 100 ):
41
46
raise MotorException ("Invalid Speed" )
47
+ self .current_freerun_speed = speed
42
48
cmd = "port {} ; pwm ; set {}\r " .format (self .port , speed / 100 )
43
49
self ._write (cmd )
44
50
45
51
def stop (self ):
46
52
"""Stops motor"""
47
53
cmd = "port {} ; off\r " .format (self .port )
48
54
self ._write (cmd )
55
+ self .current_freerun_speed = 0
49
56
50
57
def plimit (self , plimit ):
51
58
if not (plimit >= 0 and plimit <= 1 ):
@@ -57,6 +64,13 @@ def bias(self, bias):
57
64
raise MotorException ("bias should be 0 to 1" )
58
65
self ._write ("port {} ; bias {}\r " .format (self .port , bias ))
59
66
67
+
68
+ class MotorRunmode (Enum ):
69
+ NONE = 0
70
+ FREE = 1
71
+ DEGREES = 2
72
+ SECONDS = 3
73
+
60
74
class Motor (Device ):
61
75
"""Motor device
62
76
@@ -67,6 +81,7 @@ class Motor(Device):
67
81
def __init__ (self , port ):
68
82
super ().__init__ (port )
69
83
self .default_speed = 20
84
+ self .current_freerun_speed = 0
70
85
self .mode ([(1 ,0 ),(2 ,0 ),(3 ,0 )])
71
86
self .plimit (0.7 )
72
87
self .bias (0.3 )
@@ -75,6 +90,7 @@ def __init__(self, port):
75
90
self ._cvqueue = Condition ()
76
91
self .when_rotated = None
77
92
self ._oldpos = None
93
+ self .runmode = MotorRunmode .NONE
78
94
79
95
def set_default_speed (self , default_speed ):
80
96
"""Sets the default speed of the motor
@@ -91,6 +107,7 @@ def run_for_rotations(self, rotations, speed=None, blocking=True):
91
107
:param rotations: Number of rotations
92
108
:param speed: Speed ranging from -100 to 100
93
109
"""
110
+ self .runmode = MotorRunmode .DEGREES
94
111
if speed is None :
95
112
self .run_for_degrees (int (rotations * 360 ), self .default_speed , blocking )
96
113
else :
@@ -99,6 +116,7 @@ def run_for_rotations(self, rotations, speed=None, blocking=True):
99
116
self .run_for_degrees (int (rotations * 360 ), speed , blocking )
100
117
101
118
def _run_for_degrees (self , degrees , speed ):
119
+ self .runmode = MotorRunmode .DEGREES
102
120
mul = 1
103
121
if speed < 0 :
104
122
speed = abs (speed )
@@ -116,8 +134,10 @@ def _run_for_degrees(self, degrees, speed):
116
134
if self ._release :
117
135
time .sleep (0.2 )
118
136
self .coast ()
137
+ self .runmode = MotorRunmode .NONE
119
138
120
139
def _run_to_position (self , degrees , speed , direction ):
140
+ self .runmode = MotorRunmode .DEGREES
121
141
data = self .get ()
122
142
pos = data [1 ]
123
143
apos = data [2 ]
@@ -148,6 +168,7 @@ def _run_to_position(self, degrees, speed, direction):
148
168
if self ._release :
149
169
time .sleep (0.2 )
150
170
self .coast ()
171
+ self .runmode = MotorRunmode .NONE
151
172
152
173
def run_for_degrees (self , degrees , speed = None , blocking = True ):
153
174
"""Runs motor for N degrees
@@ -157,6 +178,7 @@ def run_for_degrees(self, degrees, speed=None, blocking=True):
157
178
:param degrees: Number of degrees to rotate
158
179
:param speed: Speed ranging from -100 to 100
159
180
"""
181
+ self .runmode = MotorRunmode .DEGREES
160
182
if speed is None :
161
183
speed = self .default_speed
162
184
if not (speed >= - 100 and speed <= 100 ):
@@ -174,6 +196,7 @@ def run_to_position(self, degrees, speed=None, blocking=True, direction="shortes
174
196
:param degrees: Position in degrees
175
197
:param speed: Speed ranging from 0 to 100
176
198
"""
199
+ self .runmode = MotorRunmode .DEGREES
177
200
if speed is None :
178
201
speed = self .default_speed
179
202
if not (speed >= 0 and speed <= 100 ):
@@ -188,19 +211,22 @@ def run_to_position(self, degrees, speed=None, blocking=True, direction="shortes
188
211
self ._run_to_position (degrees , speed , direction )
189
212
190
213
def _run_for_seconds (self , seconds , speed ):
214
+ self .runmode = MotorRunmode .SECONDS
191
215
cmd = "port {} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {} 0 0 s1 1 0 0.003 0.01 0 100; set pulse {} 0.0 {} 0\r " .format (self .port , self .port , speed , seconds );
192
216
self ._write (cmd );
193
217
with self ._hat .pulsecond [self .port ]:
194
218
self ._hat .pulsecond [self .port ].wait ()
195
219
if self ._release :
196
220
self .coast ()
221
+ self .runmode = MotorRunmode .NONE
197
222
198
223
def run_for_seconds (self , seconds , speed = None , blocking = True ):
199
224
"""Runs motor for N seconds
200
225
201
226
:param seconds: Time in seconds
202
227
:param speed: Speed ranging from -100 to 100
203
228
"""
229
+ self .runmode = MotorRunmode .SECONDS
204
230
if speed is None :
205
231
speed = self .default_speed
206
232
if not (speed >= - 100 and speed <= 100 ):
@@ -217,16 +243,31 @@ def start(self, speed=None):
217
243
218
244
:param speed: Speed ranging from -100 to 100
219
245
"""
246
+ if self .runmode == MotorRunmode .FREE :
247
+ if self .current_freerun_speed == speed :
248
+ # Already running at this speed, do nothing
249
+ return
250
+ elif self .runmode != MotorRunmode .NONE :
251
+ # Motor is running some other mode, wait for it to stop or stop() it yourself
252
+ return
253
+
220
254
if speed is None :
221
255
speed = self .default_speed
222
256
else :
223
257
if not (speed >= - 100 and speed <= 100 ):
224
258
raise MotorException ("Invalid Speed" )
225
- cmd = "port {} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {} 0 0 s1 1 0 0.003 0.01 0 100; set {}\r " .format (self .port , self .port , speed )
259
+ cmd = "port {} ; set {}\r " .format (self .port , speed )
260
+ if self .runmode == MotorRunmode .NONE :
261
+ cmd = "port {} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {} 0 0 s1 1 0 0.003 0.01 0 100; set {}\r " .format (self .port , self .port , speed )
262
+ self .runmode = MotorRunmode .FREE
263
+ self .current_freerun_speed = speed
226
264
self ._write (cmd )
227
265
266
+
228
267
def stop (self ):
229
268
"""Stops motor"""
269
+ self .runmode = MotorRunmode .NONE
270
+ self .current_freerun_speed = 0
230
271
self .coast ()
231
272
232
273
def get_position (self ):
0 commit comments