Así que escribí otro programa que puede ejecutar el motor paso a paso nema 34 usando el controlador leadshine DM860 y este es el ejemplo de mi código:
import time
import pigpio
START_DELAY=580
FINAL_DELAY=480
STEP=1
GPIO=20
pi = pigpio.pi()
pi.set_mode(GPIO, pigpio.OUTPUT)
pi.set_mode(21, pigpio.OUTPUT)
pi.set_mode(26,pigpio.INPUT)
pi.set_mode(16,pigpio.INPUT)
#pi.write(21,1)
pi.wave_clear()
statee = 0
run = True
try:
while run == True:
pi.write(21,statee)
pi.wave_clear()
wf=[]
offset = pi.wave_get_micros()
for delay in range(START_DELAY, FINAL_DELAY, -STEP):
wf.append(pigpio.pulse(1<<GPIO, 0, delay))
wf.append(pigpio.pulse(0, 1<<GPIO, delay))
for i in range(500):
wf.append(pigpio.pulse(1<<GPIO, 0, FINAL_DELAY))
wf.append(pigpio.pulse(0, 1<<GPIO, FINAL_DELAY))
for delay in range(FINAL_DELAY, START_DELAY, STEP):
wf.append(pigpio.pulse(1<<GPIO, 0, delay))
wf.append(pigpio.pulse(0, 1<<GPIO, delay))
pi.wave_add_generic(wf)
wid2 = pi.wave_create()
#pi.wave_send_once(wid2)
pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_ONE_SHOT_SYNC)
if pi.read(26) == 0:
pi.wave_tx_stop()
run = False
if pi.read(16) == 0:
pi.wave_tx_stop()
run = False
time.sleep(0.7429)
if statee == 0:
statee = 1
elif statee == 1:
statee = 0
except KeyboardInterrupt:
print ("\nCtrl-C pressed. Stopping PIGPIO and exiting...")
pi.wave_tx_stop()
pi.stop()
Funciona sin error de código, pero a veces el motor paso a paso cuando se mueve tiene un retraso prolongado aleatorio, incluso si ya disminuyo el valor de START_DELAY
, FINAL_DELAY
y time.sleep()
(con el rango entre START_DELAY
y FINAL_DELAY
el valor es 100 y time.sleep()
el valor depende de la suavidad del movimiento).
Cuando uso START_DELAY
, FINAL_DELAY
y time.sleep()
valoro como el código de ejemplo (la velocidad más baja) en algún momento la raspberry pi se cortó (el motor paso a paso deja de moverse y el monitor LCD muestra una pantalla en blanco con el texto 'sin señal'). Entonces, ¿el problema es realmente la causa de mi código? Ya actualicé pigpiod a v68.
Así es como se conecta:
Utilizo cables de puente (de macho a macho y de hembra a hembra, porque no tengo cables de puente macho a hembra) entre el controlador y la raspberry pi 3 y la conexión entre DIR y PUL con un cable de cobre normal.
Este es el resultado de la modulación de ancho de pulso que compruebo usando piscope:
Especificación del motor paso a paso bipolar NEMA34:
https://www.igus.com/info/drive-technology-nema-34-ca
Leadshine DM860 con una corriente de salida de 1.0 - 7.2A y un voltaje de entrada de 24 - 80 VDC. Tengo el driver configurado con fuente de alimentación de 24V.
Esta es la configuración de corriente y pulso/rev del controlador:
Creo que debes detenerte por un momento y leer un poco sobre la biblioteca pigpio.
Una de sus últimas preguntas involucró el mal uso de uno de los métodos pigpio más simples (pi.stop)
Esto parece ser mucho más complicado, y realmente necesitas entender lo que está pasando.
De un vistazo rápido a la documentación y algunos ejemplos aleatorios en Internet, me parece que debe tener más cuidado cuando cambia o agrega olas a la cola. Cambiar las cosas en el momento equivocado hará que se pierdan o se salten olas.
En general, su código podría mejorarse.
Familiarícese con el funcionamiento de las funciones de onda y cómo (y cuándo) puede cambiar (o agregar o eliminar) ondas de la cola.
Estás generando las ondas en cada carrera a través del bucle. Los parámetros para la generación de ondas no parecen cambiar, por lo que genera continuamente los mismos patrones. Hazlos una vez fuera del bucle y reutilízalos.
Parece que estás enviando la misma secuencia una y otra vez, y te detienes cuando ocurre algún evento externo (pines 16 y 26). Puede configurar una onda para que se repita hasta que la detenga. eso simplificaría drásticamente su código. Busque en "wave_send_repeat" y "WAVE_MODE_REPEAT".
Tus pines no tienen nombre. Si usó un nombre como "Stop_Button" en lugar de "26" en su "pi.read", entonces sería más claro lo que realmente está haciendo.
En general, debe asignar sus constantes a variables con buenos nombres.
Hacer las repeticiones en el código como lo hace lo deja expuesto a retrasos en la ejecución. Python se ejecuta en el espacio del usuario y puede ser interrumpido por prácticamente cualquier cosa. Esto puede causar retrasos en el inicio de la próxima ola.
Pigpio se ejecuta en el espacio del kernel y solo puede ser interrumpido por tareas del kernel de alta prioridad; es mucho más probable que se ejecute correctamente que cualquier cosa en el espacio del usuario. La forma en que está escrito (usando DMA programado) hace que sea muy probable que ni siquiera el núcleo lo moleste. Esto lo convierte realmente en la mejor manera de hacer repeticiones y secuencias largas.
Estás invirtiendo en cada repetición. Eso fue oscurecido por la falta de buenos nombres en su código.
Debe descubrir cómo preguntarle a pigpio cuando finaliza una ola en particular. Le envía su onda, espera hasta que se complete (o cancélela y espere hasta que se complete) y luego envíe el siguiente comando.
Si volteas la marcha atrás y el servo aún se está moviendo, es posible que obtengas picos de voltaje en el suelo que conectan el pi y el servocontrolador.
El DM860 parece tener entradas aisladas ópticamente, por lo que, a menos que tenga las conexiones a tierra unidas, no debería recibir picos del DM860 al pi.
¿Está compartiendo tierra o energía entre el pi y el motor/controlador del motor?
chris stratton
sebastián
chris stratton
sebastián
chris stratton
JRE