Пример #1
0
class ESC(object):
    '''
    This class is made to use ESC device in Raspberry Pi.
    Becareful when you connect ESC to your Raspberry Pi board.
    It needs very large current, it can make broken your circuit.

    '''
    def __init__(self, bus_number=None, address=0x40, frequency = 60, drive = 0, steer = 1, drive_n = 369, steer_c = 390):
        ''' This is very important part of set ESC.
        If you want to drive motor by this source, you have to use pca9685 drive.
        Because the ESC circuit is connected with PCA9685 PWM circuit board's channel pins

        Argument
        bus_number : bus type of raspberry Pi. If it doesn't set, pca9685 module set value as default.
        address : I2C slave address
        frequency : driving motor(forward/backward motor) PWM frequency.
        driver : pca9685 channel number of driving motor
        steer : pca9685 channel number of steering motor
        '''
        self.pwm = PWM(bus_number, address)
        self.pwm.frequency = frequency
        self.pwm.setup()
        self.drive = drive
        self.steer = steer
        #self.steer_NEUTRAL = 390 #default value. It needs to calibrate
        self.steer_NEUTRAL = steer_c
        self.steer_MIN = 280
        self.steer_MAX = 500
        #self.drive_NEUTRAL = 369 #default value. It needs to calibrate
        self.drive_NEUTRAL = drive_n
        self.drive_MIN = 280
        self.drive_MAX = 450
        self.steer_val = self.steer_NEUTRAL
        self.drive_val = self.drive_NEUTRAL
        self.speed_forward = self.steer_NEUTRAL
        self.speed_backward = self.steer_NEUTRAL
        self.steer_diff = 35
        self.drive_diff = 5
        self.is_stop = True

    def calibrate_drive_NEUTRAL(self, cal_value = 390):
        if cal_value > self.drive_MAX or cal_value < self.drive_MIN:
            print "Calibration value Fail"
        else:
            print "Drive Calib set to %d" % cal_value
            self.drive_NEUTRAL = cal_value

    def calibrate_steer_NEUTRAL(self, cal_value = 390):
        if cal_value > self.steer_MAX or cal_value < self.steer_MIN:
            print "Stree Calibration value Fail"
        else:
            print "Steer Calib set to %d" % cal_value
            self.steer_NEUTRAL = cal_value

    def set_steer_strength(self, strength = 35):
        if strength > (self.steer_MAX - self.steer_NEUTRAL):
            strength = self.steer_MAX - self.steer_NEUTRAL
        elif strength < (self.steer_NEUTRAL - self.steer_NEUTRAL):
            strength = self.steer_NEUTRAL - self.steer_NEUTRAL
        self.steer_diff = strength
