Skip to content

Commit b2900af

Browse files
committed
wip #64
1 parent 87579f9 commit b2900af

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

coderbot.py

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,6 @@ def _dc_motor(self, speed_left=100, speed_right=100, elapse=-1, steps_left=-1, s
162162
self._encoder_motor_stopping_right = False
163163
self._encoder_motor_stopped_left = False
164164
self._encoder_motor_stopped_right = False
165-
self._motor_current_power_left = speed_left
166-
self._motor_current_power_right = speed_right
167165
if steps_left >= 0 or steps_right >= 0:
168166
self._encoder_sem.acquire()
169167

@@ -260,6 +258,7 @@ def __init__(self, parent, _pigpio, pin_enable, pin_forward, pin_backward, pin_e
260258
self._pin_duty = 0
261259
self._pin_reverse = 0
262260
self._power = 0.0
261+
self._power_actual = 0.0
263262
self._encoder_dist = 0
264263
self._encoder_speed = 0.0
265264
self._encoder_last_tick = 0
@@ -269,61 +268,72 @@ def __init__(self, parent, _pigpio, pin_enable, pin_forward, pin_backward, pin_e
269268
self._encoder_k_v_1 = 80
270269
self._motor_stopping = False
271270
self._motor_running = False
271+
self._motor_stop_fast = True
272272
self._pigpio.set_mode(self._pin_encoder, pigpio.INPUT)
273273
self._cb = self._pigpio.callback(self._pin_encoder, pigpio.RISING_EDGE, self._cb_encoder)
274+
self._motor_lock = threading.RLock()
274275

275276
def exit(self):
276277
self._cb.cancel()
277278

278279
def _cb_encoder(self, gpio, level, tick):
280+
self._motor_lock.acquire()
279281
self._encoder_dist += 1
280282
delta_ticks = tick - self._encoder_last_tick if tick > self._encoder_last_tick else tick - self._encoder_last_tick + 4294967295
281283
self._encoder_last_tick = tick
282284
self._encoder_speed = 1000000.0 / delta_ticks #convert speed in steps per second
283-
#print "speed: " + str(self._encoder_speed)
284-
if self._encoder_dist_target >= 0:
285-
delta_s = max(min(self._encoder_speed / self._encoder_k_s_1, 70),0) #delta_s is the delta (in steps)before the target to reverse the motor in order to arrive at target
285+
#print "pin: " + str(self._pin_forward) + " dist: " + str(self._encoder_dist) + " target: " + str(self._encoder_dist_target)
286+
if self._encoder_dist_target >= 0 and self._motor_stop_fast:
287+
delta_s = max(min(self._encoder_speed / self._encoder_k_s_1, 100),0) #delta_s is the delta (in steps)before the target to reverse the motor in order to arrive at target
286288
#print "pin: " + str(self._pin_forward) + " dist: " + str(self._encoder_dist) + " target: " + str(self._encoder_dist_target) + " delta_s: " + str(delta_s)
287289
if (self._encoder_dist >= self._encoder_dist_target - delta_s and
288290
not self._motor_stopping and self._motor_running):
289291
self._motor_stopping = True
290292
self._pigpio.write(self._pin_duty, 0)
291293
self._pigpio.set_PWM_dutycycle(self._pin_reverse, self._power)
292-
#print "stopping"
293294
elif (self._motor_running and
294295
((self._motor_stopping and
295296
self._encoder_speed < self._encoder_k_v_1) or
296297
(self._motor_stopping and
297298
self._encoder_dist >= self._encoder_dist_target))):
298299
self.stop()
299-
self._parent._check_complete()
300-
#print "stopped - pin: " + str(self._pin_forward) + " dist: " + str(self._encoder_dist) + " target: " + str(self._encoder_dist_target)
301300
logging.info( "dist: " + str(self._encoder_dist) + " speed: " + str(self._encoder_speed))
302301
else:
303302
self._parent._cb_encoder(self, gpio, level, tick)
303+
if self._encoder_dist_target >= 0 and not self._motor_stop_fast:
304+
if self._encoder_dist >= self._encoder_dist_target:
305+
self.stop()
306+
self._motor_lock.release()
307+
if not self._motor_running:
308+
self._parent._check_complete()
304309

305310
def control(self, power=100.0, elapse=-1, speed=100.0, steps=-1):
311+
self._motor_lock.acquire()
306312
self._direction = speed > 0
307313
self._encoder_dist_target = steps
308314
self._motor_stopping = False
309315
self._motor_running = True
310316
self._encoder_dist = 0
311317
self._encoder_speed_target = abs(speed)
312318
self._power = abs(power) #TODO: initial power must be a function of desired speed
319+
self._power_actual = abs(power) #TODO: initial power must be a function of desired speed
313320
self._pin_duty = self._pin_forward if self._direction else self._pin_backward
314321
self._pin_reverse = self._pin_backward if self._direction else self._pin_forward
315322
self._pigpio.write(self._pin_reverse, 0)
316323
self._pigpio.set_PWM_dutycycle(self._pin_duty, self._power)
317324
self._pigpio.write(self._pin_enable, True)
325+
self._motor_lock.release()
318326
if elapse > 0:
319327
time.sleep(elapse)
320328
self.stop()
321329

322330
def stop(self):
331+
self._motor_lock.acquire()
323332
self._motor_stopping = False
324333
self._motor_running = False
325334
self._pigpio.write(self._pin_forward, 0)
326335
self._pigpio.write(self._pin_backward, 0)
336+
self._motor_lock.release()
327337

328338
def distance(self):
329339
return self._encoder_dist
@@ -338,16 +348,16 @@ def running(self):
338348
return self._motor_running
339349

340350
def adjust_power(self, power_delta):
341-
power = min(max(self._power + power_delta, 0), 100)
342-
self._pigpio.set_PWM_dutycycle(self._pin_duty, power)
351+
self._power_actual = min(max(self._power + power_delta, 0), 100)
352+
self._pigpio.set_PWM_dutycycle(self._pin_duty, self._power_actual)
343353

344354
class TwinMotorsEncoder(object):
345355
def __init__(self, pigpio, pin_enable, pin_forward_left, pin_backward_left, pin_encoder_left, pin_forward_right, pin_backward_right, pin_encoder_right):
346-
self._motor_left = CoderBot.MotorEncoder(self, pigpio, pin_enable, pin_forward_left, pin_backward_left, pin_encoder_left)
347-
self._motor_right = CoderBot.MotorEncoder(self, pigpio, pin_enable, pin_forward_right, pin_backward_right, pin_encoder_right)
348356
self._straight = False
349357
self._running = False
350358
self._encoder_sem = threading.Condition()
359+
self._motor_left = CoderBot.MotorEncoder(self, pigpio, pin_enable, pin_forward_left, pin_backward_left, pin_encoder_left)
360+
self._motor_right = CoderBot.MotorEncoder(self, pigpio, pin_enable, pin_forward_right, pin_backward_right, pin_encoder_right)
351361

352362
def exit(self):
353363
self._motor_left.exit()
@@ -377,6 +387,12 @@ def stop(self):
377387
self._motor_right.stop()
378388
self._running = False
379389

390+
def distance(self):
391+
return (self._motor_left.distance() + self._motor_right.distance()) / 2
392+
393+
def speed(self):
394+
return (self._motor_left.speed() + self._motor_right.speed()) / 2
395+
380396
def _cb_encoder(self, motor, gpio, level, tick):
381397
if (self._straight and self._running and not self._motor_left.stopping() and not self._motor_right.stopping() and
382398
abs(self._motor_left.distance() - self._motor_right.distance()) > 2):

0 commit comments

Comments
 (0)