Arduinoでスイッチの入力状態を判定する

Arduinoにおいてデジタル端子に接続した機器タクトスイッチなどの状態を取得したい場合は多くあります。Arduinoだけではなく電子機器なら、スイッチが押されたらデジタル端子やアナログ端子に接続したLEDを点灯・モータを回転させるなど、装置には必ず必要な機能です。
装置系プログラミングではLEDを点灯させたりモータを回転させたりという動作は、デジタル端子に、HIGH=5VかLOW=0Vの状態をdgitalWrite関数で出力します。

今日はこの反対で、デジタル端子に接続したスイッチや機器からのデジタルデータであるHIGH=5V か LOW=0Vの状態を読み取るためのdigitalReadの使い方をマスターします。

デジタル信号を読み取るdigitalReadとは

Arduinoにおいて、デジタル端子に接続されたスイッチのON/OFFなどの状態をデジタルデータとして読みとるために用意されている関数にはdigitalReadがあります。

これは標準関数 digitalWriteとは全く反対の動きをするArduinoの標準関数です。

digitalReadを使用すると、指定したデジタル端子の電圧の状態状態を関数の戻り値としてデジタルデータであるHIGHかLOWかで取得することができます。

様々な電子機器には、操作するためのスイッチが取り付けられています。
例えば扇風機や洗濯機、炊飯器やリモコン各種などいたるところに操作スイッチがついていて、私たちは普段何も気にせずに使っていますが、実はこれらのスイッチはほとんどが今日ここで学習する方法(デジタル端子接続によるデジタルデータの入力・状態チェック)で制御されています。

スイッチの電気的な仕組み

Arduinoのボード上においては、デジタルとして指定されているどのデジタル端子でも(例えばUNOであれば0~13)digitalReadを使って現在のデジタルデータを読み取ることができます。

例えば、Arduinoの読み取るデジタル端子にスイッチの接点を抵抗を通してCPUの足(Arduinoボードにおけるピンヘッダ)と+5Vに接続し、スイッチのもう片方を0V(GND)へ接続します。

この接続を行うと、スイッチが押されていないときにはデジタル端子には抵抗を通して常に+5Vと接続していますから、デジタルデータとしての状態は HIGH となります。

次に、スイッチが押されると+5VはGND側へ接地してし、同時にArduinoのデジタル端子も0V(GND)になるためデジタルデータとしてはLOWの状態となります。

この変化をArduinoのプログラム内ではdigitalRead関数を利用して読み取ることで、スイッチが押されたか?押されていないか?の状態を検知することができるようになります。

動きの図

スイッチが押されていないときArduinoSWOFFの回路図VCC(5V)からR2(10KΩ)の抵抗を通してCPUのPB5(Arduinoのデジタル端子)には常に5Vが流れている。
※CPUが+3.3Vで動作している場合は3.3Vが流れる
この時、デジタル端子の状態はデジタル信号のHIGHとなる。

 

スイッチが押されたときArduinoSWONの回路図スイッチが押されると、接点は導通状態となりVCCはGNDとつながり同時に接続された(Arduinoのデジタル端子)は0V(GND)となるため、この時のデジタル端子の状態はデジタル信号のLOWとなる。

この回路で、R2と書かれた10Kの抵抗がついているのは、Arduinoのデジタル端子に大きな電流を流さないためです。あまり大きな電流を流すとCPUが壊れてしまいます。

ここでは、電圧の変化さえわかればいいので、極力小さな電流に抑えるために10KΩの抵抗をつけています。Arduinボードを使って、実験的にいろいろ行う際は抵抗を使わず直接接続することもできますが、CPUの寿命を短くしたり、運悪く壊してしまうこともあるため、できるだけ抵抗をデジタル端子に接続して実験をすることをお薦めします。

ここでは10KΩの抵抗を使うことで流れる電流を下記の通り制限しています。
計算:オームの法則 I(電流 A)=E(電圧 V)÷ R(抵抗 Ω) によってここでは、5V÷10000 = 0.0005A → 5mA の電流に制限。

Arduino UNOを使ってdigitalReadを試してみる

接続

Arduino UNOのデジタル端子7番にジャンパーワイヤーの片方を、もう片方を5VとGNDに接続を変えながらデジタル端子7番の状態をシリアルモニターしてみましょう。(抵抗を入れていないのでちょっと乱暴です)

Arduino IDE での プログラム