Пример #2
0
class WheelCalibration(object):
    '''
    This class is made to use ESC device in Raspberry Pi.
    Becareful when you connect ESC to your Raspberry Pi board.
    It needs very large current, it can make broken your circuit.

    '''
    def __init__(self, drive, steer, bus_number=None, address=0x40, frequency = 60, drive_ch = 0, steer_ch = 1):
        ''' This is very important part of set ESC.
        If you want to drive motor by this source, you have to use pca9685 drive.
        Because the ESC circuit is connected with PCA9685 PWM circuit board's channel pins

        Argument
        bus_number : bus type of raspberry Pi. If it doesn't set, pca9685 module set value as default.
        address : I2C slave address
        frequency : driving motor(forward/backward motor) PWM frequency.
        driver : pca9685 channel number of driving motor
        steer : pca9685 channel number of steering motor
        '''

        #mode - 0 : forward, 1 : backward, 2 : Neutral, 3 : None
        self.set_mode = 3
        self.steer_value_loaded = False
        self.drive_value_loaded = False
        self.current_mode = ["Forward", "Backward", "Neutral", "None"]

        #Set Channel
        self.drive_ch = drive_ch 
        self.steer_ch = steer_ch

        #Default values for steer
        #self.steer_NEUTRAL = 390 
        self.steer_center = steer
        self.steer_MIN = 280
        self.steer_MAX = 500
        self.steer_val = 0
        self.steer_diff = 15

        #Default values for drive(engine)
        #self.drive_NEUTRAL = 369 
        self.drive_neutral = drive 
        self.drive_MIN = 280
        self.drive_MAX = 450
        #self.drive_val = self.drive_neutral
        self.speed_forward = 0
        self.speed_backward = 0
        self.drive_diff = 5

        # PWM init
        self.pwm = PWM(bus_number, address)
        self.pwm.frequency = frequency
        self.pwm.setup()
        time.sleep(0.1)
        self.pwm.write(self.drive_ch,0,0)
        self.pwm.write(self.steer_ch,0,0)

    """
    def left(self):
        if(self.steer_value_loaded == True):
            if self.steer_val < self.steer_MAX:
                self.steer_val += self.steer_diff
                if self.steer_val > self.steer_MAX:
                    self.steer_val = self.steer_MAX
        self.pwm.write(self.steer_ch,0,self.steer_val)
        
    def right(self):
        if(self.steer_value_loaded == True):
            if self.steer_val > self.steer_MIN:
                self.steer_val -= self.steer_diff
                if self.steer_val < self.steer_MIN :
                    self.steer_val = self.steer_MIN
        self.pwm.write(self.steer_ch,0,self.steer_val)
    """
    def left(self):
        if(self.steer_value_loaded == True):
            self.steer_val += self.steer_diff

            if self.steer_val >= self.steer_MAX:
                self.steer_val = self.steer_MAX
            else:                
                self.pwm.write(self.steer_ch,0,self.steer_val)
        
    def right(self):
        if(self.steer_value_loaded == True):
            self.steer_val -= self.steer_diff

            if self.steer_val <= self.steer_MIN :
                self.steer_val = self.steer_MIN
            else:
                self.pwm.write(self.steer_ch,0,self.steer_val)


    def set_steer_center(self):
        self.steer_val = self.steer_center
        self.pwm.write(self.steer_ch,0,self.steer_val)
        time.sleep(0.1)
        self.pwm.write(self.steer_ch,0,0)
        self.steer_value_loaded = True

    def increase_speed(self):
        if(self.set_mode == 0): #if forward
            if self.speed_forward < self.drive_MAX:
                self.speed_forward += self.drive_diff
                if self.speed_forward > self.drive_MAX:
                    self.speed_forward = self.drive_MAX
            self.pwm.write(self.drive_ch, 0, self.speed_forward)        
        elif(self.set_mode == 1): #if backward
            if self.speed_backward > self.drive_MIN:
                self.speed_backward -= self.drive_diff
                if self.speed_backward < self.drive_MIN :
                    self.speed_backward = self.drive_MIN
            self.pwm.write(self.drive_ch, 0, self.speed_backward)        
        else:
            pass
        

    def decrease_speed(self):
        if(self.set_mode == 0): #if forward
            """
            if self.speed_forward > self.drive_neutral:
                self.speed_forward -= self.drive_diff
                if self.speed_forward < self.drive_neutral:
                    self.speed_forward = self.drive_neutral
            """
            if self.speed_forward > self.drive_MIN:
                self.speed_forward -= self.drive_diff
                                    
            self.pwm.write(self.drive_ch, 0, self.speed_forward)

        elif(self.set_mode == 1): #if backward
            """
            if self.speed_backward < self.drive_neutral:
                self.speed_backward += self.drive_diff
                if self.speed_backward > self.drive_neutral :
                    self.speed_backward = self.drive_neutral
            """
            if self.speed_backward < self.drive_MAX:
                self.speed_backward += self.drive_diff        
            self.pwm.write(self.drive_ch, 0, self.speed_backward)                    
        else:
            pass

    def set_drive_forward(self):
        if(self.drive_value_loaded == True):
            if(self.set_mode == 2 or self.set_mode == 3):
                self.set_mode = 0

    def set_drive_backward(self):
        if(self.drive_value_loaded == True):
            if(self.set_mode == 2 or self.set_mode == 3):
                self.set_mode = 1

    def set_drive_neutral(self):
        self.set_mode = 2
        self.pwm.write(self.drive_ch, 0,self.drive_neutral)
        self.speed_forward = self.drive_neutral
        self.speed_backward = self.drive_neutral
        self.drive_value_loaded = True
    
    """
    def set_speed_manually(self,speed):
        self.pwm.write(self.drive_ch, 0,speed)

    def set_steer_manually(self,steer):
        self.pwm.write(self.drive_ch, 0,steer)
    """
    
    def pwm_off(self):
        self.pwm.write(self.drive_ch, 0,0)
        self.pwm.write(self.steer_ch, 0,0)
        self.set_mode = 3
