from machine import Pin import time stepping = [[1,0,1,0],[1,0,0,0],[1,0,0,1],[0,0,0,1],[0,1,0,1],[0,1,0,0],[0,1,1,0],[0,0,1,0]] class Stepper: def __init__(self,pins,stepsPerRev=400): self._pins = [Pin(p, Pin.OUT) for p in pins] self.stepnum = 0 self.rotDirection = 1 self.rotTarget = 0 self.stepDuration = 0.05 self._lastStepTime = time.time() self.stepsPerRev=stepsPerRev def _setPins(self,level): self._pins[0].value(level[0]) self._pins[1].value(level[1]) self._pins[2].value(level[2]) self._pins[3].value(level[3]) def doSteppsBlock(self,num,speed=0.05): for i in range(num): self.stepnum = (self.stepnum + 1) self._setPins(stepping[self.stepnum%8]) time.sleep(speed) self.disablePower() def rotateTo(self, target,direction=0): """sets the rotation target and (if direction == 0) calculates if it should rotate left or right""" self.rotTarget = int(target*self.stepsPerRev) % self.stepsPerRev if (direction == 0): self.rotDirection = 1 if (self.stepnum- self.rotTarget)%self.stepsPerRev \ > self.stepsPerRev/2 else 0 else: self.rotDirection = direction def update(self): if (self.rotTarget%self.stepsPerRev != self.stepnum%self.stepsPerRev) \ and not self.isMoving(): self._lastStepTime = time.ticks_ms() self.stepnum = (self.stepnum + self.rotDirection) % self.stepsPerRev self._setPins(stepping[self.stepnum%8]) #time.sleep(speed) def disablePower(self): self._setPins([0,0,0,0]) def isMoving(self): return time.ticks_diff(time.ticks_ms(), self._lastStepTime) <= self.stepDuration def isAtTarget(self): return (not self.isMoving()) \ and (self.rotTarget%self.stepsPerRev == self.stepnum%self.stepsPerRev)