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)