Corte de energía repentino de raspbery pi o retraso prolongado aleatorio al ejecutar el motor paso a paso con pigpiod

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_DELAYy time.sleep()(con el rango entre START_DELAYy FINAL_DELAYel valor es 100 y time.sleep()el valor depende de la suavidad del movimiento).

Cuando uso START_DELAY, FINAL_DELAYy 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:

cableado entre el controlador a raspberry pi 3

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:

ingrese la descripción de la imagen aquí

Especificación del motor paso a paso bipolar NEMA34:

  1. Par de retención 5,9 Nm
  2. Ángulo de paso 1,8°
  3. Resistencia/fase 0,33±10% Ω
  4. Inductancia/fase 3,00±20% mH
  5. Carga máxima axial 65 N
  6. Carga máxima radial 200 N

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:

ingrese la descripción de la imagen aquí

configuración del controlador

Parece que puede tener un problema de energía, quizás además de otros. ¿Cómo se alimenta el pi? ¿Cómo se alimentan los motores?
@ChrisStratton Encendí el motor paso a paso con una fuente de alimentación de 24 V CC 10 A. Raspberry Pi alimentado por un adaptador de cargador de 5V 2A
Edite la pregunta para mostrar cómo está todo cableado, tanto lógica como físicamente (enrutamiento de cables, tamaño, longitud, etc.). Especifique los puntos de ajuste de corriente paso a paso. Deje una consola serie o monitor ejecutando tailing /dev/kmesg. Modifique su código para producir una salida periódica allí, también tenga un daemon independiente que produzca una salida periódica.
@ChrisStratton Ya agregué algunos detalles, ¿es eso suficiente?
Una pausa de 200 ms en el código de modo de usuario probablemente sea solo que el sistema está ocupado. Pero usted describió un "cierre" que sería otra cosa. Realmente no proporcionó ninguna de la información solicitada.
Estos son cables de puente. Espero seriamente que no los estés usando para conectar tu servo.

Respuestas (1)

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.

  1. 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.

  2. 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.

  3. 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".

  4. 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.

  5. 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?