環境
Python 3.x
RaspberryPi 3 B
PyQt5
目標
サブスレッドを作り、サブスレッドで while文 を使う
やりたいこと
「GUI上で自動ドアを操作したい」
自動ボタンを押す
①焦電センサでモノを検知
②リードスイッチ2が反応するまでモーターを正転
③モーター停止
④リードスイッチ1が反応するまでモータを逆転
⑤モーター停止
①~⑤がループ
停止ボタンを押す
モーターが停止する
現状
tetatailにて、お優しい方に教えてもらい、QThread を用いた GUI のコードを作成してみました。
しかし、現在、動作確認できる環境になく、初心者の私が作ったコードですので、あっているかどうか、エラーが出るかどうかが全く分かりません。
どうか確認していただけないでしょうか?
python
1#ファイル名「autodoor1.py」 2 3import sys 4from PyQt5.QtWidgets import * 5from PyQt5.QtGui import * 6from PyQt5.QtCore import * 7import subprocess 8import time 9import numpy as np 10import cv2 11import RPi.GPIO as GPIO 12 13import autodoor2 as auto 14 15Shoden_PIN=22 16 17Motor_PIN_1=24 18Motor_PIN_2=25 19 20Reed_PIN_1=17 21Reed_PIN_2=27 22 23GPIO.setmode(GPIO.BCM) 24GPIO.setup(Shoden_PIN, GPIO.IN) 25GPIO.setup(Reed_PIN_1, GPIO.IN) 26GPIO.setup(Reed_PIN_2, GPIO.IN) 27 28def _init_GPIO(): 29 GPIO.setmode(GPIO.BCM) 30 GPIO.setup(Motor_PIN_1, GPIO.OUT) 31 GPIO.setup(Motor_PIN_2, GPIO.OUT) 32 33def Motor_Forward(): 34 _init_GPIO() 35 GPIO.output(Motor_PIN_1, 1) 36 GPIO.output(Motor_PIN_2, 0) 37 38def Motor_Backward(): 39 _init_GPIO() 40 GPIO.output(Motor_PIN_1, 0) 41 GPIO.output(Motor_PIN_2, 1) 42 43def Motor_Stop(): 44 _init_GPIO() 45 GPIO.output(Motor_PIN_1, 0) 46 GPIO.output(Motor_PIN_2, 0) 47 48 49class Tab1Widget(QWidget): 50 51 def __init__(self): 52 super().__init__() 53 self.title = "GUI test" 54 self.left = 10 55 self.top = 10 56 self.width = 640 57 self.height = 480 58 self.initUI() 59 self.counter = 0 60 61 def initUI(self): 62 63 64 super(Tab1Widget, self).__init__() 65 66 67 btn1 = QPushButton("自動", self) 68 btn2 = QPushButton("停止", self) 69 70 btn1.clicked.connect(self.auto ) 71 btn2.clicked.connect(self.stop ) 72 73 self.textbox4 = QLineEdit(self) 74 75 76 label3 = QLabel("自動ドア") 77 label4 = QLabel("ドアの状態") 78 79 layoutA = QGridLayout() 80 layoutA.addWidget(label4,0,0) 81 layoutA.addWidget(self.textbox4,0,1) 82 layoutA.addWidget(btn1,1,0) 83 layoutA.addWidget(btn2,1,1) 84 85 layoutB = QVBoxLayout() 86 layoutB.addWidget(label3) 87 layoutB.addLayout(layoutA) 88 89 self.setLayout(layoutB) 90 91 self.show() 92 93 def auto(self): 94 95 self.thread = QThread() 96 97 self.worker = auto.Worker() 98 self.worker.moveToThread(self.worker.process) 99 self.worker.doorOpened.connect(self.func) 100 101 self.thread.start() 102 103 def func(self): 104 105 self.textbox4.setText("OPEN") 106 107 108 def stop(self): 109 110 auto.M_Stop() 111 112 113 114 115if __name__ == "__main__": 116 app = QApplication(sys.argv) 117 ex = Tab1Widget() 118 sys.exit(app.exec_()) 119
python
1#ファイル名「autodoor2.py」 2 3import sys 4from PyQt5.QtWidgets import * 5from PyQt5.QtGui import * 6from PyQt5.QtCore import * 7import subprocess 8import time 9import numpy as np 10import cv2 11import RPi.GPIO as GPIO 12 13 14Shoden_PIN=22 15 16Motor_PIN_1=24 17Motor_PIN_2=25 18 19Reed_PIN_1=17 20Reed_PIN_2=27 21 22GPIO.setmode(GPIO.BCM) 23GPIO.setup(Shoden_PIN, GPIO.IN) 24GPIO.setup(Reed_PIN_1, GPIO.IN) 25GPIO.setup(Reed_PIN_2, GPIO.IN) 26 27def _init_GPIO(): 28 GPIO.setmode(GPIO.BCM) 29 GPIO.setup(Motor_PIN_1, GPIO.OUT) 30 GPIO.setup(Motor_PIN_2, GPIO.OUT) 31 32def Motor_Forward(): 33 _init_GPIO() 34 GPIO.output(Motor_PIN_1, 1) 35 GPIO.output(Motor_PIN_2, 0) 36 37def Motor_Backward(): 38 _init_GPIO() 39 GPIO.output(Motor_PIN_1, 0) 40 GPIO.output(Motor_PIN_2, 1) 41 42def Motor_Stop(): 43 _init_GPIO() 44 GPIO.output(Motor_PIN_1, 0) 45 GPIO.output(Motor_PIN_2, 0) 46 47 48def M_Stop(): 49 Motor_Stop() 50 time.sleep(1) 51 GPIO.cleanup() 52 53 54 55class Worker(QObject): 56 doorOpened = pyqtSignal() 57 58 def __init__(self.parent = None): 59 QObject.__init__(self, parent = parent) 60 61 def process(self): 62 while 1: 63 if GPIO.input(Shoden_PIN)==GPIO.HIGH: 64 Motor_Forward() 65 while 1: 66 if GPIO.input(Reed_PIN_2)==GPIO.HIGH: 67 GPIO.cleanup() 68 Motor_Stop() 69 time.sleep(1) 70 GPIO.cleanup() 71 Motor_Backward() 72 while 1: 73 if GPIO.input(Reed_PIN_1)==GPIO.HIGH: 74 self.textbox4.setText("CLOSE") 75 GPIO.cleanup() 76 Motor_Stop() 77 GPIO.cleanup() 78 break 79 80 else: 81 pass 82 83 break 84 85 else: 86 pass 87 else: 88 pass 89 90 91 self.doorOpened.emit() 92
補足
QThread を用いるにあたって幾つか分からないことがあります。これらについても教えてくださると幸いです。
①停止ボタンを押したら、きちんとモーターが止まるようになっていますか。もし、なっていなかったらどのように直せばよいでしょうか?
②テキストボックス4に、ドアが開いていたら「OPEN」、閉まっていたら「CLOSE」と出力されるようにしたいです。どのようしたらよいのでしょうか?
③「autodoor2.py(下のコード)」にある、「 doorOpened=pyqtSignal() 」の意味と何のために入れるのか、教えてください。
④同じく「autodoor.py」にある、「def init(self.parent=None)」と「QObject.init(self.parent=parent)」の意味についても教えてください。
⑤同じく「autodoor.py」にある、「self.doorOpened.emit()」の意味についても教えてください。
分からないことが多く、知識不足も重々承知しておりますが、一つでも教えていただけると幸いです。
どうかよろしくお願いします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/03 11:41
2020/06/03 12:15
2020/06/03 13:38 編集
2020/06/03 15:17 編集
2020/06/04 01:27
2020/06/04 05:03
2020/06/04 10:25