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

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

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

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

Q&A

解決済

2回答

931閲覧

トグルスイッチの割り込みでインクリメントしたい。

Kome_nuka

総合スコア2

Arduino

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

0グッド

1クリップ

投稿2022/05/18 08:22

前提

前回トグルスイッチの割り込み処理でLEDの色を変化させる方法を
thkanaさん(その節は大変お世話になりました) にご教授頂いたのですが、
前回のプログラムの発展で、トグルスイッチの状態変異回数をカウント
しなければならなくなりました。

実現したいこと

  • トグルスイッチのON、OFF回数をカウントしたい。
  • ゆくゆくはこの回数を利用してLEDの点灯回数を制御する予定です。

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

割り込み内でトグルスイッチをインクリメントすると
数値が1ずつプラスされない。
例:1→7→8→16→........

該当のソースコード

Arduino

1#include "mono_con.h" 2 3volatile bool tswstate; 4bool tswstate0; 5volatile long tswcnt; 6 7 8void setup() { 9 10 pinMode(IN2, INPUT); 11 tswstate0=digitalRead(IN2); 12 13 pinMode(FCLED_G, OUTPUT); 14 pinMode(FCLED_B, OUTPUT); 15 pinMode(FCLED_R, OUTPUT); 16 17 attachInterrupt(digitalPinToInterrupt(IN2), TSWCNT, CHANGE); 18 19 tswstate = LOW; 20 21 digitalWrite(FCLED_G, LOW); 22 digitalWrite(FCLED_B, LOW); 23 digitalWrite(FCLED_R, LOW); 24 25 Serial.begin(9600); 26 27} 28 29 30void TSWCNT(void) { 31 tswstate = tswstate0 ^ digitalRead(IN2); 32 tswcnt++;//ここをどうすればよいか 33 34 Serial.println(tswcnt,DEC); //変移回数の確認 35} 36 37void loop() 38{ 39//省略(LEDの色の変更です) 40}

補足情報

Arduino IDE 1.8.19

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

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

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

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

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

guest

回答2

0

ベストアンサー

前の質問ではトグルスイッチの「状態」だけを知ればよいという前提でチャタリングが無視できましたが、回数を数えるとなればチャタリングは無視できません。何らかの対策が必要です。
だって、余計なON/OFFの変化が発生するのがチャタリングという現象なのですから、無造作にON/OFFの回数を数えたらモロにその影響をうけるのは当然です。
で、チャタリングは短い間隔でON/OFFが発生するというのが特徴ですから、チャタリングの影響を排するためには何らかの形で「時間」の要素を取り込まざるを得ません。

  • 一番簡単なのがチャタリングの発生期間(数十~100ms程度以下、トグルスイッチだとタクトスイッチよりもチャタの発生が多い/長い気がします)より長い間隔で定期的にスイッチ状態を取得して、それをスイッチ状態とすることでしょう。ただし、スイッチの操作から検出までの最悪値がそのサンプリング周期(一回サンプリングした直後に状態変化した場合)ということになります。
  • 数十msのデッドタイム(不感時間帯)が許容できないというなら、状態変化の割り込み発生時に時刻(millis()の値)を取得しておいて、前回の時刻より一定時間未満であれば反応させない、という手も考えられなくはないです。ただし、本当に「素早くスイッチをON->OFFした」なんていうことが起こると、実際のスイッチ状態とシステムの認識する状態が一致しなくなる可能性を否定できません。状態変化の割り込みハンドラ中でタイマーをキックして、その割り込みで例えば100ms後のスイッチ状態を確認する、なんていう作業が必要になるでしょう。
  • あるいは、例えば数ms毎にスイッチ状態をサンプリングして、一度変化が起こったらその後しばらくの間の変化を無視する、ということも考えられます。これだとある程度のリアルタイム性を確保しつつ、タイマー割り込みのみで処理することができるかと思いますが、割り込み処理の負担は大きくなります。

実際のスイッチの変化からどのくらいの時間でシステムに応答して欲しいのか、その要求によってとる手段が変わってくるかと思います。

(もちろん、この他にハード的に時定数を噛ませてチャタリングを除去する、という手段もあります)

投稿2022/05/18 12:48

thkana

総合スコア7639

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

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

Kome_nuka

2022/05/18 13:13

前回に引き続き有難うございます;; 具体的な対策方法まで教えて下さって感謝しかないです... 諸事情により試すのが遅くなるかも知れませんが、またその時は返信させて頂くと思いますのでよろしくお願いしますm(__)m
thkana

2022/05/18 15:31

試すのもいいけれど、「具体的に何をしたい」「そのシステムにはどういうスペックが要求される」ことを説明して頂きたいですね。あの場合、この場合、と推測してそれぞれの解を用意するのも疲れます。
Kome_nuka