命令 意味
1 inPin = 7 入力ピン変数にピン番号7を代入
2 int val = 0 入力データを代入する変数に0を代入(初期化)
5 pinMode(inPin, INPUT) Arduino標準関数 pinMode()で 変数 デジタル端子inPin(7番)を入力INPUTにセットします。
これで digitalRead によってデジタル端子7番に入力された電圧を検知しHIGHかLOWで状態を読み取ることができるようになります。
6 Serial.begin(9600) ArduinoIDEにあるシリアルモニターに状態を送り出し確認したいためデータを送り出すための準備として Serial.begin
でシリアルポートをオープンします。
このコマンドを送っておくことで、パソコンからArduino UNOにプログラムを送り出すために接続したUSBケーブルを通してパソコン側のArduinoIDEで状態を表示することができます。
()の中にはパソコンのUSBとArduino Unoとの通信速度を指定します。この通信速度は、ArduinoIDEのシリアルモニターで同じ速度に合わせなくてはいけません。
ここでは9600Bpsを指定しています。
10 val = digitalRead(inPin) Arduino標準関数 digitalRead によってデジタル端子7番の現在の状態を読み込み、その関数の戻り値を変数valに代入しています。
この時、デジタル端子7番の状態が5Vであれば digitalRead はデジタルとしてのHIGH(1)を、GND状態であればデジタルとしてのLOW(0)をvalに代入します。
11 Serial.println(val) USBケーブルを通して、Arduino Unoよりvalの値をパソコンン上のArduinoIDEに送信してきます。
送られるデータは0または1なので、シリアルモニターにも0か1の表示がされます。

ArduinoIDEのシリアルモニター

ArduinoIDEには上記で説明したように、ボードから様々なデータをパソコンに送り込んで簡単にモニターするシリアルモニターという機能が標準で搭載されています。

ArduinoのdigitalReadでデジタル端子から読み込まれるデータはデジタルのHIGHという意味である1またはLOWという意味である0を表示します。

ブレッドボードでタクトスイッチを配線

AeduinoUNOのボードとブレッドボード利用して実験をしてみましょう。
タクトスイッチは見た目、縦と横が識別しにくいため、予めテスターを使って導通チェックをしておくといいでしょう。

この図のとおり、タクトスイッチへのジャンパー線の接続はAとBの端子を使います。

スイッチの動きとしては、AとBは常に電気を通さない状態で接点が離れており、スイッチの真ん中の丸いボタンを押すとカチっと鳴ってスイッチ内部の接点が接触し、AとBが導通状態になり電気が流れる仕組みになっています。

こういった電子機器回路の場合のスイッチの入出力をデジタルとして検知する場合、スイッチは電源+側と電源-側(GND)の間に入れて使います。

こういったスイッチの利用方法は、電気的な用語として「プルアップ」または「プルダウン」という回路をで呼びます。

これは、デジタル端子に抵抗を通して電源またはGNDに接続して状態をつくり、CPUの状態を0(デジタルLOW)か1(デジタルHIGH)に安定化させるためです。電源側に接続した場合は上に引っ張られているという意味でプルアップ、GND側に接続した場合は下にひっぱられているという意味でプルダウンといいます。

プルアップされている場合、スイッチが押されていない場合は5V(デジタルHIGH=1)となりスイッチが押されたとき0V(デジタルLOW=0)となるため、0が押された時が変化した状態となるためアクティブLOWと呼びます。

逆にプルダウンされている場合は、この逆でスイッチが押されていない場合は0V(LOW)となりスイッチが押されたとき5V(HIGH)となるため、1が押された時が変化した状態となるためアクティブHIGHと呼びます。

このようにして、スイッチの入力状態をデジタル信号として読み取ることができます。

回路はどちらでも作ることができ、どちらを使うかは回路設計者によって決まります。
プログラマー側としては、「今回の回路はアクティブLOW?HIGH?」と確認をしてプログラムを作ります。

スイッチが押されたらLEDが光るプログラム

Arduino Unoのボードには、デジタル端子13番にLEDが実装されています。
このLEDを使って、先ほどのデジタル端子7番に接続されたタクトスイッチのON/OFFを検知して、LED)点灯・消灯させるプログラムを作ってみましょう。

このプログラムは、digitalReadとdijgitalWriteの両方を使い制御しています。

命令 意味
4 #define input_pin 7 デジタル信号の入力ピン(スイッチ)を7にします
5 #define led_pin 13 LEDとしての出力をデジタル端子13にします
8 pinMode(input, INPUT) Arduino標準関数 pinMode()で デジタル端子7(変数 (7番)を)入力INPUTにセットします。
9 pinMode(led_pin,OUTPUT) Arduino標準関数 pinMode()で 変数 (13番)を出力OUTPUTにセットします。
11 int status ; 読み込んだスイッチのデジタル信号データを格納する変数を宣言します。
12 status = digitalRead(input_pin) Arduino標準関数 digitalRead でデジタル端子7番ピンの状態を読み込み変数 status へ代入します。
13

~

17

if(status == HIGH){   digitalWrite(led_pin,HIGH) ;   }else{   digitalWrite(led_pin,LOW) ;
}
読み込んだ status のデータ(ポートの状態)が HIGH=1 なら LEDポートにHIGHを、LOWなら LEDポートにHIGHを出力することでLEDの点灯・消灯を制御しています

コメント

タイトルとURLをコピーしました