今回はスイッチが押されたことを検知する方法についてじっくり考えてみます。
スイッチ検知の問題点
「スイッチが押されたら50msだけピカッと光る」プログラムを作ったものの、そのような動作になりませんでした。そこで、前回の記事ではその理由を明らかにしました。
理由がわかったところで、今回は解決策を考え、スケッチを作成していきます。スイッチ検知がうまくいかなかった理由を忘れてしまった場合は、もう一度前回の記事を確認してみてください。
スイッチが押されたことを検知するには
「スイッチが押されたことを検知する」という動作を以下のようなif文で判断すると、
if( digitalRead(23) == 0 )
スイッチが押されている間、以下のように常に条件が成立して結果としてLEDが点灯したまま、となってしまいます。
ではどのような条件判断をすれば、以下のようにスイッチをONした後の最初のタイミングだけ検知することができるのでしょうか。
if文はloop関数で毎回同じ条件判断を繰り返しますので、if文の条件式は途中で変えることができません。上の図の赤い矢印のタイミングだけ成立するようなif(条件式)
を考える必要があります。
スイッチが押されたことを判断する方法
if文の条件を考えるために、スイッチの状態を確認するタイミング、つまりif文を実行するタイミングを減らして考えることにします。
繰り返しになりますが、if文がこのようなタイミングで実行される場合、以下の赤い矢印のタイミングだけ条件が成立するような条件式を考える必要があります。
赤い矢印のタイミングだけ成立するifの条件がわかれば、その条件が成立したときにLEDを50ms光らせれば、スイッチを押すとLEDがピカッと光る、という動作が実現できます。
この図をじっくりみると、少なくともすべての矢印のタイミングで「スイッチが押されているかどうか」だけの判定では、赤い矢印のタイミングだけ検知するのは不可能ですよね。
そこで、矢印のタイミングのスイッチの状態を書いて考えてみます。
もし、人がスイッチが押されたかどうかを認識する場合、どのように認識するでしょうか。自分が判定する場合の頭の中の様子をじっくり観察してみてください。
人が上の図のタイミングでスイッチ状態を確認しているとすると、スイッチが押された「最初のタイミング」だけを検知して「スイッチが押された!」って判定しますよね。
そのあとのタイミングでもスイッチONの状態が続いていますが、ONを検知するたびに「スイッチが押された!スイッチが押された!……..」なんて判定はしないですよね。一度ONを検知したあと、ONが続いても無視するはずです。
それでは、人は「最初のタイミング」はどのように判定しているのでしょうか。
おそらく「今までOFFだった」から最初の「ON」だけ検知できているのではないでしょうか。
このように、スイッチが「OFFからONに変わったタイミングのみ」検知しています。
つまり「前回のスイッチ状態」と「今回のスイッチ状態」を比較してスイッチが押されたことを判定しているのではないでしょうか。
そこで、以下のように「前回のスイッチ状態」と「今回のスイッチ状態」を比較してみましょう。
「スイッチが押された」と検知したいタイミングでは、前回のスイッチ状態がOFF、今回のスイッチ状態がONになっています。
他のタイミングはどうなっているか確認してみます。
このように、他のタイミングでは「OFF→OFF」「ON→ON」「ON→OFF」となっていて、検知したいタインミングの「OFF→ON」はどこにもありません。
ということで、スイッチが押されたことを検知するには、if文で以下の条件判断をすればよいことがわかります。
この考え方でスイッチが押されたことを検知することができるようになりそうです。
アルゴリズム
ところで、今回はスイッチが押されたことをどのように検知すればよいか、その手順や方法を考えました。
このように何かの動作を実現するための手順や方法を「アルゴリズム」と呼んでいます。
プログラミングの世界では、ある動作を実現するために命令をどのように組み合わせ、どのような手順で実現するか検討することが多々あります。このようなとき「アルゴリズムを検討する」や「どのようなアルゴリズムで実現すればよいか」などと言われます。
今回の記事では「スイッチを検知するためのアルゴリズム」を検討してきたわけです。
次回の記事では、今回考えたアルゴリズムを実現するためのプログラムを検討しましょう。
ミニチャレンジ課題
今回の記事では「スイッチが押されたことを検知する」というアルゴリズムを考えました。それでは、以下のアルゴリズムを考えてみてください。
スイッチが押され、そのあとスイッチが離されたタイミングを検知するアルゴリズム
更新履歴
日付 | 内容 |
---|---|
2021.8.21 | 新規投稿 |