From ce6c408a9f7de238febac19ad459d953e2375efc Mon Sep 17 00:00:00 2001 From: Nils Schulte Date: Thu, 19 Mar 2020 17:14:46 +0100 Subject: [PATCH] Stepper contin. rot. --- README.md | 3 ++- StepperL298M.py | 25 +++++++++++++++++-------- main.py | 29 ++++++++++++++++++++++++----- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a3fdf0c..d9f40c5 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/StepperL298M.py b/StepperL298M.py index 4f807e7..912b4c7 100644 --- a/StepperL298M.py +++ b/StepperL298M.py @@ -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) diff --git a/main.py b/main.py index 72d1f05..89a5de4 100644 --- a/main.py +++ b/main.py @@ -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)