@@ -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