Ejemplo n.º 1
0
class motor(object):
    """
        A motor is defined by a hat and a position
        You can move the motor forward or backward
    """
    def __init__(self, hat, position):
        self._hat = hat
        self._position = position
        self._stepper = Adafruit_MotorHAT(addr=self._hat).getStepper(
            200, self._position)
        self._stepper.setSpeed(50)
        log.info("Initializing Motor hat {0} position {1}".format(
            hat, position))

    def step_threaded(self, reverse: int, numsteps: int):
        """
            Uses blocking steps and moves faster
        """
        log.info("step_threaded - Starting")
        self._stepper.step(numsteps, reverse, STEP_STYLE)

    def step(self, reverse: int):
        """
            Steps the motor a single step in a direction
        """
        log.debug("step - Starting a step")
        if reverse == 0:
            self._stepper.oneStep(Adafruit_MotorHAT.FORWARD, STEP_STYLE)
        elif reverse == 1:
            self._stepper.oneStep(Adafruit_MotorHAT.BACKWARD, STEP_STYLE)
Ejemplo n.º 2
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)