Light Plotter with Intel Edison (13 / 16 steg)
Steg 13: Python kod att köra steppers
Varför göra det i Python?
Det är möjligt att skicka Grove I2C Motor Driver V1.3 ett kommando för att köra en stepper för ett visst antal steg utan att behöva ange varje steg individuellt, men detta inte hjälper oss, vi behöver veta exakt när varje steg som händer och när ett antal steg är komplett, så att vi kan vända lampan på och av vid rätt tidpunkt.
Om du vill ha gratis-running stepper funktioner på detta forum och du motor är driver bara laddad med V1.2 som min var, då du kommer att behöva uppgradera firmware som jag gjorde tidigare i detta Instructable.
Också, jag bara Python.
Men Python är inte realtime, du kan inte driva motorer med det!
Det är sant, och det är inte sant. Det är tillräckligt nära realtid för detta ändamål. Om steg tiderna är något inkonsekvent är det verkligen inte en stor sak. Jag emellertid vara noga med för att köra processer i trådar, så att motorerna kan köras samtidigt och andra processer (t.ex. slå LED på och av) hanteras i trådar så att de inte stör kliva tiden och därmed drivkraften i det ledde enheten (som skulle orsaka svängningar).
Klassen Stepper
I Python skapade jag en stepper klass som lagrar några variabler om motorer
- steg: denna matris innehåller 8 individuella polaritet paren som utgör ett helt varv för en halv-stepping motor
- nextStep: detta är index för nästa steg i matrisen ska användas
- riktning: vi lagrar den riktning som kommer att förlänga strängen, detta i grund och botten avgör om vi stega framåt eller bakåt genom matrisen.
klass stepper:
steg = [[2,2], [2,0], [2,1], [0,1], [1,1], [1,0], [1,2], [0,2]]
nextStep = 0
riktning = 1 #1 eller -1 #can inverteras Invertera motor riktning
stepCount = 0
Den stegmotor initiering funktionen ställer in GroveMD drivrutiner. Se till att använda rätt I2C adress som konfigurerats på styrelsens dip-switchar.
Ta del av "setMotorSpeeds", som sätter PWM motor föraren. För steppers PWM bör alltid vara 255 när active eller 0 när oduglig, det påverkar inte hastighet, fördröjningen mellan stegen uppsättningar som.
def __init__ (själv, I2C_ADDR, I2C_BUS, riktning):
self.motorDriver = upmGrovemd.GroveMD (I2C_BUS, I2C_ADDR)
self.motorDriver.setMotorSpeeds(255,255)
Time.Sleep(0.05)
Self.Direction=Direction
Funktionen step() tar i ett argument som är antingen sant eller falskt. Om argumentet är sant då steg motorn i den riktning som kommer att förlänga strängen.
def step(self,lengthen):
"""
Ta ett steg i någon riktning.
Tar en boolesk argument att ange förlänga eller korta av strängen
"""
om (förlänga):
self.stepCount + = 1
self.nextStep += self.direction
annat:
self.stepCount-= 1
self.nextStep-= self.direction
om self.nextStep > 7:
self.nextStep = 0
om self.nextStep < 0:
self.nextStep = 7
self.motorDriver.setMotorDirections (self.steps [self.nextStep] [0], self.steps [self.nextStep] [1]