Пример #3
0
class ESC(object):
    '''
    This class is made to use ESC device in Raspberry Pi.
    Becareful when you connect ESC to your Raspberry Pi board.
    It needs very large current, it can make broken your circuit.

    '''
    def __init__(self,
                 bus_number=None,
                 address=0x40,
                 frequency=60,
                 drive=0,
                 steer=1):
        ''' This is very important part of set ESC.
        If you want to drive motor by this source, you have to use pca9685 drive.
        Because the ESC circuit is connected with PCA9685 PWM circuit board's channel pins

        Argument
        bus_number : bus type of raspberry Pi. If it doesn't set, pca9685 module set value as default.
        address : I2C slave address
        frequency : driving motor(forward/backward motor) PWM frequency.
        driver : pca9685 channel number of driving motor
        steer : pca9685 channel number of steering motor
        '''
        self.pwm = PWM(bus_number, address)
        self.pwm.frequency = frequency
        self.pwm.setup()
        self.drive = drive
        self.steer = steer
        self.steer_NEUTRAL = 390  #default value. It needs to calibrate
        self.steer_MIN = 280
        self.steer_MAX = 500
        self.drive_NEUTRAL = 390  #default value. It needs to calibrate
        self.drive_MIN = 280
        self.drive_MAX = 450
        self.steer_val = self.steer_NEUTRAL
        self.drive_val = self.drive_NEUTRAL
        self.speed_forward = self.steer_NEUTRAL
        self.speed_backward = self.steer_NEUTRAL
        self.steer_diff = 35
        self.drive_diff = 5
        self.is_stop = True

    def calibrate_drive_NEUTRAL(self, cal_value=390):
        if cal_value > self.drive_MAX or cal_value < self.drive_MIN:
            print "Calibration value Fail"
        else:
            self.drive_NEUTRAL = cal_value

    def calibrate_steer_NEUTRAL(self, cal_value=390):
        if cal_value > self.steer_MAX or cal_value < self.steer_MIN:
            print "Stree Calibration value Fail"
        else:
            self.steer_NEUTRAL = cal_value

    def set_steer_strength(self, strength=35):
        if strength > (self.steer_MAX - self.steer_NEUTRAL):
            strength = self.steer_MAX - self.steer_NEUTRAL
        elif strength < (self.steer_NEUTRAL - self.steer_NEUTRAL):
            strength = self.steer_NEUTRAL - self.steer_NEUTRAL
        self.steer_diff = strength

    def left(self):
        if self.steer_val < self.steer_MAX:
            self.steer_val += self.steer_diff
            if self.steer_val > self.steer_MAX:
                self.steer_val = self.steer_MAX

        self.pwm.write(self.steer, 0, self.steer_val)

    def right(self):
        if self.steer_val > self.steer_MIN:
            self.steer_val -= self.steer_diff
            if self.steer_val < self.steer_MIN:
                self.steer_val = self.steer_MIN
        self.pwm.write(self.steer, 0, self.steer_val)

    def center(self):
        self.steer_val = self.steer_NEUTRAL
        self.pwm.write(self.steer, 0, self.steer_val)
        time.sleep(0.1)
        self.pwm.write(self.steer, 0, 0)

    def increase_speed(self):
        if self.speed_forward < self.drive_MAX:
            self.speed_forward += self.drive_diff
            if self.speed_forward > self.drive_MAX:
                self.speed_forward = self.drive_MAX

        if self.speed_backward > self.drive_MIN:
            self.speed_backward -= self.drive_diff
            if self.speed_backward < self.drive_MIN:
                self.speed_backward = self.drive_MIN
        print "set_speed === fwd : ", self.speed_forward, "bwd : ", self.speed_backward

    def decrease_speed(self):
        if self.speed_forward > self.drive_NEUTRAL:
            self.speed_forward -= self.drive_diff
            if self.speed_forward < self.drive_NEUTRAL:
                self.speed_forward = self.drive_NEUTRAL

        if self.speed_backward < self.drive_NEUTRAL:
            self.speed_backward += self.drive_diff
            if self.speed_backward > self.drive_NEUTRAL:
                self.speed_backward = self.drive_NEUTRAL
        print "set_speed === fwd : ", self.speed_forward, "bwd : ", self.speed_backward

    def set_speed(self, speed_val=1):
        '''
        speed_val : it should set number between 1 to 12
        '''
        if speed_val > 12:
            speed_val = 12
        self.speed_forward = self.drive_NEUTRAL + self.drive_diff * speed_val
        self.speed_backward = self.drive_NEUTRAL - self.drive_diff * speed_val
        print "set_speed === fwd : ", self.speed_forward, "bwd : ", self.speed_backward

    def forward(self):
        if self.is_stop:
            self.pwm.write(self.drive, 0, self.steer_NEUTRAL)
            time.sleep(0.1)
            self.is_stop = False
        self.pwm.write(self.drive, 0, self.speed_forward)

    def backward(self):
        if self.is_stop:
            self.pwm.write(self.drive, 0, self.steer_NEUTRAL)
            time.sleep(0.1)
            self.is_stop = False
        self.pwm.write(self.drive, 0, self.speed_backward)

    def stop(self):
        self.pwm.write(self.drive, 0, 0)
        self.is_stop = True