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

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

ただいまの
回答率

90.75%

  • Python

    6803questions

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

  • Python 3.x

    5275questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1202questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Raspberry Pi

    709questions

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

raspberrypiでプログラム実行中に物理ボタンを押すとまた最初から実行させる処理の仕方

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 709

Ruteshi

score 17

前提・実現したいこと

raspberrypiでGPIOを使用しタクトスイッチを押したら音楽を鳴らし鳴っている最中に同じボタンを押すとまたその曲の頭から音楽を鳴らすプログラムを実行させる記述

参考にさせて戴いたサイトを参考にボタンを押したらMP3を再生するプログラムを作成しましたのですがボタンを押して音楽を再生させ再生中にまた同じボタンを押すとその音楽の頭から再生させるというプログラムを作成したいです。

ボタンを押す→曲が鳴る→鳴っている最中にボタンを押す→また最初から音楽が鳴る→~

参考にさせていただいたサイト
http://robocad.blog.jp/archives/678444.html
Raspberry Pi タクトスイッチの入力を扱う その1

該当のソースコード

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(24, GPIO.IN) 

try:
while True:
if GPIO.input(24) == GPIO.HIGH:
check = commands.getoutput("mpg321 test.mp3")
GPIO.output(25, GPIO.HIGH)
else:
GPIO.output(25, GPIO.LOW)
sleep(0.01)

except KeyboardInterrupt:
pass

GPIO.cleanup() 

(「mpg321」はraspberrypiでmp3を再生させるコマンド)
(「test.mp3」←再生させたいmp3)

試したこと

「割り込み」処理?ではないかと思うのですが調べても僕の考える「割り込み」と調べて出てくる「割り込み」は何か違うような気がします。

最近やっと変数を理解しだしたばかりの初心者です
どこをどのようにしたらいいか皆目見当がつきません
なにかヒントでも頂けたらと思いこのサイトでご質問させていただきました
お考えつく方何卒よろしくお願いいたします。

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

raspberrypi,python,GPIO

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

参考とされたHPRaspberry Pi タクトスイッチの入力を扱う その1を読んでみると抵抗により”PullDown”(常時LOWでタクトスイッチを押すとHIGH)の処理と理解して。
貴殿のソースを見ると、”LOW”の間、無制限で’commands.getoutput("mpg321 test.mp3")’を何度も呼び出す処理に見えます。私ならで記載しますが、以前の状態を適当な変数に保持して(”LOW”状態)これが”HIGH”になった時のみ動作させる方法が良いのでは?(通常はトリガーと言われます)。
突っ込んで言いますとGPIOの24がHIGH”の間は何度も繰り返す状態ではなく、”LOW”から”HIGH”に遷移(変化)した時だけにすれば良いかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/17 12:26

    MasahikoHirataさん
    お返事ありがとうございます
    ご指摘を受けましたMasahikoHirataさんの前半のお話ですが参考サイトさんの「Raspberry Pi タクトスイッチの入力を扱う その1」に記載(UP)されているyoutube動画「raspberrypi タクトスイッチを押している間光LED」の様に本当に押した時だけ音楽がなります。押さないと待機状態?になっています。

    後半のお話しですがループにしないということでしょうか?実際に僕が作った物でボタンを押してもその曲が終わるまで何も受け付けない状態になります。
    ボタンを押す→曲が鳴る→鳴っている最中にボタンを押す→何も変わらず曲が流れている→終わる→最初に戻る

    キャンセル

  • 2017/12/17 14:41

    おそらく参考にされているHPではループの中ではGPIOの出力の制御だけですが、貴殿の実現したい音の再生では再生が終了するまでループに帰って来ないのでは?実現したいものは再生開始、再生中に”LOW"の入力(”HIGHからLOWへの遷移”)が有ったら再度頭から再生だと思うのですが。つまり”LOW"になった時に頭から再生で、再生プログラムから直ぐにループに戻るようにする必要があると思いますが。

    キャンセル

  • 2017/12/19 23:34

    MasahikoHirataさん
    お返事遅れてしまい申し訳ないです
    >>再生が終了するまでループに帰って来ないのでは?
    そうです、音楽事態が終わるまで帰ってきません。

    MasahikoHirataさんの仰られているのは
    ボタンを押す((HIGH)音楽が鳴る)→ボタンを離す(LOW)頭から再生になると思うのですが…

    要は押す度、押す度、頭から再生されれば良いのです
    今回は音楽を再生って事ですが他のプログラムに置き換えてもらっても構いません
    (ボタンを押す度にまた最初から実行してくれれば)

    キャンセル

  • 2017/12/25 23:58

    commands.getoutputだと実行が終わるまでPython側のプログラムが止まってしまうので、キー入力を監視することができません。
    subprocess.Popenを使用して再生プログラムを新しいプロセスで実行し、ループ内でPopen.pollで実行状況の確認、Popen.terminateで実行を中止することができます。
    https://docs.python.jp/3/library/subprocess.html

    Pythonのバージョンが古すぎるといけませんが…

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python

    6803questions

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

  • Python 3.x

    5275questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1202questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Raspberry Pi

    709questions

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