ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2013年5月23日木曜日

猫で教えるマイコンでのスイッチ入力の受け取り方

マイコンで電子工作を始めた頃を思い出してみて、一番最初に悩んだのがスイッチの入力の受け取り方だったと思う。なので、ごく噛み砕いて説明してみる。

なにつまづくのかというと、小学校のときに豆電球をつける回路を作ったときには、スイッチは回路を切断するように配置して、ボタンが押されたらスイッチがつながるという形になるのだけど、マイコンでのスイッチ入力というのはそれではいけないということ。
たとえばこんな回路だ。

これの何がまずいのかというと、スイッチがONになっていないときに、入力の部分が見ての通りどこにもつながっていないことだ。

つながってないんだから、0Vだろ? と最初のうちは思いがちだが、電圧の値というのは、マイナス側を0Vという基準として、プラス側が何Vある、という考え方なので、どこにもつながっていなければ基準がないわけで、その部分の値は不定になる。

もしあなたがArduinoとかを初めて買って試しているなら、シリアルモニターに何も接続されていない部分の電圧を表示してみるとそれはすぐに分かる。出力される値は0に固定されることなく、ふらふらと変わる値が表示されているはずだ。



ではどうすべきなのかというときに出てくるのが、プルアップ・プルダウンという考え方である。もうこの用語さえ分かればググってもらえれば分かるのだけど一応、解説すると以下の通り。
まずプルダウン。


おわかりいただけただろうか。見てのとおり、スイッチが切れているときには入力は電池のマイナス側につながっているので、0Vであるということが分かる。この状態でArduinoのシリアルモニターに出力すれば0が行進するはずである。

で、なんであんなところに10Kとか、っつって抵抗があるのかと言うと、あそこに抵抗がないと、スイッチがオンになったときに電池側に電気が流れてしまうので、入力部分に電圧がかからないからだ。
習ったと思うが、電気は流れやすい方に流れるので、マイナス側に戻る方に大きな抵抗を入れておけば、大半がマイコン側に流れて、入力を受け取ることができる。

つぎにプルアップ。先にプルダウンを書いておいて何だが、たぶん基本的に多くのマイコンを使うときに、たいていこっちを使うことになる。理由は後述。

プルアップである。
何が違うの、と思うかも知れない。よく見てみれば分かる。猫が鉢割れである。
いやちがう。電池の向きが違う。
つまり普段を電圧がかかっているほうにして、スイッチがONになったら0Vにするということだ。
あれそんなことできるの、と思うかも知れないがもちろん可能である。単純にプログラムの中でスイッチがオンになったかどうか調べるときの条件をビットが1になったときから、0になったときに置き換えれば良いだけだ。デジタル入力なら状態は0か1か、オンかオフかしかないのだから、そのどっちをスイッチが入っている状態にするかはプログラム次第だ。

で、なぜ0にするほうをたいてい使うことになる、と言っているかというとAVRでもArduino(中身はAVRだけど)でも、PICでも、プルアップ抵抗回路が内蔵されているからだ。つまりプルアップを利用する限りにおいては、わざわざここまで長々書いてきた回路を組む必要は無い。

どうやってプルアップを利用するか(設定でプルアップをON/OFFできる)はそれぞれのマイコンのマニュアルを見るなりググるなりをしてもらうとして、プルアップ回路をONにしたら、あとはこういう回路を組むだけで良い。

かんたん!

もちろん入力が0になったときにONにするようプログラムを書く必要がある。

また上記の図では当たり前なので全部省略しているが、マイコンのVCCとGNDにはちゃんと電気を供給する必要がある。 スイッチにつなぐマイナス側ってのはGNDにつながっているのと同じ線である。あまりにも当然の話ではあるけど、一応。
あと電池の回路記号は長い方が+なのでそこも一応。