Por lo tanto, estoy manejando un motor paso a paso bipolar NEMA34 y está siendo manejado por un DM860 leadshine. Creo un programa en la frambuesa pi usando la biblioteca pigpio, el programa que hace que el cambio del motor paso a paso se mueva hacia atrás y adelante en el bucle de hilos. así que este es el ejemplo om mi código que sigo de (joan) ejemplo ( enlace ):
import time
import pigpio
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTime, QTimer
#this function I implement it on GUI PyQt
class step(QtCore.QThread):
tulis = write()
dataArray = []
dataInput = 0
startDelay=0
finalDelay=0
def __init__(self, parent=None):
QtCore.QThread.__init__(self,parent)
self.GPIO=20
self.dirrection = 21
def triger(self,slider): #this function 'def triger(self,slider)' I use for update the value of variable 'stepdataInput','step.DataDelay',and 'step.dataStart' if the Gui gas update their input value
step.dataInput = slider #get value from slider UI and set it to 'step.dataInput' variable
if slider > 0:
step.startDelay = 600 - (2 * slider) #just the calculation of startDelay variable
step.finalDelay = 570 - (2 * slider) #just the calculation of startDelay variable
else:
step.startDelay = 0
step.finalDelay = 0
def move(self):
pi = pigpio.pi()
pi.set_mode(self.GPIO, pigpio.OUTPUT) #inisiation of gpio pulse pin
pi.set_mode(self.dirrection, pigpio.OUTPUT) #inisiation of gpio diretion pin
pi.set_mode(26,pigpio.INPUT) #left limit switch
pi.set_mode(16,pigpio.INPUT) #right limit switch
statee = 0 #the first inisialisation of motor direction
x = 0
while step.startDelay > 0 or step.finalDelay > 0: #this is the requitmen of loop
pi.wave_clear()
pi.write(self.dirrection,statee)
wf=[] #ramp up wave from startDelay to finalDelay
for delay in range(step.startDelay, step.finalDelay, -1): #looping for create ramp up wave from step.starDelay' to 'step.finalDelay'
wf.append(pigpio.pulse(1<<self.GPIO, 0, delay))
wf.append(pigpio.pulse(0, 1<<self.GPIO, delay))
pi.wave_add_generic(wf)
offset = pi.wave_get_micros()
wid1 = pi.wave_create() #end ramp up code
wf=[] #max speed wave from finalDelay
wf.append(pigpio.pulse(1<<self.GPIO, 0, step.finalDelay))
wf.append(pigpio.pulse(0, 1<<self.GPIO, step.finalDelay))
pi.wave_add_generic(wf)
wid2 = pi.wave_create() #end max speed code
#ramp down wave from finalDelay to startDelay
wf = []
for delay in range(step.finalDelay,step.startDelay):
#looping for create ramp down delay from 'step.finalDelay' to 'step.startDelay'
wf.append(pigpio.pulse(1<<self.GPIO, 0, delay))
wf.append(pigpio.pulse(0, 1<<self.GPIO, delay))
pi.wave_add_generic(wf)
wid3 = pi.wave_create() #end ramp down code
#pi.wave_send_once(wid1)
pi.wave_send_using_mode(wid1, pigpio.WAVE_MODE_ONE_SHOT_SYNC) #send ramp up wave
time.sleep(float(offset)/1000000.0) #transition delay to another wave send
pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_REPEAT_SYNC) # the maximum wave send here
if pi.read(26) == 0: #check if something hit the limmiter switch
pi.wave_tx_stop()
self.stop()
if pi.read(16) == 0: #check if something hit the limmiter switch
pi.wave_tx_stop()
self.stop()
time.sleep(0.35)
pi.wave_send_using_mode(wid3, pigpio.WAVE_MODE_ONE_SHOT_SYNC) #send ramp down wave
if statee == 0: #if the value of 'statee' variable is 0
step.dataArray.append({'x':x,'y':0.25,'speed':step.dataInput}) #just save record
statee = 1 #set 'statee' varable to 1, for chaging the direction
elif statee == 1:
step.dataArray.append({'x':x,'y':0.25 * -1,'speed':step.dataInput})
statee = 0
x = x + 1
print("stop the process")
#this function from gpiod to stop and terminate all wave
pi.wave_tx_stop()
pi.stop()
def run(self):
#this function 'def run(self)' run by itself when you first time start the thread by calling 'def start() function'
self.move()
def start(self):
#this function 'def start(self)' I use to start the thead looping
super(step, self).start()
def stop(self):
#this function 'def stop(self)'I use to stop the thread loop
step.startDelay = 0
step.finalDelay = 0
el problema ocurrió cuando el motor paso a paso cambia la dirección, no puede cambiar la dirección o descender suavemente, hay demasiados golpes al cambiar la dirección o cada extremo del movimiento, uso la rampa hacia abajo para reducir la velocidad del movimiento cuando pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_REPEAT_SYNC)
ya finaliza la ejecución y el rango entre step.startDelay
y step.finalDelay
no hasta ahora, ya que para que el movimiento del motor paso a paso no sea demasiado lejos y aumente la precisión de pi.read(26)
y pi.read(26)
para finalizar pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_REPEAT_SYNC)
cuando golpeo el interruptor normaly close. funciona como la rampa de aterrizaje no funcionó en absoluto, así que, ¿qué debo hacer?