Stepper contin. rot.

This commit is contained in:
Nils Schulte 2020-03-19 17:14:46 +01:00
parent ee47fe4999
commit ce6c408a9f
3 changed files with 43 additions and 14 deletions

View File

@ -17,7 +17,8 @@ Pin (ESP32)| Function
36,39,34 | Button-Input
32,33,13 | Button-LEDs
16 | Housing-LEDs
2,4,5 | Free GPIO
2 | Piezo-Buzzer
4,5 | Free GPIO
35 | Free GPInput
## Reference

View File

@ -5,7 +5,7 @@ import uasyncio as asyncio
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,stepDurationMs=50,inverted=False):
def __init__(self,pins,stepsPerRev=400,stepDurationMs=10,inverted=False):
self._pins = [Pin(p, Pin.OUT) for p in pins]
self.stepnum = 0
self.rotDirection = 1
@ -30,16 +30,25 @@ class Stepper:
self._pins[3].value(level[3])
def getStepsToTarget(self):
return ((self._rotTarget - self.stepnum)*self.rotDirection)%self.stepsPerRev
#return ((self._rotTarget - self.stepnum)*self.rotDirection)%self.stepsPerRev
return ((self._rotTarget - self.stepnum)*self.rotDirection)
def rotateTo(self, target,duration=0,direction=0):
def rotateTo(self, target,duration=0,direction=0,normalise = True):
"""sets the rotation target and (if direction == 0) calculates if
it should rotate left or right"""
self._rotTarget = int(target*self.stepsPerRev) % self.stepsPerRev
self._rotTarget = int(target*self.stepsPerRev)
if normalise:
rotTargetNorm = self._rotTarget%self.stepsPerRev
stepsNorm = self.stepnum%self.stepsPerRev
self._rotTarget = self.stepnum+rotTargetNorm-stepsNorm
if (self._rotTarget-self.stepnum) > self.stepsPerRev/2:
self._rotTarget-=self.stepsPerRev
elif(self._rotTarget-self.stepnum) < -self.stepsPerRev/2:
self._rotTarget+=self.stepsPerRev
if not self.isAtTarget():
if (direction == 0):
self.rotDirection = 1 if (self._rotTarget - self.stepnum)%self.stepsPerRev \
< self.stepsPerRev/2 else -1
self.rotDirection = 1 if (self._rotTarget > self.stepnum) else -1
else:
self.rotDirection = direction
self._speedMs = max(int(self.stepDurationMs),duration*1000/self.getStepsToTarget())
@ -53,7 +62,7 @@ class Stepper:
self.disablePower()
def _update(self):
self.stepnum = (self.stepnum + self.rotDirection) % self.stepsPerRev
self.stepnum = (self.stepnum + self.rotDirection)
self._setPins(stepping[(self.stepnum%8) if not self.inverted else ((8-self.stepnum)%8)])
def disablePower(self):
@ -66,4 +75,4 @@ class Stepper:
return (self._rotTarget / self.stepsPerRev)
def isAtTarget(self):
return (self._rotTarget%self.stepsPerRev == self.stepnum%self.stepsPerRev)
return (self._rotTarget == self.stepnum)

29
main.py
View File

@ -5,14 +5,24 @@ import Button
import uasyncio as asyncio
import StepperL298M
import StepperClock
import neopixel
#Async
loop = asyncio.get_event_loop()
#Initialise the time module with the RTC
dsRtc = DS3231.DS3231(machine.I2C(sda = machine.Pin(17), scl=machine.Pin(18)))
rtc = machine.RTC()
rtc.init(dsRtc.DateTime()+[0])
try:
dsRtc = DS3231.DS3231(machine.I2C(sda = machine.Pin(17), scl=machine.Pin(18)))
rtc = machine.RTC()
rtc.init(dsRtc.DateTime()+[0])
except:
print("Error on DS3231-Inititalisation")
housingLEDs = neopixel.NeoPixel(machine.Pin(16, machine.Pin.OUT),5)
housingLEDs.fill((0,0,0))
housingLEDs.write()
Buzzer = machine.PWM(machine.Pin(2), freq=10000, duty=0)
#Initalise the Motors
stepDurationMs = 8
@ -42,9 +52,14 @@ def rightButtonClickUp():
rightButtonLED.off()
def rightButtonClick():
if(clock.isRunning()):
stepperhour.stepnum = (stepperhour.stepnum+8)%stepperhour.stepsPerRev
stepperminu.stepnum = (stepperminu.stepnum+8)%stepperminu.stepsPerRev
else:
stepperhour.rotateTo(stepperhour.getOrientation()+0.25)
stepperminu.rotateTo(stepperminu.getOrientation()-0.25)
#if(clock.isRunning()):
# stepperhour.stepnum = (stepperhour.stepnum+8)%stepperhour.stepsPerRev
#else:
# stepperhour.rotateTo(stepperhour.getOrientation()+0.25)
rightButton = Button.Button(pin=34,onPushDown=rightButtonClickDown,onPushUp=rightButtonClickUp,onClick=rightButtonClick,inverted=True)
def middleButtonClickDown():
@ -57,8 +72,12 @@ def middleButtonClick():
clock.stop()
stepperminu.rotateTo(0)
stepperhour.rotateTo(0)
housingLEDs.fill((255,0,255))
housingLEDs.write()
else:
clock.start()
housingLEDs.fill((0,0,0))
housingLEDs.write()
middleButton = Button.Button(pin=39,onPushDown=middleButtonClickDown,onPushUp=middleButtonClickUp,onClick=middleButtonClick,inverted=True)