@@ -125,16 +125,7 @@ def _run_for_degrees(self, degrees, speed):
125
125
pos = self .get_position ()
126
126
newpos = ((degrees * mul )+ pos )/ 360.0
127
127
pos /= 360.0
128
- speed *= 0.05
129
- dur = abs ((newpos - pos ) / speed )
130
- cmd = "port {} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {} 0 1 s4 0.0027777778 0 5 0 .1 3 ; set ramp {} {} {} 0\r " .format (self .port ,
131
- self .port , pos , newpos , dur )
132
- self ._write (cmd )
133
- with self ._hat .rampcond [self .port ]:
134
- self ._hat .rampcond [self .port ].wait ()
135
- if self ._release :
136
- time .sleep (0.2 )
137
- self .coast ()
128
+ self ._run_positional_ramp (pos , newpos , speed )
138
129
self ._runmode = MotorRunmode .NONE
139
130
140
131
def _run_to_position (self , degrees , speed , direction ):
@@ -158,18 +149,28 @@ def _run_to_position(self, degrees, speed, direction):
158
149
newpos = (pos + diff [0 ])/ 360
159
150
else :
160
151
raise DirectionInvalid ("Invalid direction, should be: shortest, clockwise or anticlockwise" )
152
+ # Convert current motor position to decimal rotations from preset position to match newpos units
161
153
pos /= 360.0
154
+ self ._run_positional_ramp (pos , newpos , speed )
155
+ self ._runmode = MotorRunmode .NONE
156
+
157
+ def _run_positional_ramp (self , pos , newpos , speed ):
158
+ """
159
+ :param pos: Current motor position in decimal rotations (from preset position)
160
+ :param newpos: New motor postion in decimal rotations (from preset position)
161
+ :param speed: -100 to 100
162
+ """
163
+ # Collapse speed range to -5 to 5
162
164
speed *= 0.05
163
165
dur = abs ((newpos - pos ) / speed )
164
- cmd = "port {} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {} 0 1 s4 0.0027777778 0 5 0 .1 3 ; set ramp {} {} {} 0\r " .format (self . port ,
165
- self .port , pos , newpos , dur )
166
+ cmd = "port {} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {} 0 1 s4 0.0027777778 0 5 0 .1 3 ; set ramp {} {} {} 0\r " .format (
167
+ self . port , self .port , pos , newpos , dur )
166
168
self ._write (cmd )
167
169
with self ._hat .rampcond [self .port ]:
168
170
self ._hat .rampcond [self .port ].wait ()
169
171
if self ._release :
170
172
time .sleep (0.2 )
171
173
self .coast ()
172
- self ._runmode = MotorRunmode .NONE
173
174
174
175
def run_for_degrees (self , degrees , speed = None , blocking = True ):
175
176
"""Runs motor for N degrees
@@ -194,7 +195,7 @@ def run_for_degrees(self, degrees, speed=None, blocking=True):
194
195
def run_to_position (self , degrees , speed = None , blocking = True , direction = "shortest" ):
195
196
"""Runs motor to position (in degrees)
196
197
197
- :param degrees: Position in degrees
198
+ :param degrees: Position in degrees from -180 to 180
198
199
:param speed: Speed ranging from 0 to 100
199
200
"""
200
201
self ._runmode = MotorRunmode .DEGREES
@@ -264,7 +265,6 @@ def start(self, speed=None):
264
265
self ._currentspeed = speed
265
266
self ._write (cmd )
266
267
267
-
268
268
def stop (self ):
269
269
"""Stops motor"""
270
270
self ._runmode = MotorRunmode .NONE
@@ -274,15 +274,15 @@ def stop(self):
274
274
def get_position (self ):
275
275
"""Gets position of motor with relation to preset position (can be negative or positive)
276
276
277
- :return: Position of motor
277
+ :return: Position of motor in degrees from preset position
278
278
:rtype: int
279
279
"""
280
280
return self .get ()[1 ]
281
281
282
282
def get_aposition (self ):
283
283
"""Gets absolute position of motor
284
284
285
- :return: Absolute position of motor
285
+ :return: Absolute position of motor from -180 to 180
286
286
:rtype: int
287
287
"""
288
288
return self .get ()[2 ]
0 commit comments