Skip to content

Commit cc5abc9

Browse files
authored
Add support for 88008 motor to allow setting speed and position (#165)
1 parent 6dba5bb commit cc5abc9

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

buildhat/motors.py

+24-7
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,14 @@ def __init__(self, port):
108108
super().__init__(port)
109109
self.default_speed = 20
110110
self._currentspeed = 0
111-
self.mode([(1, 0), (2, 0), (3, 0)])
111+
if self._typeid in {38}:
112+
self.mode([(1, 0), (2, 0)])
113+
self._combi = "1 0 2 0"
114+
self._noapos = True
115+
else:
116+
self.mode([(1, 0), (2, 0), (3, 0)])
117+
self._combi = "1 0 2 0 3 0"
118+
self._noapos = False
112119
self.plimit(0.7)
113120
self.bias(0.3)
114121
self._release = True
@@ -160,7 +167,10 @@ def _run_to_position(self, degrees, speed, direction):
160167
self._runmode = MotorRunmode.DEGREES
161168
data = self.get()
162169
pos = data[1]
163-
apos = data[2]
170+
if self._noapos:
171+
apos = pos
172+
else:
173+
apos = data[2]
164174
diff = (degrees - apos + 180) % 360 - 180
165175
newpos = (pos + diff) / 360
166176
v1 = (degrees - apos) % 360
@@ -192,7 +202,7 @@ def _run_positional_ramp(self, pos, newpos, speed):
192202
# Collapse speed range to -5 to 5
193203
speed *= 0.05
194204
dur = abs((newpos - pos) / speed)
195-
cmd = (f"port {self.port}; combi 0 1 0 2 0 3 0 ; select 0 ; pid {self.port} 0 1 s4 0.0027777778 0 5 0 .1 3 ; "
205+
cmd = (f"port {self.port}; combi 0 {self._combi} ; select 0 ; pid {self.port} 0 1 s4 0.0027777778 0 5 0 .1 3 ; "
196206
f"set ramp {pos} {newpos} {dur} 0\r")
197207
self._write(cmd)
198208
with self._hat.rampcond[self.port]:
@@ -248,7 +258,7 @@ def run_to_position(self, degrees, speed=None, blocking=True, direction="shortes
248258

249259
def _run_for_seconds(self, seconds, speed):
250260
self._runmode = MotorRunmode.SECONDS
251-
cmd = (f"port {self.port} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {self.port} 0 0 s1 1 0 0.003 0.01 0 100; "
261+
cmd = (f"port {self.port} ; combi 0 {self._combi} ; select 0 ; pid {self.port} 0 0 s1 1 0 0.003 0.01 0 100; "
252262
f"set pulse {speed} 0.0 {seconds} 0\r")
253263
self._write(cmd)
254264
with self._hat.pulsecond[self.port]:
@@ -298,7 +308,7 @@ def start(self, speed=None):
298308
raise MotorError("Invalid Speed")
299309
cmd = f"port {self.port} ; set {speed}\r"
300310
if self._runmode == MotorRunmode.NONE:
301-
cmd = (f"port {self.port} ; combi 0 1 0 2 0 3 0 ; select 0 ; pid {self.port} 0 0 s1 1 0 0.003 0.01 0 100; "
311+
cmd = (f"port {self.port} ; combi 0 {self._combi} ; select 0 ; pid {self.port} 0 0 s1 1 0 0.003 0.01 0 100; "
302312
f"set {speed}\r")
303313
self._runmode = MotorRunmode.FREE
304314
self._currentspeed = speed
@@ -324,7 +334,10 @@ def get_aposition(self):
324334
:return: Absolute position of motor from -180 to 180
325335
:rtype: int
326336
"""
327-
return self.get()[2]
337+
if self._noapos:
338+
raise MotorError("No absolute position with this motor")
339+
else:
340+
return self.get()[2]
328341

329342
def get_speed(self):
330343
"""Get speed of motor
@@ -346,7 +359,11 @@ def when_rotated(self):
346359
return self._when_rotated
347360

348361
def _intermediate(self, data):
349-
speed, pos, apos = data
362+
if self._noapos:
363+
speed, pos = data
364+
apos = None
365+
else:
366+
speed, pos, apos = data
350367
if self._oldpos is None:
351368
self._oldpos = pos
352369
return

0 commit comments

Comments
 (0)