Apr-29-2021, 08:26 AM
Hi
I have a basic simple Python 3.5 tkinter program on raspberry pi 3 that runs a stepper motor driven lift.
In the program I have a while loop that generates a square wave that drives the lift to end switches.
The program runs OK from end to end.
I wish to break out of the loop whenever certain button(s) is/are pressed.
My main problem is that the while loop disables the buttons.
If I can get the buttons enabled, I can accept a break command inside the loop.
(I am also unsure about the event.wait(time) that probably runs the same thread, but that's not a problem for now)
What would the right way to resolve and correct my program?
Thanks.
I have a basic simple Python 3.5 tkinter program on raspberry pi 3 that runs a stepper motor driven lift.
In the program I have a while loop that generates a square wave that drives the lift to end switches.
The program runs OK from end to end.
I wish to break out of the loop whenever certain button(s) is/are pressed.
My main problem is that the while loop disables the buttons.
If I can get the buttons enabled, I can accept a break command inside the loop.
(I am also unsure about the event.wait(time) that probably runs the same thread, but that's not a problem for now)
What would the right way to resolve and correct my program?
Thanks.
from tkinter import *
root = Tk()
import RPi.GPIO as GPIO
import threading
label = Label(root, text="Lift Control").pack()
GPIO.setwarnings(False)
PUL = 17 # Stepper Drive Pulses
DIR = 27 # Stepper Direction Bit.
ENA = 22 # Stepper Enable
UPSW = 18 # Down end-switch
DNSW = 23 # Up end switch
GPIO.setmode(GPIO.BCM)
GPIO.setup(PUL, GPIO.OUT)
GPIO.setup(DIR, GPIO.OUT)
GPIO.setup(ENA, GPIO.OUT)
GPIO.setup(DNSW, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(UPSW, GPIO.IN, pull_up_down=GPIO.PUD_UP)
pause = 0.001 # For 500 Hz signal
event = threading.Event()
def up():
dir = 1
run(dir)
return
def down():
dir = 0
run(dir)
return
def hold():
GPIO.output(ENA, GPIO.LOW)
return
def run(dir):
switch = UPSW
if dir == 1:
GPIO.output(DIR, GPIO.HIGH)
switch = UPSW
if dir == 0:
GPIO.output(DIR, GPIO.LOW)
switch = DNSW
GPIO.output(ENA, GPIO.HIGH)
event = threading.Event()
while GPIO.input(switch) == 0:
GPIO.output(PUL, GPIO.LOW)
event.wait(pause)
GPIO.output(PUL, GPIO.HIGH)
event.wait(pause)
GPIO.output(ENA, GPIO.LOW)
print ('end run')
return
buttonUp = Button(root,text = "to top",width = 15 ,command = up).pack()
buttonDown = Button(root,text = "to bottom",width = 15 ,command = down).pack()
buttonHold = Button(root,text = "Hold",width = 15 ,command = hold).pack()
root.mainloop()
