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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

298閲覧

Arduinoで連続でボタンを押しても問題なく動作するスケッチの仕方

fuma127

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2024/04/20 12:02

編集2024/04/21 02:47

実現したいこと

ボタンを押したら音が鳴る所謂変身ベルトを作りたい

発生している問題・分からないこと

希望どうりの動作をしているんですが
音が鳴っている間にボタンを連続で押すとボタン押下が検出されなくなってしまい
音が鳴りません、シリアルモニタもとまります。

該当のソースコード

//以下DF共通 #include "Arduino.h" #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" // IO10をRX, IO11をTXとしてアサイン SoftwareSerial mySoftwareSerial(10, 11); DFRobotDFPlayerMini myDFPlayer; void printDetail(uint8_t type, int value); //以上DF共通 #define STATE_A 1//変身前 #define STATE_B 2//変身後 uint8_t state = STATE_A;//変身前で初期化 uint8_t before_state ;//stateの前の状態を格納する void setup() { pinMode(9,INPUT_PULLUP);//変身ボタン pinMode(8,INPUT_PULLUP);//サブボタン //以下DF共通 Serial.begin(9600); mySoftwareSerial.begin(9600); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); // DFPlayerを初期化します。USBピンを使ってなければ、デバイスはSD(TF)カードが選択されます。 if (!myDFPlayer.begin(mySoftwareSerial)) { // 2秒以内に初期化できなかった場合はエラーメッセージを表示 Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while (true) { delay(0); // Code to compatible with ESP8266 watch dog. } //以上DF共通 } } void loop() { //押下時の動作 if(state == STATE_A && digitalRead(9)==LOW) //変身前かつボタンを押下したとき { Serial.println("変身しました"); state= STATE_B;//状態を変身後に移行する before_state = STATE_A; //前状態を格納 myDFPlayer.volume(15); // ボリュームをセット。(ボリュームは0から30の値で指定可能) myDFPlayer.play(2); // 変身音声 delay(500); } if(state == STATE_B && digitalRead(9)==LOW)//変身後かつボタンを押下したとき { Serial.println("変身解除しました"); state=STATE_A; //状態を変身前に移行する before_state = STATE_B;//前状態の格納 myDFPlayer.volume(15); // ボリュームをセット。(ボリュームは0から30の値で指定可能) myDFPlayer.play(1); // 変身解除 delay(500); } if(digitalRead(8)==LOW&&state==STATE_B) { myDFPlayer.volume(15); // ボリュームをセット。(ボリュームは0から30の値で指定可能) myDFPlayer.play(3); // アンデッド封印 delay(500); } //if()の中にswich文 delay(500); }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

チャタリングという現象が関係しているのかと思いGoogleで調べましたがよくわからなかったです。

追記

質問者様にご指摘頂いた通りdelay()を使って再生している間だけ処理を止める方法を試してみたところ再生中にボタンを連打しても検出がストップして問題なく動作するようになりました。しかし他の回答者様からご指摘頂いた点も現在調べていますのでベストアンサー回答はもう少しお時間頂きたいです。

補足

特になし

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

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

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

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

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

TakaiY

2024/04/20 15:29

> 音が鳴っている間にボタンを連続で押すとボタン押下が検出されなくなってしまい 変身の音声はどれくらいの長さですか? また、鳴っている間にボタンを押したとき、どのような動作をする想定ですか?
fuma127

2024/04/20 15:53

搭載している音声は3種類で長さは下記の通りです。 変身音声   5秒 アンデッド封印6秒 変身解除   4秒 鳴っている間に押された場合は検出せず鳴り終わってから検出が再開する。 を想定していたのですが今聞かれてみて他のことも実装してみたくなりましたので 一応お伝えさせていただきます。 ①変身音が鳴っている間に変身ボタンが押されたら変身音が途中で停止して 変身解除音声が鳴る。 ②変身音が鳴っている間にサブボタンが押された場合は変身が完了するまで検出されない。 ③変身解除が鳴っている間に変身ボタンが押されたら変身解除は途中で停止して変身音声が鳴る ④変身解除が鳴っている間にサブボタンが押された場合は検出されず、変身解除完了後もサブボタンは検出されない。 何かアドバイス等ありましたらお願いします。
jimbe

2024/04/20 17:58 編集

>鳴っている間に押された場合は検出せず鳴り終わってから検出が再開する。 どうやって鳴り終わりを検出するのでしょうか。 何故あちこちに delay(500) があるのでしょうか。 サブボタンの動作は変身ボタンと同じでしょうか。 myDFPlayer.play(3) によってアンデッド封印の音が鳴るのは確認していますか? アンデッド封印が鳴る(はずの)個所にも Serial.println("アンデッド解除しました") みたいな表示を入れて捜査したら、表示はされますか?
fuma127

