AttributeError: el objeto 'NoneType' no tiene ningún atributo 'send' de atributo

0

Así que creo otro programa que puede funcionar con el motor paso a paso hacia la derecha y hacia la izquierda con una rampa hacia arriba y hacia abajo y agregando un interruptor limitador en GPIO 16 y 26 para detener el pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_ONE_SHOT_SYNC) que da una onda de cadena, este es mi código:

import time
import pigpio

START_DELAY=600
FINAL_DELAY=500
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
try:
    while 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))
        wf.append(pigpio.pulse(0, 0, offset))

        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()
            pi.stop()
        if pi.read(16) == 0:
            pi.wave_tx_stop()
            pi.stop()

        time.sleep(0.75)
        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()

El problema ocurre cuando el motor funciona entre 5 y 10 minutos, muestra un mensaje de error como este:

Traceback (most recent call last):


File "/home/pi/Desktop/ramp.py", line 49, in <module>
    if pi.read(16) == 0:
  File "/usr/local/lib/python3.4/dist-packages/pigpio.py", line 1401, in read
    return _u2i(_pigpio_command(self.sl, _PI_CMD_READ, gpio, 0))
  File "/usr/local/lib/python3.4/dist-packages/pigpio.py", line 989, in _pigpio_command
    sl.s.send(struct.pack('IIII', cmd, p1, p2, 0))
AttributeError: 'NoneType' object has no attribute 'send'

Entonces, ¿cuál es la causa del error en mi código? ¿Es esa causa por pi.read(26) y pi.read(16) ? ¿Hay alguna otra forma de detener o terminar pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_ONE_SHOT_SYNC) en medio de este proceso? gracias pequeña nota: configuro el inicio del inicio del demonio pigpiod al inicio ( enlace Respuesta de KimSJ), ¿el método de ejecución de pigpiod causa este error? gracias

    
pregunta Jan sebastian

2 respuestas

2

Tu problema es que estás llamando a pi.stop en medio de tu tarea.

"Detener" no significa "detener el servo para que no se mueva".

Significa "detener y cerrar la conexión al servicio pigpio".

Entonces, llamas a stop en medio de tu tarea y luego intentas enviar comandos a través de la conexión cerrada. Se ha cerrado y eliminado, por lo que un intento de acceder a él devuelve un objeto de tipo "Ninguno" que (por supuesto) no tiene un método de "envío".

Deje de usar "detener", excepto al final, cuando su programa ya no necesite el objeto pigpio.

    
respondido por el JRE
0

Mirando el código pigpio, parece que el socket se está cerrando. ¿Estás seguro de que el hilo todavía se está ejecutando? Empezaría a ver qué está haciendo el subproceso en segundo plano cuando se cierra el zócalo.

    
respondido por el t3ddftw

Lea otras preguntas en las etiquetas