実現したいこと
プログラミング初心者です。
前回作成した、センサーでモーターを制御するというプログラムの延長です。前回のプログラムの内容を簡単に説明すると、
センサーに反応がない場合はモーターを稼働、反応があった場合はモーターを停止、反応が無くなった場合はモーターを再稼働させるといったものです。
今回は、「反応があって停止した時点から数秒後にセンサーを切って、モーターを再稼働させる」ということを目標にしています。「GPIO.output(〇, 〇)」とは使い勝手が違うので苦戦しています。どなたか解決策を教えていただけないでしょうか。
もし、センサーを切らずに停止後、再稼働させる方法があればそちらも教えていただきたいです。よろしくお願いします。下記は現在のプログラムです。
Python3
1import RPi.GPIO as GPIO 2import time 3import sys 4import datetime 5GPIO.setwarnings(False) 6GPIO.setmode(GPIO.BOARD) 7 8motor1speed=15 9motor1Direction=21 10SENSOR_PORT = 24 11LED = 35 12 13 14GPIO.setup(19,GPIO.OUT) 15GPIO.setup(motor1speed,GPIO.OUT) 16GPIO.setup(motor1Direction,GPIO.OUT) 17GPIO.setup(SENSOR_PORT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 18GPIO.setup(LED, GPIO.OUT) 19 20#モーター制御 21def motorstart(): 22 pwm = GPIO.PWM(19, 100) 23 pwm.start(0) 24 GPIO.output(motor1Direction, 0) 25 pwm.ChangeDutyCycle(40) 26 pwmR = GPIO.PWM(motor1speed, 100) 27 pwmR.start(0) 28 GPIO.output(motor1speed, 1) 29 pwmR.ChangeDutyCycle(23) 30 31motorstart() 32 33while True: 34 try: 35 if(GPIO.input(SENSOR_PORT) == 0): 36 motorstart() 37 GPIO.output(LED, GPIO.LOW) 38 39 else: 40 GPIO.output(LED, GPIO.HIGH) 41 42 except KeyboardInterrupt: 43 GPIO.cleanup() 44 sys.exit()
追記
回答者様から頂いたプログラムを付け加えてみました。問題視していた「センサーの状態を無視する」という点は解決しましたが、停止から3秒後のモーターの再始動がうまくいかず、再始動時に本来なら回転させたいところですが一瞬だけ(1~5°程度)動いて、その後は停止した状態になってしまいます。
間違っている部分があれば、ご指摘よろしくお願いします。
Python3
1import RPi.GPIO as GPIO 2import time 3import sys 4import datetime 5GPIO.setwarnings(False) 6GPIO.setmode(GPIO.BOARD) 7 8motor1speed=15 9motor1Direction=21 10SENSOR_PORT = 24 11LED = 35 12 13 14GPIO.setup(19,GPIO.OUT) 15GPIO.setup(motor1speed,GPIO.OUT) 16GPIO.setup(motor1Direction,GPIO.OUT) 17GPIO.setup(SENSOR_PORT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 18GPIO.setup(LED, GPIO.OUT) 19 20#モーター制御 21def motorstart(): 22 pwm = GPIO.PWM(19, 100) 23 pwm.start(0) 24 GPIO.output(motor1Direction, 0) 25 pwm.ChangeDutyCycle(40) 26 pwmR = GPIO.PWM(motor1speed, 100) 27 pwmR.start(0) 28 GPIO.output(motor1speed, 1) 29 pwmR.ChangeDutyCycle(23) 30 31def motorstop(): 32 GPIO.output(motor1speed, 0) 33 GPIO.output(motor1Direction, 0) 34 35motorstart() 36 37restart_flag = False 38while True: 39 try: 40 if restart_flag: 41 continue 42 if(GPIO.input(SENSOR_PORT) == 0): 43 motorstart() 44 GPIO.output(LED, GPIO.LOW) 45 46 else: 47 GPIO.output(LED, GPIO.HIGH) 48 motorstop() 49 time.sleep(3) 50 motorstart() 51 restart_flag = True 52 53 except KeyboardInterrupt: 54 GPIO.cleanup() 55 sys.exit()
補足情報(FW/ツールのバージョンなど)
Python 3.7.2
回答3件
あなたの回答
tips
プレビュー