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)
def addMotor(motor_id): i2c = getHat(motor_id) pos = getPos(motor_id) app.logger.info("Adding motor #" + str(motor_id)) app.logger.info('i2c = ' + hex(i2c) + ' @ pos #' + str(pos)) motor = Adafruit_MotorHAT(i2c).getStepper(200, pos) motor.setSpeed(30) motors[motor_id] = motor
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)