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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Raspberry Pi

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

Q&A

解決済

2回答

1262閲覧

Raspberry Piでタクトスイッチを押した瞬間にループ処理(while)を抜けたい

skmt33

総合スコア11

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Raspberry Pi

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

0グッド

0クリップ

投稿2020/01/13 08:21

お世話になります。当方初心者のため教えて下さい。

前提・実現したいこと

Raspberry Piで、LED2つ(赤、緑)を交互に点滅させ、タクトスイッチを押したら2つのLEDの点滅を停止するものを作りたいです。試しに作成したプログラムは以下です。

import RPi.GPIO as GPIO from time import sleep import time GPIO.setmode(GPIO.BCM) SW_01 = 5 # SW1 LED_01 = 17 # LED1 LED_02 = 27 # LED2 GPIO.setup(SW_01, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LED_01, GPIO.OUT) GPIO.setup(LED_02, GPIO.OUT) try: while True: GPIO.output(LED_01, GPIO.HIGH) GPIO.output(LED_02, GPIO.LOW) time.sleep(0.5) GPIO.output(LED_01, GPIO.LOW) GPIO.output(LED_02, GPIO.HIGH) time.sleep(0.5) if GPIO.input(SW_01)==GPIO.HIGH: break sleep(0.01) except KeyboardInterrupt: pass GPIO.cleanup()

発生している問題・エラーメッセージ

while(ループ処理)中に、タクトスイッチを押したらすぐにwhileを抜けてLEDの点滅を停止させたい(下記)のですが、しばらく(1~2秒)押し続けないと消えません。
何故でしょうか?time.sleep(0.5)が2箇所あるためでしょうか?
すぐにbreakさせたい場合どうすればいいですか?ネットで調べる限り割り込み処理といったものが必要そうという程度はわかりましたが、詳細がわかりませんでした。教えて下さい。

if GPIO.input(SW_01)==GPIO.HIGH: break

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

ラズビアンのverはRaspbian GNU/Linux 9 (stretch)です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

何故でしょうか?time.sleep(0.5)が2箇所あるためでしょうか?

そうですね。それがまずいです。しかし

割り込み処理といったものが必要そう

そんなことはありません。ちょっとした工夫で十分です。つまり、0.5秒x2なんていう長い時間連続して寝込みさえしなければ(sleepしなければ)いいのです。

例えば、0.01秒ずつ50回寝れば、トータルでは0.5秒寝たことになりますね。その合間合間にスイッチをチェックすれば、人間の反応速度からすれば、スイッチを押してから10ms後に反応があったとしても「遅い」と感じることはないでしょう(それでもダメなら0.005秒ずつ100回にしましょうか)

ループの部分を例えばこんなふうにしてみたら? (反転とかxorで書きたいところをわかりやすさ優先で抑えています。適宜かっこよく?書き換えてもいいでしょう)

Python

1 count=0 2 blink=0 3 while True: 4 if blink == 0 : 5 GPIO.output(LED_01, GPIO.HIGH) 6 GPIO.output(LED_02, GPIO.LOW) 7 else : 8 GPIO.output(LED_01, GPIO.LOW) 9 GPIO.output(LED_02, GPIO.HIGH) 10 count=count+1 11 if count >= 50 : # 50*0.01秒経過した 12 count = 0 # カウンタクリア 13 if blink == 0 : #点灯状態反転 14 blink = 1 15 else : 16 blink = 0 17 if GPIO.input(SW_01) == GPIO.HIGH: 18 break 19 time.sleep(0.01)

投稿2020/01/13 09:13

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skmt33

2020/01/13 09:53

thkanaさん、y_waiwaiさん ご回答ありがとうございました。大変参考になりました。 実際に試してみたところ、意図通りの動きになりました。 ありがとうございました!
guest

0

time.sleepという関数は、何もしないでその秒数待ちます
この待ってる間はスイッチも読みません。

ということで、あなたの思うようにするためには、このsleep関数を使わないで、この(秒数分)待つ間にスイッチを読み込んで、押されていれば抜けてくるような処理を書かないといけません。


だいたい、でいいなら、
time.sleep(0.5)
のかわりに、

python

1 time.sleep(0.1) 2 if GPIO.input(SW_01)==GPIO.HIGH: 3 break 4 time.sleep(0.1) 5 if GPIO.input(SW_01)==GPIO.HIGH: 6 break 7 time.sleep(0.1) 8 if GPIO.input(SW_01)==GPIO.HIGH: 9 break 10 time.sleep(0.1) 11 if GPIO.input(SW_01)==GPIO.HIGH: 12 break 13 time.sleep(0.1) 14 if GPIO.input(SW_01)==GPIO.HIGH: 15 break

をいれるというテでどうでしょう

#これ、なにやってるかわかりますかw

投稿2020/01/13 08:38

編集2020/01/13 09:00
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問