2022/05/18 23:21

確かにそうですね...実はこれ、ある大会の課題なのですが、元の課題はトグルスイッチがON,OFFした回数分LEDを点灯する(色も変更する)という課題なんです。
thkana

2022/05/19 03:04

与えられたお題だからそんなの知るか、ということですね。 その大会のレギュレーションではSNS・掲示板などを含めて「誰かに助けてもらう」のがOKと明示されていますか? 一般にはそういうのはNGで、だとすると不正の片棒を担がされたことになって非常に不愉快、ということになるのですが。
Kome_nuka

2022/05/19 13:19

すいません、言葉が足らず不快にさせてしまって申し訳ないです... レギュレーションについては、大会は既に終わっているので大丈夫です。今は当日実地で出た課題をペアと解いている所です。
thkana

2022/05/20 11:49

なるほど、大会としては終わっていると。 では、なぜ > しなければならなくなりました なのでしょう? 初出がなにかの大会として、それが授業の課題に落ちてきたとかいうこと? それはともかくとして、プログラムを作る以上「どうするか」は決めなければどうにもなりません。 具体的な使用用途(もとの出題者の意図)を推定して、「このシステムがどう動くべきか」を考えて、「どこまで面倒にしてもいいか」をあなたが決めてください。
Kome_nuka

2022/05/20 15:58

・毎年開催なので後輩に繋いでいかなければならないからです... うちはarduinoを教えられる先生がいないため、ほぼ独学で出場している状況です。
Kome_nuka

2022/05/20 16:15

どう動くか→「トグルスイッチのON,OFFをカウントし、切り替えるたびにその回数分LEDが点灯(ON,OFF)する。(この時トグルの状態がHIGHかLOWかでLEDの色が赤か緑か決まる)点灯中に切り替えが行われた場合は次のLED点灯処理へ移る。(前の処理は中断して)」といった感じでしょうか 丸投げ感があって申し訳ないですが自分なりに書き出してみました
thkana

2022/05/22 01:03

arduino限定の話は何もしていないつもりですが。部活かなにかということですか? モノを作るには、まず「何を作るのか」「作ったものはどう動かなければいけないのか」を決めなければいけません。 実用に供するものであればその使い方からいろいろと決まってくるのですが、課題のための課題だとその辺とくに要求がなく、「あなたが」仮定をして作っていく要素もあるかも知れません。実験してみないとわからない項目があったりするのは仕方がない場合もありますが、逆に言えば「これは決まっていない/決めなければいけない」ということを明確にした上で作り始めればいい(あとで破綻のタネになることもありますが)話です。 この欄で話をするのに端折った部分があって「感じ」というのならいいですけれど、作ろうとしているものの把握が「こんな感じ」ということはないですね?
Kome_nuka

2022/05/22 15:16

・はい、部活のようなものです。 ・まだペーペーなのでご意見に対して学ぶことばかりです... ・そうですね、これでどうでしょうか?と言った解釈で大丈夫です。作るべきものは自分達の中では明確です。
guest

0

前にも言いましたが、

attachInterrupt(digitalPinToInterrupt(IN2), TSWCNT, CHANGE);

これではダメです

定周期のタイマ割り込みで、チャタリング除去&エッジ検出しよう
#詳細は前回の回答で

投稿2022/05/18 08:29

y_waiwai

総合スコア87774

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

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

Kome_nuka

2022/05/18 08:40

すいません..原理は理解できるのですがタイマー割り込みの経験がなく前回は完全にスルーしてしまっていました;
y_waiwai

2022/05/18 08:52

チャタリングとは何か、なぜこれで複数回カウントされるのか、ってところを理解しよう。
Kome_nuka

2022/05/18 08:55

チャタリングは理解できているつもりです。(waiwaiさんと比べてかなり浅いかもしれませんが)実際タクトスイッチではチャタリング除去をやっていました。
y_waiwai

2022/05/18 09:01

今回もそのチャタリング除去をやればいいのでは
Kome_nuka

2022/05/18 13:15

タクトスイッチはステータスをLOW,HIGHする(フラグを立てる)事で解決していましたので、今回のトグルスイッチではそのやり方は通用しなくて困ってます
y_waiwai

2022/05/18 13:20

定周期の割り込みでスイッチ状態をサンプルしてどーこーとすでに提示してますが、それではダメなんでしょうか
Kome_nuka

2022/05/18 23:26

MsTimer2が実は使っていいか分からなくて...ある大会の課題なので制限があって、出来れば大会の例題で使われていた割り込みで解決したかったんです(回りくどくて申し訳ないです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問