Arduinoでやりたいことを考えていると、Arduinoの動作をスケッチから動作させるだけではなくボタンやレバーなどを使って、色々な動作をさせたいと思うようになります。
今回は、Arduinoに外部からの信号を認識できるようにする第一歩、スイッチを使う方法です。
目次
外部入力のすべての基本はスイッチから
Arduinoは、外部入力を使うことで多彩な動作を行わせることが出来るようになります。外部入力?と聞いてもピンとこないかもしれませんが、例えば赤外線を受信してチャンネルを変えるテレビのリモコン受信部や、スマホのタッチパネルセンサー、マイクなども全て外部入力に当たります。
外部入力に使う電子部品には様々なものがあり、アナログだったり、デジタルだったり、増幅したり、フィルタを掛けたりとそれぞれ最適な方法で接続しなければいけません。
しかし、それら外部入力を使う全ての基本として、まずは「スイッチ」を使えるようにならなくてはいけません。スイッチを使えるようにならなければ他のセンサーは使用できないと言っても過言ではありません。
スイッチは単純なON・OFF信号を発生させるだけの部品ですが、スイッチを追加するだけで単純にスケッチの内容に従って動いていた電子回路は、多彩な操作を受け付けるプロダクトへと発展します。これこそ「今自分はプロダクトを作っている!」という第一歩です。
どんなスイッチを使う?
スイッチには様々な種類がありますが、今回使用するのは「タクトスイッチ」と呼ばれる入手性に優れた安価なスイッチを使います。タクトスイッチは押された時だけONになる「モーメンタリ」と呼ばれる動作をします。
このほかにもトグルスイッチ、スライドスイッチなどがありますが、ひとつのスイッチを使えるようになれば他のスイッチも同じ感覚で使えるようになります。
タクトスイッチは正式名称「タクタイルスイッチ」と呼ばれ、「感触のあるスイッチ」と言う意味のスイッチです。実際に押してみるとカチカチと押した時の感触が戻ってきます。
タクトスイッチは内部接点に反転バネを使用することで構造がシンプルになり高い耐久性を持っています、種類も豊富なのが特徴です。
スイッチには必須の「プルダウン抵抗」
スイッチに重要なのがグラウンドに接続されている抵抗です。この抵抗の事を「プルダウン抵抗」と呼びます。
スイッチの状態読み込みでは、電圧が加わっているか加わっていないかの2通りの状態があります。Arduinoの場合では読み込みたいピンに5Vが加わっている時にHIGH、0Vの時にLOWです。
例えば、上の回路図から抵抗を外したとして「スイッチ押した時に7pinに5Vが加わって、離した時には接点が切れて0Vになるんだからいーじゃん」と思ってしまいますが、Arduinoをはじめとする電子部品は、そういう認識をしない場合がほとんどです。
これはArduinoを使用するリファレンスにも書かれていて、ピンの信号を読み込む関数のdigitalRead関数の説明にはこう書かれています。
【補足】
なにも接続していないピンを読み取ると、HIGHとLOWがランダムに現れることがあります。
スイッチが入っている時は5Vが加わっているため問題ありません。しかし、スイッチが入っていない場合、ピンはなにも接続されていない状態になってしまい、ArduinoはHIGHかLOWなのかわからなくなってランダムな読み取り結果を返してしまいます。
ボタンを押していないのに勝手に動作が始まったら大変です。これを防ぐための抵抗こそ、スイッチがOFFの時に確実に0Vの状態にしてくれる「プルダウン抵抗」なのです。
早速、回路を組んでみよう!
回路図としては下のようになります。今回はスイッチの入力に7ピン、LEDの点灯に12ピンを使用しています。
スイッチには4.7kΩのプルダウン抵抗を使用しています。ダイオードに接続しているR2の1kΩの抵抗は電流制限を行う抵抗で、LEDには5mAの電流が流れます。
スケッチ
記述したスケッチは以下のようになります。
タクトスイッチの動作は、押した時だけONになるモーメンタリスイッチですが、そのままスイッチのON・OFFに連動させてLEDを点灯させるだけでは直接LEDをつなぐのと変わらないので、スケッチ上でオルタネイト動作(一度押すとON、再度押すとOFF)になるように工夫します。
LEDの動作としては、LEDがオフの時にスイッチを押すと点滅が始まりボタンを離してもその状態が維持されます。次にボタンを押すと、離したタイミングでLEDの点滅が終了します。
このスケッチではwhile文を挿入し、スイッチが押された状態でループすることで誤作動を防いでいます。delay関数の仕様と割り込みを使っていない問題で、スイッチを押したままだとloop関数内でtoggle変数の状態が常に変わってしまうので、上手くLEDをオフできるよう対策しています。
ステップアップ!INPUT_PULLUPを使って抵抗を外せる!
ここからは応用です。先述したプルダウン抵抗は、スイッチに必ず付けないといけないものと言いましたが、Arduinoにはこれを取り外せる方法があります。
先ほどのスケッチの6行目に、pinMode(7, INPUT);という定義がありますが、これはArduinoの7ピンを信号の入力を受け付ける、と言う命令になります。このINPUTをINPUT_PULLUPに変更すると、マイコンの内部プルアップ抵抗が有効になり、外付けの抵抗を省くことができます。
注意しなければならないのは、プルダウン抵抗とは違いボタンを押した状態でLOW、離した状態でHIGHになる点です。スイッチの状態と入力の論理状態が反転するので、スケッチを描く場合はこの点に注意が必要です。
ちなみに、現在は半導体の進歩によりスイッチの接続にプルダウン、プルアップ共にどちらを選んでも性能や電力にそこまで大きな差はありませんが、マイコンの世界では慣例的にプルアップ抵抗の方が多く用いられてきた経緯があり、内蔵プルダウンは搭載されていない事がほとんどです。
慣れないうちに内蔵プルアップを使うのは少し戸惑うかもしれませんが、部品を減らす、配線を減らすという手段は、電子工作においてコスト減・不良減・ノイズ減と良いことしかありません。これをマイコンの機能で実現できるなら使わない手はありません。
まとめ|スイッチこそ電子工作全ての基本
電子工作の世界はスイッチこそすべての始まりです。ボタンを押してLEDを点灯させることから始まり、モーターを動かしたりLCDディスプレイに反映させたりとスイッチを使わなければ何もできません。
スイッチを使う上で最も重要なのがプルダウン、プルアップ抵抗の意味について理解することです。このプルアップ、プルダウンという考え方は、スイッチだけではなく、アナログセンサに必要だったり、デジタル信号に必須だったりと電子工作を考える上で欠かせない存在です。
また、スイッチについてはチャタリングと言う機械激な構造を理由とする、接点のパタツキが発生します。今回のスイッチではdelay関数によりチャタリングの影響を少なくしていますが、本格的にスイッチを使おうとすると、ハード的またはソフト的に対策を行わなければいけません。この点についてはまた次回解説していきたいと思います。