@@ -27,7 +27,6 @@ def __init__(self, port):
27
27
self ._default_speed = 20
28
28
self ._currentspeed = 0
29
29
self .plimit (0.7 )
30
- self .bias (0.3 )
31
30
32
31
def set_default_speed (self , default_speed ):
33
32
"""Set the default speed of the motor
@@ -79,10 +78,10 @@ def bias(self, bias):
79
78
80
79
:param bias: Value 0 to 1
81
80
:raises MotorError: Occurs if invalid bias value passed
82
- """
83
- if not ( bias >= 0 and bias <= 1 ):
84
- raise MotorError ( "bias should be 0 to 1" )
85
- self . _write ( f"port { self . port } ; bias { bias } \r " )
81
+
82
+ .. deprecated:: 0.6.0
83
+ """ # noqa: RST303
84
+ raise MotorError ( "Bias no longer available " )
86
85
87
86
88
87
class MotorRunmode (Enum ):
@@ -118,14 +117,22 @@ def __init__(self, port):
118
117
self ._combi = "1 0 2 0 3 0"
119
118
self ._noapos = False
120
119
self .plimit (0.7 )
121
- self .bias (0.3 )
120
+ self .pwmparams (0.65 , 0.01 )
121
+ self ._rpm = False
122
122
self ._release = True
123
123
self ._bqueue = deque (maxlen = 5 )
124
124
self ._cvqueue = Condition ()
125
125
self .when_rotated = None
126
126
self ._oldpos = None
127
127
self ._runmode = MotorRunmode .NONE
128
128
129
+ def set_speed_unit_rpm (self , rpm = False ):
130
+ """Set whether to use RPM for speed units or not
131
+
132
+ :param rpm: Boolean to determine whether to use RPM for units
133
+ """
134
+ self ._rpm = rpm
135
+
129
136
def set_default_speed (self , default_speed ):
130
137
"""Set the default speed of the motor
131
138
@@ -200,11 +207,13 @@ def _run_positional_ramp(self, pos, newpos, speed):
200
207
:param newpos: New motor postion in decimal rotations (from preset position)
201
208
:param speed: -100 to 100
202
209
"""
203
- # Collapse speed range to -5 to 5
204
- speed *= 0.05
210
+ if self ._rpm :
211
+ speed = self ._speed_process (speed )
212
+ else :
213
+ speed *= 0.05 # Collapse speed range to -5 to 5
205
214
dur = abs ((newpos - pos ) / speed )
206
215
cmd = (f"port { self .port } ; select 0 ; selrate { self ._interval } ; "
207
- f"pid { self .port } 0 1 s4 0.0027777778 0 5 0 .1 3; "
216
+ f"pid { self .port } 0 1 s4 0.0027777778 0 5 0 .1 3 0.01 ; "
208
217
f"set ramp { pos } { newpos } { dur } 0\r " )
209
218
ftr = Future ()
210
219
self ._hat .rampftr [self .port ].append (ftr )
@@ -258,9 +267,14 @@ def run_to_position(self, degrees, speed=None, blocking=True, direction="shortes
258
267
self ._run_to_position (degrees , speed , direction )
259
268
260
269
def _run_for_seconds (self , seconds , speed ):
270
+ speed = self ._speed_process (speed )
261
271
self ._runmode = MotorRunmode .SECONDS
272
+ if self ._rpm :
273
+ pid = f"pid_diff { self .port } 0 5 s2 0.0027777778 1 0 2.5 0 .4 0.01; "
274
+ else :
275
+ pid = f"pid { self .port } 0 0 s1 1 0 0.003 0.01 0 100 0.01;"
262
276
cmd = (f"port { self .port } ; select 0 ; selrate { self ._interval } ; "
263
- f"pid { self . port } 0 0 s1 1 0 0.003 0.01 0 100; "
277
+ f"{ pid } "
264
278
f"set pulse { speed } 0.0 { seconds } 0\r " )
265
279
ftr = Future ()
266
280
self ._hat .pulseftr [self .port ].append (ftr )
@@ -309,10 +323,15 @@ def start(self, speed=None):
309
323
else :
310
324
if not (speed >= - 100 and speed <= 100 ):
311
325
raise MotorError ("Invalid Speed" )
326
+ speed = self ._speed_process (speed )
312
327
cmd = f"port { self .port } ; set { speed } \r "
313
328
if self ._runmode == MotorRunmode .NONE :
329
+ if self ._rpm :
330
+ pid = f"pid_diff { self .port } 0 5 s2 0.0027777778 1 0 2.5 0 .4 0.01; "
331
+ else :
332
+ pid = f"pid { self .port } 0 0 s1 1 0 0.003 0.01 0 100 0.01; "
314
333
cmd = (f"port { self .port } ; select 0 ; selrate { self ._interval } ; "
315
- f"pid { self . port } 0 0 s1 1 0 0.003 0.01 0 100; "
334
+ f"{ pid } "
316
335
f"set { speed } \r " )
317
336
self ._runmode = MotorRunmode .FREE
318
337
self ._currentspeed = speed
@@ -401,10 +420,23 @@ def bias(self, bias):
401
420
402
421
:param bias: Value 0 to 1
403
422
:raises MotorError: Occurs if invalid bias value passed
423
+
424
+ .. deprecated:: 0.6.0
425
+ """ # noqa: RST303
426
+ raise MotorError ("Bias no longer available" )
427
+
428
+ def pwmparams (self , pwmthresh , minpwm ):
429
+ """PWM thresholds
430
+
431
+ :param pwmthresh: Value 0 to 1, threshold below, will switch from fast to slow, PWM
432
+ :param minpwm: Value 0 to 1, threshold below which it switches off the drive altogether
433
+ :raises MotorError: Occurs if invalid values are passed
404
434
"""
405
- if not (bias >= 0 and bias <= 1 ):
406
- raise MotorError ("bias should be 0 to 1" )
407
- self ._write (f"port { self .port } ; bias { bias } \r " )
435
+ if not (pwmthresh >= 0 and pwmthresh <= 1 ):
436
+ raise MotorError ("pwmthresh should be 0 to 1" )
437
+ if not (minpwm >= 0 and minpwm <= 1 ):
438
+ raise MotorError ("minpwm should be 0 to 1" )
439
+ self ._write (f"port { self .port } ; pwmparams { pwmthresh } { minpwm } \r " )
408
440
409
441
def pwm (self , pwmv ):
410
442
"""PWM motor
@@ -453,6 +485,13 @@ def _wait_for_nonblocking(self):
453
485
"""Wait for nonblocking commands to finish"""
454
486
Device ._instance .motorqueue [self .port ].join ()
455
487
488
+ def _speed_process (self , speed ):
489
+ """Lower speed value"""
490
+ if self ._rpm :
491
+ return speed / 60
492
+ else :
493
+ return speed
494
+
456
495
457
496
class MotorPair :
458
497
"""Pair of motors
@@ -473,6 +512,7 @@ def __init__(self, leftport, rightport):
473
512
self ._rightmotor = Motor (rightport )
474
513
self .default_speed = 20
475
514
self ._release = True
515
+ self ._rpm = False
476
516
477
517
def set_default_speed (self , default_speed ):
478
518
"""Set the default speed of the motor
@@ -481,6 +521,15 @@ def set_default_speed(self, default_speed):
481
521
"""
482
522
self .default_speed = default_speed
483
523
524
+ def set_speed_unit_rpm (self , rpm = False ):
525
+ """Set whether to use RPM for speed units or not
526
+
527
+ :param rpm: Boolean to determine whether to use RPM for units
528
+ """
529
+ self ._rpm = rpm
530
+ self ._leftmotor .set_speed_unit_rpm (rpm )
531
+ self ._rightmotor .set_speed_unit_rpm (rpm )
532
+
484
533
def run_for_rotations (self , rotations , speedl = None , speedr = None ):
485
534
"""Run pair of motors for N rotations
486
535
0 commit comments