2024/04/20 18:23

鳴り終わりの検知については元々出来ない物と考えていたので本来なっている間にボタンを押した時の動作 を聞かれたのでもしかしたら出来るんじゃ無いか もしどなたかご存知であればという気持ちで書いてしまいました。やり方を知らずに記載してしまい 誤解を与えてしまってすみません。 delay(500)についてですがよく理解をしておらず 処理の合間に記載することでチャタリングを防止する はず といった感じであまり理解せず使っていました 今までdelayが理由で問題になることも無かったので今回指摘頂き初めてよく無いことだと気がつきました しっかり意味を理解して使うようにします。 サブボタンの動作は 変身状態でのみ押下の検出が有効になり、押下を検出した場合はアンデット封印音声が再生されるので変身ボタンとは違います。 アンデット封印が鳴るのは元から確認出来ています。 表示も先ほど仕込みましたが出力されました。
jimbe

2024/04/20 18:41

すみません書き方が悪かったです。 >サブボタンの動作は変身ボタンと同じでしょうか。 というのは、物理的なボタンのことです。 もしかして変身ボタンとして使っているのは push でサブボタンは toggle なのでは無いかと。
jimbe

2024/04/20 18:57

3つの音とも、鳴ってる間は他の音は鳴らせない(ボタン操作できない)ということなら、いっそ play 後にそれぞれの演奏時間分 delay してしまう(loopを止めてしまう)というのもテかもしれません。
fuma127

2024/04/20 19:26

そういうことでしたか!物理的なボタンは2つともモーメンタリと言われる物なのでトグルのように一度操作すると戻すまではというものではないです。 今演奏時間分のdelayを書き込んだところ 演奏中にボタンを連打しても検出はされずに 演奏後再度ボタンが検出されるようになりました。 delayにはこんな使い方もあったんですね、勉強になりました。ありがとうございます。
TakaiY

2024/04/21 01:05

質問者さん、ここは質問に対するコメントを書くところなので、回答に有用な情報は、質問を編集して修正/追記するのがいいと思いますよ。
fuma127

2024/04/21 02:41

ご指摘ありがとうございます。 編集しないと同じこと解決したことを回答して頂くことになってしまいますよね、気をつけます。 今から編集します。
guest

回答2

0

昔ちょっと書いたのがなにか参考になりますでしょうか。

#もう2年前なのか...

投稿2024/04/20 13:31

thkana

総合スコア7652

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

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

fuma127

2024/04/20 15:36

情報提供ありがとうございます。 今作成されていた記事を確認しています、countがカギになる?ってとこまでは理解したように気がするのですが、それを自分の作ったものにどう活用するのかを模索しています、進捗ありましたらまたお伝えします。
guest

0

loopの最後にdelay(500)が入っていますので、ボタンが押されているかどうかは500msに1回=1秒に2回しかチェックしません。押しかたにもよりますが、ボタンをポンと押したときに検知される確率は低めだと思います。チャタリングを気にされているようですが、今回の件はそうではないので100msとか50msくらいがいいのではないかと思います。(極端なことを言えば無くてもいい)

ドキュメントを見てもmyDFPlayer.play()が仕様上どのように動作するかわからないのですが、

  • どのタイミングで返るのか
    mp3の再生が終ってからなのか、即座に返り鳴りづづけるのか。(コメントからは後者のようですが)
  • 鳴っている間にさらにmyDFPlayer.play()を呼ぶとどうなるか。
    無視されるのか、前のものが止まって新に再生するのか。(質問からは前者のようですが)

仕様を確認するとか、他のプログラムを作って確認してみるといいのですが、すぐ返り、鳴っている間はplayを無視するとした場合、仕様を見るとstop()というメソッドがあるようなので、それぞれのボタンを押したときに、このstop()メソッドを入れてみてはどうでしょうか。

投稿2024/04/21 01:17

TakaiY

総合スコア12779

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

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

fuma127

2024/04/21 03:07

回答ありがとうございます、皆様にご指摘いただいて気づいたのですがdelay()の使い方をよく知らずに使っていたのも今回の失敗の原因の一端だと感じています。 dfpjlayerの件についてと仰る通り実際作って見るのが1番だと気づきました、stop()を使って何か検知したら止めて再生をする、を作ってみようと思います。 今外出中なので取り掛かるのは遅くなってしまうのですが、必ずやります。 教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問