55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
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)
|