stepper-clock/StepperL298M.py
2020-03-18 11:47:19 +01:00

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)