ボタン入力を試そう!(Arduino詳解)

詳しく解説!!Arduino-その6です。前回の記事はこちらです。

hirocom777.hatenadiary.org

ボタン入力を試す

 今まで確認した動作内容はLEDの表示のみでした。つまり表示-出力だけ。そこで今回はもっとも簡単な入力デバイスであるボタンモジュールを使ってみましょう。
www.switch-science.com

ボタンモジュール

 ボタンモジュールは入力の基本となるデバイスです。GROVEベースボードのD2~D8のコネクターに接続することでArduino Unoの2~8番ピンにボタンの状態(ON/OFF)をHIGH/LOWで返します。使用する信号は信号1(黄色い線)のみです。信号2(白い線は使用しません)。

接続

 今回はベースボードのD2と書いてあるコネクタにボタンモジュール。D3と書いてあるコネクタにボタンモジュールを4ピンケーブルを使用して接続します。以下のような感じになりますね。

f:id:HiroCom777:20200404152910j:plain

スケッチ(Button)

 今回使用するスケッチは"Button"です。ファイルメニューの"スケッチ例"⇒"02.Digital"⇒"Button"を選択します。それではスケッチの解説です。今回もコメントを省いたスケッチを以下に載せますね。また、13番ピンはベースシールド上では使用できないのでconst int ledPin = 13;をconst int ledPin = 3;に変更します。

const int buttonPin = 2; 
const int ledPin =  3;

int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}
setup-その前に

 今回もsetupの前に何やら記述があります。intは整数の数値を記憶する変数を指すと前回お話ししましたが、その前のconstって何でしょう?
・const
 これは、定数を意味します。定数は予め決められた数値を指します。以下のように記述します。

 const 変数宣言

const を使って宣言された変数(?)は変更不可の定数となります。

今回はLEDのピン番号とボタンのピン番号を指定しています。この二つは接続しっぱなしで変更しないので定数でいいですよね。その下のint buttonStateはボタンの状態を保存するものです。こちらは変更があるわけですから変数ですね。

スケッチの動き

 実際のスケッチの動きですが、まずsetupで2番ピン(ボタンモジュールが繋がっているピン)を入力、3番ピン(LEDモジュールが繋がっているピン)を出力に設定しています、次のloopですが、まずボタンモジュールが繋がっているピンの入力をdigitalRead(その3で出てきましたよね)で読み込んでbuttonStateにセットします。

・else
 その後にあるif文は前回出てきましたよね。でも、その後に何やら続いているelseって何でしょ?これはif文とセットで使われるものです。以下のように記述します。

 if (条件) {
  処理内容1
 }else{
  処理内容2
 }

 if文は条件が満たされた時に処理を実行するものでした。その後にelseをつけると条件が満たされない場合の処理を指定することが出来ます。

 ここで指定されている条件と動作はbuttonState(読み取ったボタンの状態が)HIGHの時にLEDが繋がっているピンの出力をHIGHにする。そうでなければ出力をLOWにするというものです。

整理すると、ボタンの状態を読み取ってLEDに出力するという動作を(loopなので)繰り返しているんですね。実際に書き込んで動かしてみてください。ボタンを押すとLEDが付くようになると思います。

くどくない?

 ちょっとくどいと思いません?このスケッチ、実はこれだけで行けちゃうんですよ。

void setup() {
  pinMode(3, OUTPUT);
  pinMode(2, INPUT);
}
void loop() {
    digitalWrite(3, digitalRead(2));
}

 速い話、ボタンの入力をLEDに出力しているだけなんですね。変数も定数もなくても何とかなっちゃいますし、ifもelseもありません。まぁ、ここで挙げているスケッチはArduinoの使用例を学習するためのものですのでワザと色々な構文を使っているんだと思います。実際にはこんな感じで行けるということも知っておいてください。

ちょっと工夫してみよう

 上のスケッチはとてもシンプルなものです。少し工夫して、動作を変えてみましょう。ボタンを押す毎にLEDのON/OFFを切り替えるようにしてみたいと思います。以下のようなスケッチになりました。

int buttonState = 0;

void setup() {
  pinMode(3, OUTPUT);
  pinMode(2, INPUT);
}
void loop() {
   if (digitalRead(2) == LOW){
     buttonState = 0; 
   } 

   if (digitalRead(2) == HIGH && buttonState == 0){
     buttonState = 1; 
     digitalWrite(3, !digitalRead(3));
   } 
}
スケッチの動き(その2)

 今度は変数を使います。buttonState はボタンの状態を記憶します。ボタンの入力がLOWの時buttonState は0になります。次のif文の中の条件はdigitalRead(2) == HIGHはボタンの入力がHIGHの時、buttonState == 0はボタンの入力が1度LOWになった時、そして二つの式の間にある&&はAND(かつ)です。つまり、ボタンの入力が一度LOWになっている状態からHIGHに変わった時という意味です。この条件が成立したときにbuttonState には1がセットされてLEDピンは出力内容を反転させます。buttonState は一度ボタンをLOWに戻さないと0にはならないので、その間LEDの反転処理は実行されません。つまり、一回ボタンを押すごとにLEDのON/OFFを切り替えるということになります。

早速書き込んで動かしてみましょう。ボタンを押すごとにLEDのON/OFFが切り替わりますよね・・・って、あれ?

ちょっとおかしい

 ま、大体はうまく動くんですけれど時々動作がおかしいような・・・実はボタンなどのスイッチをこんな風にトリガー(きっかけ)として使う場合には注意しなければならない点があるんですよ。次回はこの注意点についてご紹介します。お楽しみに!!
hirocom777.hatenadiary.org


Arduino UNO入門の連載記事はコチラからどうぞ!!