前提・実現したいこと
前提:
趣味でラジコンをしています。ラズパイを積んだ車をpythonで動かしています。
今回質問させていただいている部分は、if文、try文、exceptやfinalなどの例外処理も試しています。
実現したいこと:
コントローラーでの操作をしつつ、ウルトラソニックセンサーが正面の障害物を検知した時は、一時停止する。
(前進ボタンを押し続けている間に、障害物を検知した場合は停止するようなプログラム)
質問:
・ifやtry文で両方の処理を実現できるかどうか
・gamepad.read_one()またはgamepad.read_loop()に代るコードで、実現できるものはないかどうか
発生している問題・エラーメッセージ
問題:
前進ボタンから手を離すと、障害物との距離が近い場合は停止する。(ボタンを押し続けている場合は、"障害物→停止"のコードに辿りつかない。
該当のソースコード
一度pdfに出力したものからコピペしたので、一部文字化けしてしまっています。
後ほど変更します。
Python
1while(1): 2event = gamepad.read_one() 3if event != None : 4#for event in gamepad.read_loop() : 5f = open(’./data/cam.txt’, mode=’r’) s=f.read() 6f.close() 7s = float(s) 8print("s␣=␣%3d" %(s)) if s != 0 : 9stop(in1,in2,in3,in4) print("Obstacles!!") sys.exit(0) 10if event.type == ecodes.EV_KEY: if event.value == 1: 11if event.code == yBtn: print("Y-medium") p.ChangeDutyCycle(50) p2.ChangeDutyCycle(50) 12elif event.code == bBtn: print("B-stop") 13elif event.code == cBtn: print("C-very␣high") p.ChangeDutyCycle(100) p2.ChangeDutyCycle(100) 14elif event.code == aBtn: print("A-QR␣mode␣press␣Ctrl+C␣to␣exit") capture_code() 15root.mainloop() 16elif event.code == xBtn: print("X-low") p.ChangeDutyCycle(25) p2.ChangeDutyCycle(25) 17elif event.code == zBtn: print("Z-high") p.ChangeDutyCycle(75) p2.ChangeDutyCycle(75) 18elif event.code == home: 19print("home-line␣auto␣mode␣press␣Ctrl+C␣to␣exit") p.ChangeDutyCycle(20) 20p2.ChangeDutyCycle(20) 21forward(in1, in2,in3,in4) 22try: 23while (1) : 24forward(in1, in2,in3,in4) 25if ((not GPIO.input(left_sensor)) and (GPIO.input(right_sensor))): 26print("move␣left") p.ChangeDutyCycle(0) p2.ChangeDutyCycle(70) sleep(0.5) 27elif ((not GPIO.input(right_sensor)) and (GPIO.input(left_sensor))): print("move␣right") 28p.ChangeDutyCycle(70) 29p2.ChangeDutyCycle(0) 30sleep(0.5) 31elif ((not GPIO.input(right_sensor)) and (not GPIO.input(left_sensor))) : 32i = random.randrange(100) print("Going␣back") p.ChangeDutyCycle(20) p2.ChangeDutyCycle(20) backward(in1,in2,in3,in4) sleep(0.5) 33if (i%2 == 0 ): p.ChangeDutyCycle(0) p2.ChangeDutyCycle(70) forward(in1, in2,in3,in4) sleep(0.2) 34else: 35p.ChangeDutyCycle(70) p2.ChangeDutyCycle(0) forward(in1, in2,in3,in4) sleep(0.2) 36else: print("Following␣the␣line!") p.ChangeDutyCycle(20) p2.ChangeDutyCycle(20) 37except KeyboardInterrupt: print(’exiting...’) GPIO.cleanup() print("GPIO␣Clean␣up") sys.exit(0) 38elif event.code == select: GPIO.cleanup() print("select-GPIO␣Clean␣up") break 39elif event.code == lTrig: print("PUMP␣OFF") pumpstop() 40elif event.code == rTrig: 41for event in gamepad.read_loop(): 42if event.type == ecodes.EV_KEY: if event.value == 0: 43if event.code == rTrig: break 44elif event.type == 3 : if event.code == 0 : 45if event.value == stick1: print("pump␣up") 46pe = pe + 10 47if (pe > 100) : 48pe = 100 print("pe␣=␣%3d" %(pe)) 49elif event.value == stick2: print("pump␣down") 502 51 pe = pe - 10 if (pe < 0) : 52pe = 0 print("pe␣=␣%3d" %(pe)) 53print("PUMP␣ON␣with␣pe␣=␣%3d" %(pe)) pump(pe) 54elif event.type == 3 : if event.code == 0 : 55if event.value == stick1: print("turn␣right") turn_right(in1, in2,in3,in4) temp1=0 56elif event.value == stick2: print("turn␣left") turn_left(in1, in2,in3,in4) temp1=0 57elif event.value == stickN: print("stick␣Neutral") stop(in1,in2,in3,in4) 58if event.code == 1 : 59if event.value == stick1: 60print("backward") backward(in1, in2,in3,in4) temp1=0 61elif event.value == stick2: print("stick␣forward") forward(in1,in2,in3,in4) temp1=1 62elif event.value == stickN: print("stick␣Neutral") stop(in1,in2,in3,in4)
試したこと
if文、try文、exceptやfinalなどの例外処理等を試しました。
前進のボタンを長押ししている間は、分岐がそれ以上進まず、前進の処理を続けています。
その途中で、障害物との距離が一定以下になっても止まらずに、ボタンから手を離して初めて停止します。
補足情報(FW/ツールのバージョンなど)
よろしくお願いします!
teratailを使うのもプログラミングについて他者に相談するのも初めてなので質問の仕方が上手くなくて申し訳ないです。