第9回 アルゴリズム

今回の記事では、スイッチが押されたことを検知する方法についてじっくり考えてみます。

目次

スイッチ検知の問題点

前回の記事で、「スイッチが押されたら50msだけピカッと光る」スケッチを作ったものの、そのような動作になりませんでした。

作成したスケッチの動作を追って、その理由を明らかにしました。

うまく動作しない原因が分かりましたので、今回の記事ではどのようにすれば「スイッチが押されたことを検知する」ことがきるのかじっくり考えていきます。

スイッチが押されたことを検知するには?

「スイッチが押されたことを検知する」という動作を次のようにifを使って判定していました。

if( digitalRead(A5) == 0 )

この判断はloop関数で高速で繰り返します。

すると、スイッチが押されている間は次のように常に条件が成立して結果としてLEDが点灯したまま、という状況に陥ってしまいます。

アルゴリズム1

「スイッチが押されたらLEDをピカッと光る」というのは、次のように「スイッチがONになってから最初の条件成立時だけ」行う必要があります。この判定後の条件成立についてはピカッと光らせてはいけません。

では、どのような判断をすれば、次のようにスイッチをONした直後の最初のタイミングだけ検知することができるのでしょうか?

上の図のような検知がうまくできるようにif(条件式)を考える必要があります。

現在はif( digitalRead(A5)==0 )でスイッチがONか確認していますが、このままでは上の図のような検知はできませんよね。

そこで、スケッチをどう書けば良いかはいったん置いておいて、どのような考え方で検知すれば良いのか、じっくり考えていきましょう。

スイッチが押されたことを判断する方法

どのように検知すれば良いかを考えるために、スイッチの状態を確認するタイミングを減らして考えることにします。

アルゴリズム3

これから、次の赤い矢印のタイミングだけ成立するような条件を考えていきます。

アルゴリズム4

この赤い矢印のタイミングだけ成立する条件がわかれば、その条件が成立したときにLEDを50ms光らせて、結果として「スイッチを押すとLEDがピカッと光る」という動作が実現できます。


まずは具体的に、それぞれの矢印のタイミングのスイッチの状態を書いて考えてみます。

アルゴリズム5

考えてみると、それぞれの矢印のタイミングで「スイッチが押されているかどうか」だけの判定では、最初のONだけ検知するのは不可能ですよね。

そこで、、スイッチが押されたかどうかを人が(自分が)認識する場合、どのように認識するのか考えてみたいと思います。

自分が判定する場合の頭の中の様子をじっくり観察してみましょう!

人が上の図のタイミングでスイッチ状態を確認しているとすると、スイッチが押された「最初のタイミング」だけを検知して「スイッチが押された!」って判定しますよね。

ポイントとして、そのあとのタイミングでもスイッチONの状態が続きますが、ONを検知するたびに「スイッチが押された!スイッチが押された!……..」なんて判定はしないですよね。

一度ONを検知したあと、ONが続いてもその「ON」は無視するはずです。

アルゴリズム6

それでは、人は「最初のタイミング」はどのように判定しているのでしょうか?

おそらく「今までOFFだった」という状態から最初の変化の「ON」だけ検知しているのではないでしょうか。

アルゴリズム7

ということで、「スイッチが押された」という判断は、「スイッチがOFFからONに変わったタイミングのみ」検知しています。

このように考えると、「前回のスイッチ状態」「今回のスイッチ状態」を比較してスイッチが押されたことを判定してそうですよね。

そこで、以下のように「前回のスイッチ状態」と「今回のスイッチ状態」を比較してみましょう。

アルゴリズム8

「スイッチが押された」と検知したいタイミングでは、前回のスイッチ状態がOFF、今回のスイッチ状態がONになっています。

アルゴリズム9

他のタイミングはどうなっているか確認してみます。

アルゴリズム10

このように、他のタイミングでは「OFF→OFF」「ON→ON」「ON→OFF」となっていて、検知したいタインミングの「OFF→ON」はどこにもありません。


ということで、スイッチが押されたことを検知するには、ifで以下の条件判断をすればよさそうです。

「前回のスイッチ状態がOFF」かつ「今回のスイッチ状態がON」

この考え方でスケッチを作成すれば、「スイッチが押された」ということを検知することができるはずです!

アルゴリズム

ところで、今回はスケッチをどのように書くか考える前に、スイッチが押されたことをどのように検知すればよいか、その手順や方法を考えました。

このように何かの動作を実現するための手順や方法を「アルゴリズム」と呼んでいます。

プログラミングの世界では、ある動作を実現するために関数や制御をどのように組み合わせ、どのような手順で実現するか検討することが多々あります。

このようなとき「アルゴリズムを検討する」「どのようなアルゴリズムで実現すればよいか」などと表現されることがあります。

今回の記事では「スイッチを検知するためのアルゴリズム」を検討してきたわけです。


次回の記事では、今回考えたアルゴリズムを実現するためのスケッチを検討していきます。

ミニチャレンジ課題

課題

今回の記事では「スイッチが押されたことを検知する」というアルゴリズムを考えました。

それでは、次の処理を行うためのアルゴリズムを考えてみてください。

スイッチが離されたことを検知する

解答例

「スイッチを離された」ということを検知するにはA5端子の状態をdigitalReadで読み取って、戻り値が1(=OFF)だけを検知する方法ではうまくいきません。

スイッチが離された、というタイミングは「次の赤枠部分のみ」検知する必要があります。

この部分を検知するのは「前回の状態がON」かつ「今回の状態がOFF」という条件を設定すれば検知できますね。

更新履歴

日付内容
2021.8.21新規投稿
2025.2.7一部説明補足
ミニチャレンジ課題解答例追加
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次