こんにちは、「メカのりまき」です。
この記事では、タクトスイッチの使い方とArduinoのデジタル入力について説明したいと思います。
この記事では、タクトスイッチの動作を確認するために、PCとシリアル通信を行ったり、LEDを点灯させたりしますので、それらについての知識も必要となります。
以下のリンク先の記事で、シリアル通信やLEDの点灯について説明していますので、シリアル通信やLEDの点灯の仕方が分からないという方は、先に以下のリンク先の記事をご覧になることをお勧めします。
また、この記事は、「Arduino IDE」の基本的な使い方を、理解していることを前提とした記事となっています。
「Arduino IDE」の使い方は以下のリンク先の記事で説明していますので、「Arduino IDE」の使い方が分からない方は、以下のリンク先の記事を是非ご覧になってください。
目次
本記事で使用するもの
本記事で私が使用した物は以下の通りです。
- 「Arduino IDE2.0.3」をインストールしたPC(Windows11)
- USBケーブル
- Arduino Uno R3(ELEGOO UNO R3でも可)
- ブレッドボード
- タクトスイッチ
- LED
- 抵抗器
- ジャンパーワイヤー
「Arduino Uno R3」の互換ボードであれば、「ELEGOO UNO R3」以外のボードでも、本記事と同様な手順で動作可能だと思われますが、動作検証はしていないので、その点はご了承ください。
以下のリンクのスターターキットを購入した場合、上記で述べた使用するものは、PC以外すべて入手することができます。
Arduinoをまだ購入していないという方やArduinoで動かすことができるたくさんのパーツが欲しいという方は、購入を検討してみてください。
タクトスイッチの説明
タクトスイッチは押されている間は線を繋げ、押されていない間は線を繋げないという役割を持った、とても単純な部品で、以下の写真のような見た目をしています。
タクトスイッチを記号で表すと以下のようになります。
タクトスイッチの線の繋がりは、以下の画像のようになっていて、スイッチが押されている間、2本の線が繋がります。
タクトスイッチの役割についての説明は以上となりますが、これだけでは、タクトスイッチがどのような働きをするのか、良く分からないと思いますので、LEDを使った回路を作成し、動作の確認をしていただこうと思います。
タクトスイッチを試す
LEDを点灯させる回路の間に、スイッチを入れた、以下のような回路をブレッドボードで作成してください。
ここで、抵抗器はLEDを点灯させる回路で使用したものと同じ電気抵抗のものを使用してください。
LEDを点灯させる回路については、以下のリンク先の記事で説明していますので、LEDを点灯させる回路が良く分かっていないという方は、以下のリンク先の記事をご覧になってください。
上記の回路が作成できましたら、Arduinoの電源を入れてみてください。
正しく回路が作成できていた場合、この時点でLEDは点灯しません。
ボタンを押すと、線が繋がり、LEDが点灯するのが確認できます。
デジタル入力の説明
タクトスイッチは上記のように、単純に線を繋げて、電流を流すだけではなく、Arduinoのデジタル入力と組みあわせることで、「スイッチが押されている間、~を実行する」といったことを行わせることが出来ます。
では、まずArduinoのデジタル入力について説明したいと思います。
Arduinoの「デジタル入出力ピン」、「アナログ入力ピン」は出力ピンとして使用する他に、「入力ピン」として使用することができます。
実は、Arduinoの場合、スケッチの中で出力ピンとして設定していないピンは、デフォルトで入力ピンとして設定されています。
したがって、改めてスケッチの中で、文を書いて入力ピンであるという指定を行う必要はありません。
しかし、動作の途中で出力ピンから入力ピンに切り替えたい場合や、どのピンが入力ピンとして、利用されているかを明確にしておきたい場合、以下のような文をスケッチ内に記述することで、入力ピンとして設定することができます。
1 |
pinMode(8,INPUT); |
上記の文では、8番ピンを入力ピンとして設定しています。
入力ピンとして、設定が行われると、そのピンはハイインピーダンス状態という状態になり、ほとんど電流が流せない状態になります。
その代わりに、ピンに繋いだ先の電位が、「HIGH」(GNDより5[V]高い電位)であるか、それとも「LOW」(GNDと同じ電位)であるかを調べることが出来るようになります。
イメージとしては、下の図のようになります。
接続先の電位が「HIGH」であるか、それとも「LOW」であるかを調べるときは、スケッチ内で以下のような文を記述します。
1 |
digitalRead(8); |
ここで、「digitalRead()」は、( )内に記述した番号のピン(上記の場合は8番ピン)の接続先が「HIGH」のとき「1」、「LOW」のとき「0」になります。
デジタル入力の概要は以上となります。
次は、入力ピンがどのような働きをするのか、シリアル通信を使ったスケッチを書き込んで、確かめていただこうと思います。
シリアル通信については、以下のリンク先の記事で説明していますので、シリアル通信のやり方が分からない方は、以下のリンク先の記事をご覧になってください。
デジタル入力を試す
スケッチを書き込む
まず、Arduinoに差し込んでいるピンを全て抜き、以下のスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { //8番ピンを入力ピンとして設定する(デフォルト設定なので省略しても良い) pinMode(8,INPUT); //シリアル通信の初期処理を行う Serial.begin(9600); } void loop() { //digitalReadで読み取った値をシリアルモニタに出力させる Serial.println(digitalRead(8)); } |
スケッチの解説
上記のスケッチでは、8番ピンを入力ピンとして設定しています。
そして、8番ピンに接続した部分の電位が「HIGH」であるか、それとも「LOW」であるかを判別し、「HIGH」の場合「1」を、「LOW」の場合は「0」をシリアルモニタに出力させます。
動作の確認
まずは、以下の図のように、8番ピンとGNDピンを接続してください。
接続が終わりましたら、次はシリアルモニタを開き、Arduinoからの出力を確認してください。
すると、8番ピンの接続先は「LOW」(GNDと同じ電位)であるため、常に「0」を出力しているのが、確認できます。
「0」を出力しているのが、確認できましたら、次は、8番ピンと5Vピンを以下の図のように繋いでください。
すると、8番ピンの接続先は「HIGH」(GNDより5[V]高い電位)であるため、常に「1」を出力しているのが、確認できます。
では、何も繋がれていない状態の場合は、どのようになるのでしょうか。
5Vピンから線を抜いて、放置をしてみてください。
「0」か「1」のどちらかで安定している方もいれば、以下の画像のように、「0」と「1」が繰り返し、出力される方もいらっしゃると思います。
なぜ人によって、出力が変わるのかと言いますと、以下の図のように接続先の電位が不明となってしまっているからです。
上記のように、入力ピンがどこにも繋がれていない状態は、測定される電位が安定しないため、入力ピンにとって、望ましいものではないということを覚えておいてください。
スイッチが押されているかを判別する
以下で説明する回路を作成すれば、上記で説明したスケッチで、スイッチが押されているかを判別することができます。
誤った回路
まず、Arduinoでスイッチが押されているかを判別する回路で、簡単に思いつくのは、以下のような回路です。
上記の回路の場合、入力ピンは、スイッチが押されているとき、5Vピンと繋がるので、測定される電位は「HIGH」となります。
しかし、スイッチが押されていないとき、入力ピンはどこにも繋がれていない状態になるので、測定される電位は不安定な状態となってしまいます。
これでは、スイッチが押されていないときも、「HIGH」であると判定されてしまうことがあるため、スイッチが押されているかの判別を行うことはできません。
スイッチが押されているかの判別を行うためには、以下で説明するような回路を作成する必要があります。
プルダウン
上記で説明した回路では、スイッチが押されていないときに、入力ピンがどこにも繋がれていないことが問題となっていました。
そこで、スイッチが押されていないときに、入力ピンが抵抗器を介してGNDに繋がるようにしたものが、プルダウンで、以下のような回路となります。
上記の回路の場合、スイッチが押されているとき、入力ピンは5Vピンと繋がるので、測定される電位は「HIGH」となり、スイッチが押されていないとき、入力ピンは抵抗器を介してGNDピンと繋がるので、測定される電位は「LOW」になります。
よって、測定される電位が不安定になることは無いため、スイッチが押されているかの判別を行うことが出来るということになります。
ここで、GNDピンとの間に抵抗器入れているのは、スイッチを押した際に、5VとGNDの間に電気抵抗がないため電流が大量に流れてしまう現象である「ショート(短絡)」を防ぐためであり、この抵抗器の名前をプルダウン抵抗と呼びます。
大きな電流が流れるとその分、熱が発生するため、抵抗器の入っていない回路は危険になります。
上記の説明で、スイッチが押されているとき、測定される電位が「HIGH」になるのは、なんとなくイメージができたけれど、スイッチが押されていないとき、入力ピンは抵抗器を介してGNDピンと繋がっているから、測定される電位は「LOW」にはならないのではないかという疑問を持つ方がいらっしゃるかもしれません。
結論を先に述べると、スイッチが押されていないとき、測定される電位は、ほとんどGNDと変わらない電位となるため、「LOW」となります。
その理由について、少しだけ説明をさせていただきたいと思います。
まず、スイッチが押されていないときの回路を整理すると、以下のようになります。
こうしてみると、回路は直列回路になっていて、測定される電位はGNDよりも、「 V2 」だけ高い(もしくは低い)電位となることが分かります。
しかし、入力ピンは、ハイインピーダンス状態であるため、回路に流れる電流はとても小さく、ほとんど「0」に等しい値になります。
そして、オームの法則より、 V2 = R × I と計算できるので、結局V2はとても小さい値になり、測定される電位はGNDとほとんど変わらない「LOW」であるということになります。
ですが、電流 Iは完全な「0」ではないため、抵抗器の電気抵抗 Rが大きければ、その分、測定される電位は、GNDから離れた値になるということには注意が必要となります。
つまり、抵抗器の大きさは、小さすぎるとスイッチが押されたときに、大きな電流が流れてしまうので良くなく、大きすぎると、ノイズなどにより電流が流れてしまった場合、測定される電位が大きく変動することになり、誤作動を起こしやすくなり良くないということになります。
本格的に回路を設計する場合は、しっかりと計算を行ったりする必要があるのかもしれませんが、Arduinoでタクトスイッチを使う場合、電気抵抗の大きさは、10~100[kΩ]のものを使用すれば、問題ありません。
ブレッドボードでの回路は以下のようになります。
回路が作成できましたら、PCと接続をして、シリアルモニタを確認してみてください。
正しく回路が作成できていた場合、スイッチが押されていないときに「0」、スイッチが押されているときに「1」を出力しているのが確認できます。
プルアップ
実は上記の他にもボタンが押されているかを判別する回路があります。
それが、プルアップという回路で以下のような回路となります。
上記の回路の場合、スイッチが押されていないとき、入力ピンは抵抗器を介して5Vピンと繋がるので、測定される電位は「HIGH」となり、スイッチが押されているとき、入力ピンはGNDピンと繋がるので、測定される電位は「LOW」になります。
よって、測定される電位が不安定になることは無いため、スイッチが押されているかの判別を行うことが出来るということになります。
ここで、GNDピンとの間に抵抗器入れているのは、プルダウンのときと同様、スイッチを押した際に、5VとGNDの間に電気抵抗がないため電流が大量に流れてしまう現象である「ショート(短絡)」を防ぐためであり、この抵抗器の名前をプルアップ抵抗と呼びます。
抵抗器を介して繋がっている部分が、「HIGH」になる理由も、プルダウンのときと同様であり、Arduinoでタクトスイッチを使う場合、電気抵抗の大きさは、10~100[kΩ]のものを使用すれば、問題ありません。
ブレッドボードでの回路は以下のようになります。
回路が作成できましたら、PCと接続をして、シリアルモニタを確認してみてください。
正しく回路が作成できていた場合、スイッチが押されていないときに「1」、スイッチが押されているときに「0」を出力しているのが確認できます。
内部プルアップ抵抗
上記では、抵抗器をブレッドボードに差し込んで、スイッチが押されているかを判別する回路を作成してきました。
しかし、Arduinoにはスケッチ内で以下のような文を書くだけで、Arduinoの内部でプルアップの回路を作ってくれるという機能があります。
1 |
pinMode(8,INPUT_PULLUP); |
上記の文は、8番ピンをプルアップ付きの入力ピンとして設定するための文です。
よって、わざわざ、抵抗器を用意して、入力ピンを5Vピンに繋げる必要は無く、スイッチを介して、GNDピンに繋げるだけで、上記で説明したプルアップの回路と同じことが出来ます。
ブレッドボードでの回路は以下のようになります。
回路が作成できましたら、以下のスケッチを書き込んで、シリアルモニタを確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { //8番ピンをプルアップ付きの入力ピンとして設定する pinMode(8,INPUT_PULLUP); //シリアル通信の初期処理を行う Serial.begin(9600); } void loop() { //digitalReadで読み取った値をシリアルモニタに出力させる Serial.println(digitalRead(8)); } |
スケッチの内容としては、pinMode(8,INPUT)をpinMode(8,INPUT_PULLUP)に変更しただけです。
スケッチと回路が正しく作成できていた場合、スイッチが押されていないときに「1」、スイッチが押されているときに「0」を出力しているのが確認できます。
LEDの点滅をスイッチで制御する
では、最後に上記で説明したタクトスイッチとデジタル入力を使って、LEDの点滅を制御していただこうと思います。
回路を作成する
ブレッドボードで以下のような回路を作成してください。
ここで、抵抗器はLEDを点灯させる回路で使用したものと同じ電気抵抗のものを使用してください。
スイッチが押されているかを判別する回路で使用した10~100[kΩ]の抵抗器とは別物なので、間違いのないように、注意してください。
ここで、3番ピンは抵抗器とLEDに、8番ピンはスイッチに接続されていること良く確認してください。
それらのピンの接続が逆になっている(3番ピンがスイッチに接続されている)と、最悪の場合、「ショート(短絡)」を引き起こして、部品の破損に繋がる可能性があります。
スケッチを書き込む
以下のスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { //8番ピンをプルアップ付きの入力ピンとして設定する pinMode(8,INPUT_PULLUP); //3番ピンを出力ピンとして設定する pinMode(3,OUTPUT); } void loop() { //スイッチが押されている間LEDを点滅させる if(digitalRead(8)==0){ digitalWrite(3,HIGH); delay(200); } digitalWrite(3,LOW); delay(200); } |
ここで、スイッチを押していないのに、LEDがぼんやりと点灯している場合は、スイッチを押さず、3番ピンと8番ピンの接続が逆になっていないか確認をしてください。
スケッチと回路が正しければ、以下の動画のように、スイッチが押されていないとき、LEDが消灯し、スイッチが押されているとき、LEDが点滅するのが確認できます。
スケッチの解説
上記のスケッチでは、8番ピンを入力ピンに3番ピンを出力ピンに設定しています。
スイッチが押されていないとき、「digitalRead(8)」は「1」となるため、「if文」の中身は実行されず、3番ピンに繋いだLEDを消灯させ、0.2秒待機するという処理を繰り返します。
スイッチが押されているとき、「digitalRead(8)」は「0」となるため、「if文」の中身が実行され、3番ピンに繋いだLEDを点灯させ、0.2秒待機するという処理が追加で行われます。
「if文」について、もっと詳しく知りたいという方は、以下のリンク先の記事で、「if文」についての説明をしていますので、是非、ご覧になってください。
「void loop()」の処理を図でまとめると以下のようになります。
タクトスイッチの使い方とArduinoのデジタル入力について説明は以上となります。
今回の記事では、スイッチが押されているかを判別するという、スイッチとデジタル入力の基本的な使い方について説明しました。
この知識を利用すれば、「スイッチが押された瞬間に、~を実行する」ということも行うことができるのですが、それを行うには、「関数」と「割り込み処理」というものについての知識が必要となるため、後日別の記事にて説明をしたいと思います。
次回は、アクティブブザーとパッシブブザーを使って、音を鳴らす方法ついて説明したいと思います。
本記事はここまでです。ご清覧ありがとうございました。
広告
タクトスイッチを追加でいくつか購入したい場合は、以下の商品がおすすめです。
また、カラフルなタクトスイッチが欲しい場合は、以下の商品がおすすめです。
楽天モーションウィジェットとGoogleアドセンス広告です。
気になる商品がございましたら、チェックをしてみてください。