質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

センサー反応後にモーターを停止、数秒後にセンサーを一旦切ってモーターを再稼働させたいです

ryu-12
ryu-12

総合スコア2

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3回答

0評価

0クリップ

579閲覧

投稿2021/12/07 14:30

編集2021/12/09 07:40

実現したいこと

プログラミング初心者です。
前回作成した、センサーでモーターを制御するというプログラムの延長です。前回のプログラムの内容を簡単に説明すると、
センサーに反応がない場合はモーターを稼働、反応があった場合はモーターを停止、反応が無くなった場合はモーターを再稼働させるといったものです。
今回は、「反応があって停止した時点から数秒後にセンサーを切って、モーターを再稼働させる」ということを目標にしています。「GPIO.output(〇, 〇)」とは使い勝手が違うので苦戦しています。どなたか解決策を教えていただけないでしょうか。
もし、センサーを切らずに停止後、再稼働させる方法があればそちらも教えていただきたいです。よろしくお願いします。下記は現在のプログラムです。

Python3

import RPi.GPIO as GPIO import time import sys import datetime GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) motor1speed=15 motor1Direction=21 SENSOR_PORT = 24 LED = 35 GPIO.setup(19,GPIO.OUT) GPIO.setup(motor1speed,GPIO.OUT) GPIO.setup(motor1Direction,GPIO.OUT) GPIO.setup(SENSOR_PORT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LED, GPIO.OUT) #モーター制御 def motorstart(): pwm = GPIO.PWM(19, 100) pwm.start(0) GPIO.output(motor1Direction, 0) pwm.ChangeDutyCycle(40) pwmR = GPIO.PWM(motor1speed, 100) pwmR.start(0) GPIO.output(motor1speed, 1) pwmR.ChangeDutyCycle(23) motorstart() while True: try: if(GPIO.input(SENSOR_PORT) == 0): motorstart() GPIO.output(LED, GPIO.LOW) else: GPIO.output(LED, GPIO.HIGH) except KeyboardInterrupt: GPIO.cleanup() sys.exit()

追記

回答者様から頂いたプログラムを付け加えてみました。問題視していた「センサーの状態を無視する」という点は解決しましたが、停止から3秒後のモーターの再始動がうまくいかず、再始動時に本来なら回転させたいところですが一瞬だけ(1~5°程度)動いて、その後は停止した状態になってしまいます。
間違っている部分があれば、ご指摘よろしくお願いします。

Python3

import RPi.GPIO as GPIO import time import sys import datetime GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) motor1speed=15 motor1Direction=21 SENSOR_PORT = 24 LED = 35 GPIO.setup(19,GPIO.OUT) GPIO.setup(motor1speed,GPIO.OUT) GPIO.setup(motor1Direction,GPIO.OUT) GPIO.setup(SENSOR_PORT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LED, GPIO.OUT) #モーター制御 def motorstart(): pwm = GPIO.PWM(19, 100) pwm.start(0) GPIO.output(motor1Direction, 0) pwm.ChangeDutyCycle(40) pwmR = GPIO.PWM(motor1speed, 100) pwmR.start(0) GPIO.output(motor1speed, 1) pwmR.ChangeDutyCycle(23) def motorstop(): GPIO.output(motor1speed, 0) GPIO.output(motor1Direction, 0) motorstart() restart_flag = False while True: try: if restart_flag: continue if(GPIO.input(SENSOR_PORT) == 0): motorstart() GPIO.output(LED, GPIO.LOW) else: GPIO.output(LED, GPIO.HIGH) motorstop() time.sleep(3) motorstart() restart_flag = True except KeyboardInterrupt: GPIO.cleanup() sys.exit()

補足情報(FW/ツールのバージョンなど)

Python 3.7.2

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

thkana

2021/12/07 22:55

あなたにとっては「前回」で自明なのでしょうが、普通の回答者のためには「前回」のURL https://teratail.com/questions/372271 を示しておくのが親切というものかと思います。
thkana

2021/12/07 22:55

> 数秒後にセンサーを切って センサーを切る、とはどうなることですか?
ryu-12

2021/12/08 01:02

thkana様 前回に引き続き、ご指摘ありがとうございます。 >数秒後にセンサーを切って ここでの「センサーを切る」とは、「SENSOR_PORT」に来る入力信号を一旦止めたいという意味です。現状、物体を検知している間は当然ですが、永遠に入力信号が来てしまうのでモーターが止まったままになってしまっています。 一度、「GPIO.output(○○, 0)」のような原理でセンサーからの入力信号を止めようと考えましたが、うまくいきませんでした。どのようにプログラムを作成すれば良いか、教えていただけないでしょうか。
irognodyci

