树莓Pi初学者
我正在编写图形用户界面应用程序(使用PyQt5)来控制直流电机。到目前为止,我能够控制我的电机通过电机驱动器和改变它的速度在终端(使用脉宽调制)。
当我想在我的图形用户界面应用程序中使用我的电机控制器代码时,问题就出现了,因为当我运行电机运动函数时,我的time.sleep(x)停止了整个GUI应用程序,所以我不能改变电机的速度。
我发现线程可能会拯救我的问题,但我不知道如何在线程运行时修改速度。
这是我运行马达的代码:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# set pins as output
GPIO.setup(4,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(17,GPIO.OUT)
p = GPIO.PWM(17,80)
p.start(40)
p.ChangeDutyCycle(50)
GPIO.output(18,GPIO.LOW)
GPIO.output(4,GPIO.HIGH)
print("4 is HIGH")
time.sleep(5)
p.ChangeDutyCycle(70)#speed change
#change direction of motor spinning
GPIO.output(4,GPIO.LOW)
GPIO.output(18,GPIO.HIGH)
print("18 is HIGH")
p.stop()
GPIO.cleanup()Python用于GUI:
from PyQt5 import QtWidgets,uic, QtCore
...
def start():
while True:
#run motor here
dlg.btn_start.clicked.connect(start)
...我希望我没有让事情变得更复杂,谢谢大家的回答!
诚挚的问候!
发布于 2018-03-23 12:45:29
解决方案:
我让它与Python多处理一起工作。
我的程序现在分为两个过程:
1.图形用户界面处理,它运行GUI和signal,在改变滑块时运行速度变化函数。每当改变滑块的位置时,值就会保存到文本文件中。
2.电机进程是指始终读取同一文件并将值从文件应用到电机速度的进程。如果该值设置为0,则电机关闭。
我认为这不是唯一的解决方案,当然也不是最好的,但它对我有效。
我希望这对你们中的一些人也有帮助!
干杯!
当然,守则:
from PyQt5 import QtWidgets,uic, QtCore
from PyQt5.QtWidgets import QMessageBox,QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog
from PyQt5.QtCore import QTimer,QTime
from PyQt5.QtGui import QIcon
import time
from multiprocessing import Process, Queue, Value
app = QtWidgets.QApplication([])
dlg = uic.loadUi("Motor.ui")
def startMotor():
try:
while True:
time.sleep(0.01)
file = open("test.txt", "r")
a=file.read()
file.close()
if int(a) == 0:
print("OFF")
#motor is off
else:
#motor is ON
print("ON, speed is:", a)
except:
print("Abort...")
def runProgram():
dlg.show()
app.exec()
def changeSpeed():
dlg.label.setText(str(dlg.slider.value()))
file = open("test.txt","w")
file.write(str(dlg.slider.value()))
file.close()
#when slider's value is changed
dlg.slider.valueChanged.connect(changeSpeed)
if __name__ == '__main__':
#On Program load
p1 = Process(target=startMotor,args=())
p2 = Process(target=runProgram,args=())
p1.start()
p2.start()
p1.join()
p2.join()如果有人对PyQt5设计的基础知识感兴趣,请查看我的YouTube频道,在这里我将解释基本知识:链接
https://stackoverflow.com/questions/49439139
复制相似问题