2020import os
2121import sys
2222import time
23+ from math import copysign
2324import logging
2425import pigpio
2526import sonar
@@ -100,7 +101,7 @@ class CoderBot(object):
100101
101102 # pylint: disable=too-many-instance-attributes
102103
103- def __init__ (self , motor_trim_factor = 1.0 , hw_version = "5" ):
104+ def __init__ (self , motor_trim_factor = 1.0 , motor_min_power = 0 , motor_max_power = 100 , hw_version = "5" , pid_params = ( 0.8 , 0.1 , 0.01 , 200 , 0.01 ) ):
104105 try :
105106 self ._mpu = mpu .AccelGyroMag ()
106107 logging .info ("MPU available" )
@@ -116,6 +117,8 @@ def __init__(self, motor_trim_factor=1.0, hw_version="5"):
116117 self ._cb_elapse = dict ()
117118 self ._encoder = self .GPIOS .HAS_ENCODER
118119 self ._motor_trim_factor = motor_trim_factor
120+ self ._motor_min_power = motor_min_power
121+ self ._motor_max_power = motor_max_power
119122 self ._twin_motors_enc = WheelsAxel (
120123 self .pi ,
121124 enable_pin = self .GPIOS .PIN_MOTOR_ENABLE ,
@@ -126,7 +129,8 @@ def __init__(self, motor_trim_factor=1.0, hw_version="5"):
126129 right_forward_pin = self .GPIOS .PIN_RIGHT_FORWARD ,
127130 right_backward_pin = self .GPIOS .PIN_RIGHT_BACKWARD ,
128131 right_encoder_feedback_pin_A = self .GPIOS .PIN_ENCODER_RIGHT_A ,
129- right_encoder_feedback_pin_B = self .GPIOS .PIN_ENCODER_RIGHT_B )
132+ right_encoder_feedback_pin_B = self .GPIOS .PIN_ENCODER_RIGHT_B ,
133+ pid_params = pid_params )
130134 self .motor_control = self ._dc_enc_motor
131135
132136 self ._cb1 = self .pi .callback (self .GPIOS .PIN_PUSHBUTTON , pigpio .EITHER_EDGE , self ._cb_button )
@@ -153,21 +157,23 @@ def exit(self):
153157 s .cancel ()
154158
155159 @classmethod
156- def get_instance (cls , motor_trim_factor = 1.0 , hw_version = "5" , servo = False ):
160+ def get_instance (cls , motor_trim_factor = 1.0 , motor_max_power = 100 , motor_min_power = 0 , hw_version = "5" , pid_params = ( 0.8 , 0.1 , 0.01 , 200 , 0.01 ) ):
157161 if not cls .the_bot :
158- cls .the_bot = CoderBot (motor_trim_factor = motor_trim_factor , hw_version = hw_version )
162+ cls .the_bot = CoderBot (motor_trim_factor = motor_trim_factor , motor_max_power = motor_max_power , motor_min_power = motor_min_power , hw_version = hw_version , pid_params = pid_params )
159163 return cls .the_bot
160164
165+ def get_motor_power (self , speed ):
166+ return int (copysign (min (max (((self ._motor_max_power - self ._motor_min_power ) * abs (speed ) / 100 ) + self ._motor_min_power , self ._motor_min_power ), self ._motor_max_power ), speed ))
167+
161168 def move (self , speed = 100 , elapse = None , distance = None ):
162- self ._motor_trim_factor = 1.0
163- speed_left = min (100 , max (- 100 , speed * self ._motor_trim_factor ))
164- speed_right = min (100 , max (- 100 , speed / self ._motor_trim_factor ))
169+ speed_left = speed * self ._motor_trim_factor
170+ speed_right = speed / self ._motor_trim_factor
165171 self .motor_control (speed_left = speed_left , speed_right = speed_right , time_elapse = elapse , target_distance = distance )
166172
167- def turn (self , speed = 100 , elapse = - 1 ):
168- speed_left = min ( 100 , max ( - 100 , speed * self ._motor_trim_factor ))
169- speed_right = - min ( 100 , max ( - 100 , speed / self ._motor_trim_factor ))
170- self .motor_control (speed_left = speed_left , speed_right = speed_right , time_elapse = elapse )
173+ def turn (self , speed = 100 , elapse = None , distance = None ):
174+ speed_left = speed * self ._motor_trim_factor
175+ speed_right = - speed / self ._motor_trim_factor
176+ self .motor_control (speed_left = speed_left , speed_right = speed_right , time_elapse = elapse , target_distance = distance )
171177
172178 def turn_angle (self , speed = 100 , angle = 0 ):
173179 z = self ._mpu .get_gyro ()[2 ]
@@ -225,8 +231,8 @@ def _servo_control(self, pin, angle):
225231 self .pi .set_PWM_dutycycle (pin , duty )
226232
227233 def _dc_enc_motor (self , speed_left = 100 , speed_right = 100 , time_elapse = None , target_distance = None ):
228- self ._twin_motors_enc .control (power_left = speed_left ,
229- power_right = speed_right ,
234+ self ._twin_motors_enc .control (power_left = self . get_motor_power ( speed_left ) ,
235+ power_right = self . get_motor_power ( speed_right ) ,
230236 time_elapse = time_elapse ,
231237 target_distance = target_distance )
232238
0 commit comments