Ejemplo n.º 1
0
class RaspberryPiMotor(Motor):
    '''
    Encapsulates communication to an underlying Adafruit motor HAT.
    '''
    
    def __init__(self, stepsPerRev=200):
        initStep = 0
        motorNum = 1
        super(RaspberryPiMotor, self).__init__(initStep, stepsPerRev)
        self.motor = Adafruit_MotorHAT(addr=0x70).getStepper(stepsPerRev, motorNum)
        
    def __executeSteps(self, numSteps, stepType, direction, time_ms, updateSteps='20'):
        self.setIsRunning(True)
        sign = 1
        if Motor.BACKWARD == direction:
            sign = -1

        self.motor.setSpeed(float(numSteps) / self.getStepsPerRevolution() / time_ms * 1000.0 * 60)

        revs = int(numSteps / self.getStepsPerRevolution())  
        for _ in range(revs):
            if not self.isRunning() :
                break # Request to terminate early
            self.motor.step(int(self.getStepsPerRevolution()), direction, stepType)
            self.setCurrentstep(self.getCurrentstep() + self.getStepsPerRevolution() * sign)

        remainingSteps = numSteps - (revs * self.getStepsPerRevolution())

        if self.isRunning() :
            self.motor.step(int(remainingSteps), direction, stepType)
            self.setCurrentstep(self.getCurrentstep() + remainingSteps * sign)

        self.setIsRunning(False)
        
        return self.getCurrentstep()
            
    def oneStep(self, direction, style):
        return self.motor.oneStep(direction, style)

    def step(self, steps, direction, style, time_ms, updateSteps=20):
        self.__executeSteps(steps, style, direction, time_ms, updateSteps)
    
    def turnOffMotor(self):
        self.motor.run(Adafruit_MotorHAT.RELEASE)