2021/12/08 01:23

一度検知してモーターを止めた後、センサーが検知していようがいまいが関係なくモーターを再始動させるんですよね?再始動させた後はセンサーを使わずに回し続けるという認識で合っていますか?
ryu-12

2021/12/08 01:45

irognodyci様 はい。その認識で会っています。欲を言えば、 「センサーが物体検知でモーターを停止→停止から数秒後に検知していようがいまいが関係なくモーターを再始動」この動作の流れを繰り返し行いたいのですが、できるでしょうか?
irognodyci

2021/12/08 05:32 編集

モータを再始動したタイミングで、すでに物体検知していた場合はどうするんですか?センサーの状態によらず(=センサーを無視して)再始動させるのはいいですが、繰り返したいとなると再びセンサーを有効にしないといけませんが、センサーを再び有効にするトリガーは何になるのでしょうか?
ryu-12

2021/12/08 07:36

irognodyci様 >モータを再始動したタイミングで、すでに物体検知していた場合はどうするんですか? これに関しては私も問題視していました。現在のプログラムの、 else: GPIO.output(LED, GPIO.HIGH) の部分に、 else: GPIO.output(LED, GPIO.HIGH) time.sleep(3) motorstart() というように付け加えて実験してみましたが、やはりセンサーが物体検知している状態なのでモーターの再始動が強制的に止められていました。センサーを無視するプログラムがわかればできそうなのですが… >センサーを再び有効にするトリガー これに関してはまだ思いついてないので、繰り返しの部分は後々考えたいと思います。現在はセンサーを無視するプログラムに専念しようと思います。どうかご協力お願いいたします。
thkana

2021/12/08 11:58

センサーをソフト的に「切る」手段は(これまであなたが提示した範囲では)用意されていません。 しかし、センサーを読みに行かなければ、あるいは読み取った結果をモーターの駆動条件に組み入れなければセンサーは「無視」されます。 「どのように動いてほしいのか」がちゃんと練れていないからそういう話になるのだと思います。 ・センサーが発報中はモーターが停止 ・モーターが停止してからN秒後にモーターの回転を開始 だけが条件では、当然センサーが発報していればN秒後に回り始めたモーターは即時停止します(事実上回らない)。 例えば、 ・一度センサーが発報したら以降はセンサーの状態は無視 という条件が付け加えられたなら、モーターはN秒後に再び回りだして二度と(電源を切るまで)止まらない、という動作をすることになります。 これはあくまで例で、これがあなたの希望する動作なのかは私には知る由もありません。 あなたの起こって欲しい動作をちゃんと記述してください。
ryu-12

2021/12/09 08:03

thkana様 ご指摘ありがとうございます。 現在、私が起こってほしい動作は、 1.モーターが始動、対象の物体を運搬 2.センサーが物体を検知、モーターを3秒間停止 3.3秒後センサーの状態を無視してモーターが再始動、物体の運搬を再開 4.物体の運搬後センサーの状態を無視するという動作をリセット、以後1,2,3の繰り返し です。現在は「3」の部分で問題が起きているので「4」に関しては後々考えていきます。
thkana

2021/12/09 14:48

4で、いつ(あるいはどのような条件で)センサーの無視をやめるのか、ということを決めないと 3での「無視」を成立させられないので今の事態になっている、といえるでしょう。 先送りしないで決めてください。暫定でもいいですれど、少なくとも「言われた通り」にしたらまともに動くだけの指示が必要です。 コンピュータは「この通りにやれ」と言われたことをその通りにやるだけです。「良きにはからえ」は通用しないので、言われた「この通り」の手順が破綻していれば当然コンピュータの動作結果も破綻します。コンピュータに何をやらせるか、ちゃんと考えてください。
ozwk

2021/12/10 02:23 編集

(すでにコメントで解決済みでした)
ryu-12

2021/12/10 03:15

thkana様 3での「無視」という点に関しては他の回答者様の回答をもとに解決させることができました。 あとはセンサーの無視をやめさせるための条件を作りたいという状態です。条件として、 「GPIO.output(○○, GPIO.HIGH)」のようなものでも条件として扱うことは可能でしょうか? できるのであれば、 「モーターを再始動」→「再始動から数秒後に(GPIO.○○をHIGHもしくはLOW)[条件]」→ 「センサーを再び有効化」。以後繰り返しにしようと考えています。
ryu-12

2021/12/10 05:39

ozwk様 閲覧していただき、ありがとうございます。 まだいくつかやるべき要素が残っているので、もし何かお気づきになられた点や、間違いなどがあった場合はご指摘いただけると幸いです。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。