Skip to content

Commit 001ecb6

Browse files
authored
De-duplicate motor ramp movement code (#134)
1 parent bbc65e1 commit 001ecb6

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

buildhat/motors.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,7 @@ def _run_for_degrees(self, degrees, speed):
125125
pos = self.get_position()
126126
newpos = ((degrees*mul)+pos)/360.0
127127
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)
138129
self._runmode = MotorRunmode.NONE
139130

140131
def _run_to_position(self, degrees, speed, direction):
@@ -158,18 +149,28 @@ def _run_to_position(self, degrees, speed, direction):
158149
newpos = (pos + diff[0])/360
159150
else:
160151
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
161153
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
162164
speed *= 0.05
163165
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)
166168
self._write(cmd)
167169
with self._hat.rampcond[self.port]:
168170
self._hat.rampcond[self.port].wait()
169171
if self._release:
170172
time.sleep(0.2)
171173
self.coast()
172-
self._runmode = MotorRunmode.NONE
173174

174175
def run_for_degrees(self, degrees, speed=None, blocking=True):
175176
"""Runs motor for N degrees
@@ -194,7 +195,7 @@ def run_for_degrees(self, degrees, speed=None, blocking=True):
194195
def run_to_position(self, degrees, speed=None, blocking=True, direction="shortest"):
195196
"""Runs motor to position (in degrees)
196197
197-
:param degrees: Position in degrees
198+
:param degrees: Position in degrees from -180 to 180
198199
:param speed: Speed ranging from 0 to 100
199200
"""
200201
self._runmode = MotorRunmode.DEGREES
@@ -264,7 +265,6 @@ def start(self, speed=None):
264265
self._currentspeed = speed
265266
self._write(cmd)
266267

267-
268268
def stop(self):
269269
"""Stops motor"""
270270
self._runmode = MotorRunmode.NONE
@@ -274,15 +274,15 @@ def stop(self):
274274
def get_position(self):
275275
"""Gets position of motor with relation to preset position (can be negative or positive)
276276
277-
:return: Position of motor
277+
:return: Position of motor in degrees from preset position
278278
:rtype: int
279279
"""
280280
return self.get()[1]
281281

282282
def get_aposition(self):
283283
"""Gets absolute position of motor
284284
285-
:return: Absolute position of motor
285+
:return: Absolute position of motor from -180 to 180
286286
:rtype: int
287287
"""
288288
return self.get()[2]

0 commit comments

Comments
 (0)