@@ -162,8 +162,6 @@ def _dc_motor(self, speed_left=100, speed_right=100, elapse=-1, steps_left=-1, s
162
162
self ._encoder_motor_stopping_right = False
163
163
self ._encoder_motor_stopped_left = False
164
164
self ._encoder_motor_stopped_right = False
165
- self ._motor_current_power_left = speed_left
166
- self ._motor_current_power_right = speed_right
167
165
if steps_left >= 0 or steps_right >= 0 :
168
166
self ._encoder_sem .acquire ()
169
167
@@ -260,6 +258,7 @@ def __init__(self, parent, _pigpio, pin_enable, pin_forward, pin_backward, pin_e
260
258
self ._pin_duty = 0
261
259
self ._pin_reverse = 0
262
260
self ._power = 0.0
261
+ self ._power_actual = 0.0
263
262
self ._encoder_dist = 0
264
263
self ._encoder_speed = 0.0
265
264
self ._encoder_last_tick = 0
@@ -269,61 +268,72 @@ def __init__(self, parent, _pigpio, pin_enable, pin_forward, pin_backward, pin_e
269
268
self ._encoder_k_v_1 = 80
270
269
self ._motor_stopping = False
271
270
self ._motor_running = False
271
+ self ._motor_stop_fast = True
272
272
self ._pigpio .set_mode (self ._pin_encoder , pigpio .INPUT )
273
273
self ._cb = self ._pigpio .callback (self ._pin_encoder , pigpio .RISING_EDGE , self ._cb_encoder )
274
+ self ._motor_lock = threading .RLock ()
274
275
275
276
def exit (self ):
276
277
self ._cb .cancel ()
277
278
278
279
def _cb_encoder (self , gpio , level , tick ):
280
+ self ._motor_lock .acquire ()
279
281
self ._encoder_dist += 1
280
282
delta_ticks = tick - self ._encoder_last_tick if tick > self ._encoder_last_tick else tick - self ._encoder_last_tick + 4294967295
281
283
self ._encoder_last_tick = tick
282
284
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
286
288
#print "pin: " + str(self._pin_forward) + " dist: " + str(self._encoder_dist) + " target: " + str(self._encoder_dist_target) + " delta_s: " + str(delta_s)
287
289
if (self ._encoder_dist >= self ._encoder_dist_target - delta_s and
288
290
not self ._motor_stopping and self ._motor_running ):
289
291
self ._motor_stopping = True
290
292
self ._pigpio .write (self ._pin_duty , 0 )
291
293
self ._pigpio .set_PWM_dutycycle (self ._pin_reverse , self ._power )
292
- #print "stopping"
293
294
elif (self ._motor_running and
294
295
((self ._motor_stopping and
295
296
self ._encoder_speed < self ._encoder_k_v_1 ) or
296
297
(self ._motor_stopping and
297
298
self ._encoder_dist >= self ._encoder_dist_target ))):
298
299
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)
301
300
logging .info ( "dist: " + str (self ._encoder_dist ) + " speed: " + str (self ._encoder_speed ))
302
301
else :
303
302
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 ()
304
309
305
310
def control (self , power = 100.0 , elapse = - 1 , speed = 100.0 , steps = - 1 ):
311
+ self ._motor_lock .acquire ()
306
312
self ._direction = speed > 0
307
313
self ._encoder_dist_target = steps
308
314
self ._motor_stopping = False
309
315
self ._motor_running = True
310
316
self ._encoder_dist = 0
311
317
self ._encoder_speed_target = abs (speed )
312
318
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
313
320
self ._pin_duty = self ._pin_forward if self ._direction else self ._pin_backward
314
321
self ._pin_reverse = self ._pin_backward if self ._direction else self ._pin_forward
315
322
self ._pigpio .write (self ._pin_reverse , 0 )
316
323
self ._pigpio .set_PWM_dutycycle (self ._pin_duty , self ._power )
317
324
self ._pigpio .write (self ._pin_enable , True )
325
+ self ._motor_lock .release ()
318
326
if elapse > 0 :
319
327
time .sleep (elapse )
320
328
self .stop ()
321
329
322
330
def stop (self ):
331
+ self ._motor_lock .acquire ()
323
332
self ._motor_stopping = False
324
333
self ._motor_running = False
325
334
self ._pigpio .write (self ._pin_forward , 0 )
326
335
self ._pigpio .write (self ._pin_backward , 0 )
336
+ self ._motor_lock .release ()
327
337
328
338
def distance (self ):
329
339
return self ._encoder_dist
@@ -338,16 +348,16 @@ def running(self):
338
348
return self ._motor_running
339
349
340
350
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 )
343
353
344
354
class TwinMotorsEncoder (object ):
345
355
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 )
348
356
self ._straight = False
349
357
self ._running = False
350
358
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 )
351
361
352
362
def exit (self ):
353
363
self ._motor_left .exit ()
@@ -377,6 +387,12 @@ def stop(self):
377
387
self ._motor_right .stop ()
378
388
self ._running = False
379
389
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
+
380
396
def _cb_encoder (self , motor , gpio , level , tick ):
381
397
if (self ._straight and self ._running and not self ._motor_left .stopping () and not self ._motor_right .stopping () and
382
398
abs (self ._motor_left .distance () - self ._motor_right .distance ()) > 2 ):
0 commit comments