Шаговый двигатель через некоторое время перестает работать, хотя код все еще работает. (Raspberry Pi) - PullRequest
0 голосов
/ 08 июля 2020

Я запускаю следующий код на своем Raspberry Pi 4B, используя Python 3.7.3:

from time import sleep
import RPi.GPIO as GPIO
import math
from watchgod import watch

g=open("/home/pi/Desktop/Int2/DesHeight.txt","r")
DesHeight = g.readline()
DesHeight1=float(DesHeight)
print(DesHeight1)

GPIO.cleanup()

DIR = 20
STEP = 21
CW = 0
CCW = 1
TX_ENC = 15
SPR = 200 # Steps per Rev [CONSTANT]
delay = .001 #Seconds per stepper pulse [CONSTANT]
ratio=24 #gear ratio [CONSTANT]
f = open("height.txt", "r")
y0 = f.readline()
y0 = float(y0)
d=1.25
r=d/2
theta0=y0/(2*math.pi*r)

GPIO.setmode(GPIO.BCM) # GPIO numbering
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,1) # Turning on the "Enable Input"
GPIO.setup(DIR, GPIO.OUT)
GPIO.setup(STEP, GPIO.OUT)
GPIO.output(DIR, CW) # Setting CW Direction
GPIO.setup(TX_ENC, GPIO.IN) # Encoder input setup
GPIO.add_event_detect(TX_ENC, GPIO.BOTH)
Tx = 0

MODE = (16,17,18,19) # GPIO 16 is the standby input. It needs to be high for anything to move
GPIO.setup(MODE,GPIO.OUT)
RESOLUTION = {'Standby':(0,0,0,0),
              'Full':(1,0,0,0),
              'Half':(1,1,0,0),
              '1/4':(1,0,1,0),
              '1/8':(1,1,1,0),
              '1/16':(1,0,0,1),
              '1/32':(1,1,0,1),
              '1/64':(1,0,1,1),
              '1/128':(1,1,1,1)}
GPIO.output(MODE,RESOLUTION['Full'])
ass = (0,0,0,0)
pp = list(ass)
pp[0] = GPIO.input(MODE[0])
pp[1] = GPIO.input(MODE[1])
pp[2] = GPIO.input(MODE[2])
pp[3] = GPIO.input(MODE[3])
ass = tuple(pp)

if(ass == RESOLUTION['Standby']):
    res = 0
elif(ass == RESOLUTION['Full']):
    res = 200
elif(ass == RESOLUTION['Half']):
    res = 400
elif(ass == RESOLUTION['1/4']):
    res = 800
elif(ass == RESOLUTION['1/8']):
    res = 1600
elif(ass == RESOLUTION['1/16']):
    res = 3200
elif(ass == RESOLUTION['1/32']):    
    res = 6400
elif(ass == RESOLUTION['1/64']):
    res=12800
elif(ass == RESOLUTION['1/128']):
    res=25600
else:
    print("Whoops lol")

while(True):
    for changes in watch('/home/pi/Desktop/Int2/DesHeight.txt'):
        g=open("/home/pi/Desktop/Int2/DesHeight.txt","r")
        DesHeight = g.readline()
        DesHeight1=float(DesHeight)
        f = open("height.txt", "r")
        y0 = f.readline()
        y0=float(y0)
        while(abs(y0-DesHeight1)>.001):
            if(y0 < DesHeight1):
                while(y0 < DesHeight1):
                    GPIO.output(DIR,CCW)    
                    GPIO.output(STEP, GPIO.HIGH)
                    sleep(delay)
                    GPIO.output(STEP, GPIO.LOW)
                    sleep(delay)
                    Tx = Tx + 1
                    theta0=theta0+1/res*1/ratio#*1/gearratio
                    y0 = y0+2*5/4*14/15*.9944*math.pi*(1/res*1/ratio)*r
            else:
                while(y0 > DesHeight1):
                   if(y0>0):     
                        GPIO.output(DIR,CW)    
                        GPIO.output(STEP, GPIO.HIGH)
                        sleep(delay)
                        GPIO.output(STEP, GPIO.LOW)
                        sleep(delay)
                        Tx = Tx - 1
                        theta0=theta0-1/res*1/ratio#*1/gearratio
                        y0 = y0-2*5/4*14/15*.9944*math.pi*(1/res*1/ratio)*r
        y0 = str(y0)
        print(y0)
        f.close()
        f = open('height.txt', 'w')
        f.write(y0)
        f.close()

По сути, я пытаюсь прочитать высоту машины из текста. файл, затем сравните его с желаемой высотой, как написано в отдельном текстовом файле. Когда код обнаруживает изменение желаемой высоты, он проверяет, что фактическая высота и желаемая высота находятся в пределах 1/1000 дюйма друг от друга, и если нет, он перемещает двигатель NEMA-17 до этого условия.

Проблема, с которой я сталкиваюсь, заключается в том, что если оставить этот код на некоторое время (обычно около 40 секунд), шаговый двигатель перестает работать, когда я изменяю желаемую высоту. Сам код запускается, занимает столько времени, сколько ожидалось, чтобы «двигать» двигатель, а также вычисляет высоту и возвращается к вершине while l oop, но сам двигатель остается неподвижным. Этого не происходит, если сразу же вносятся новые изменения в файл желаемой высоты. Я не понимаю, что это могло быть, и мне нужна помощь.

1 Ответ

0 голосов
/ 08 июля 2020

Хорошо, поэтому, следуя совету RootTwo и научившись пользоваться осциллографом, я смог выделить часть проблемы и найти решение. Либо пи, либо драйвер прекращают подавать напряжение на двигатель примерно через 90 секунд бездействия. Мне не удалось найти способ постоянно поддерживать удерживающий крутящий момент двигателя, но я смог сделать это так, чтобы код повторно инициализировался после долгого перерыва, перемещая команду while (True): и watchdog в начало код. Моя проблема технически решена, но на мой вопрос пока нет ответа: почему мой Пи перестает подавать сигнал на плату драйвера?

...