環境
Python 3.x
RaspberryPi 3 B
PyQt5
内容
自動ドアの開閉コードを作成してみました。
おかしな点があれば教えてください。
「この自動ドア、ドアが閉まってるときに物体検知をしても完全に閉まるまで開かないじゃん」というツッコミがあるかもしれませんが、今後改良をしていきたいと考えています。
今回は、このコードを実行させても動作上問題ないかということの添削をお願いします。
特に、def auto(self) 内の while 1: 以降をよろしくお願いします。
作成したコード
python
1import sys 2from PyQt5.QtWidgets import * 3from PyQt5.QtGui import * 4from PyQt5.QtCore import * 5import subprocess 6import time 7import numpy as np 8import cv2 9import RPi.GPIO as GPIO 10 11 12Shoden_PIN=22 13 14Motor_PIN_1=24 15Motor_PIN_2=25 16 17Reed_PIN_1=17 18Reed_PIN_2=27 19 20GPIO.setmode(GPIO.BCM) 21GPIO.setup(Shoden_PIN, GPIO.IN) 22GPIO.setup(Reed_PIN_1, GPIO.IN) 23GPIO.setup(Reed_PIN_2, GPIO.IN) 24 25def _init_GPIO(): 26 GPIO.setmode(GPIO.BCM) 27 GPIO.setup(Motor_PIN_1, GPIO.OUT) 28 GPIO.setup(Motor_PIN_2, GPIO.OUT) 29 30def Motor_Forward(): 31 _init_GPIO() 32 GPIO.output(Motor_PIN_1, 1) 33 GPIO.output(Motor_PIN_2, 0) 34 35def Motor_Backward(): 36 _init_GPIO() 37 GPIO.output(Motor_PIN_1, 0) 38 GPIO.output(Motor_PIN_2, 1) 39 40def Motor_Stop(): 41 _init_GPIO() 42 GPIO.output(Motor_PIN_1, 0) 43 GPIO.output(Motor_PIN_2, 0) 44 45 46class Tab1Widget(QWidget): 47 48 def __init__(self, parent=None): 49 super().__init__(parent) 50 51 self.qt_thread = None 52 #self.running = False 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 btn1 = self.auto_button = QPushButton("自動", self) 67 btn2 = self.stop_button = QPushButton("停止", self) 68 69 btn1.clicked.connect(self.auto ) 70 btn2.clicked.connect(self.stop ) 71 72 self.textbox4 = QLineEdit(self) 73 74 75 label3 = QLabel("自動ドア") 76 label4 = QLabel("ドアの状態") 77 78 layoutA = QGridLayout() 79 layoutA.addWidget(label4,0,0) 80 layoutA.addWidget(self.textbox4,0,1) 81 layoutA.addWidget(btn1,1,0) 82 layoutA.addWidget(btn2,1,1) 83 84 layoutB = QVBoxLayout() 85 layoutB.addWidget(label3) 86 layoutB.addLayout(layoutA) 87 88 self.setLayout(layoutB) 89 90 self.show() 91 92 def closeEvent(self, event): 93 self.stop() 94 95 if self.qt_thread: 96 self.qt_thread.wait(2000) 97 98 super().closeEvent(event) 99 100 def stop(self): 101 GPIO.cleanup() 102 Motor_Stop() 103 time.sleep(1) 104 GPIO.cleanup() 105 if self.qt_thread: 106 self.qt_thread.requestInterruption() 107 108 109 110 def setCount(self, alpha): 111 self.textbox4.setText("{}".format(alpha)) 112 113 114 def auto(self): 115 116 class MyQtThread(QThread): 117 118 sendString = pyqtSignal(str) 119 120 def run(self): 121 while 1: 122 if self.isInterruptionRequested(): 123 break 124 125 if GPIO.input(Shoden_PIN)==GPIO.HIGH: #物体検知 126 door="OPENED" 127 self.sendString.emit(door) 128 Motor_Forward() #ドアが開く 129 130 while 1: 131 if self.isInterruptionRequested(): 132 return 133 134 if GPIO.input(Reed_PIN_2)==GPIO.HIGH: #ドアが開ききる 135 GPIO.cleanup() 136 Motor_Stop() 137 time.sleep(1) 138 139 if self.isInterruptionRequested(): 140 return 141 142 GPIO.cleanup() 143 Motor_Backward() #ドア閉まる 144 145 while 1: 146 if self.isInterruptionRequested(): 147 return 148 149 if GPIO.input(Reed_PIN_1)==GPIO.HIGH: #ドアが閉まりきる 150 GPIO.cleanup() 151 Motor_Stop() 152 door="CLOSED" 153 self.sendString.emit(door) 154 time.sleep(1) 155 GPIO.cleanup() 156 break 157 158 else: 159 pass 160 161 break 162 163 else: 164 pass 165 break 166 167 else: 168 pass 169 170 171 thread = self.qt_thread = MyQtThread() 172 173 thread.sendString.connect(self.setCount) 174 175 self.stop_button.clicked.connect(self.stop) 176 177 thread.finished.connect(lambda: print("Qt Thread Finished")) 178 thread.start() 179 180 181if __name__ == "__main__": 182 app = QApplication(sys.argv) 183 ex = Tab1Widget() 184 sys.exit(app.exec_())
また、while内をもう1パターン作成してみました。
python
1while 1: 2 if self.isInterruptionRequested(): 3 break 4 5 while GPIO.input(Shoden_PIN)==GPIO.HIGH: #物体検知 6 door="OPENED" 7 self.sendString.emit(door) 8 if self.isInterruptionRequested(): 9 return 10 time.sleep(0.5) 11 12 Motor_Forward() #ドアが開く 13 14 while if GPIO.input(Reed_PIN_2)==GPIO.HIGH: #ドアが完全に開く 15 if self.isInterruptionRequested(): 16 return 17 time.sleep(0.5) 18 19 GPIO.cleanup() 20 Motor_Stop() 21 time.sleep(0.5) 22 GPIO.cleanup() 23 24 Motor_Backward() #ドアが閉まる 25 26 while GPIO.input(Reed_PIN_1)==GPIO.HIGH: #ドアが完全に閉まる 27 door="CLOSED" 28 self.sendString.emit(door) 29 if self.isInterruptionRequested(): 30 return 31 time.sleep(0.5) 32 33 GPIO.cleanup() 34 Motor_Stop() 35 time.sleep(0.5) 36 GPIO.cleanup()
>while if GPIO.input(Reed_PIN_2)==GPIO.HIGH:
"while if" という構文はないのと、
while に書く場合は、これでは入力がHIGHの場合にループ内を実行となり
入力がHIGHになるまでの待機ループになってません。
コードのレイアウトとしては、ループの構造が過剰にネストしない後者のコードが良いのですが
中のロジックが全く変わってしまってます。
while if はコピペ時のミスでした。申し訳ありません。
while GPIO.input(Reed_PIN_2)==GPIO.HIGH:
↓
while GPIO.input(Reed_PIN_2) != GPIO.HIGH:
に直します。
回答2件
あなたの回答
tips
プレビュー