前回は、UIAPduinoを使ってLEDをチカチカさせる「Lチカ」に挑戦しました。

今回はステップアップして、「ボタン入力」にチャレンジします。
ボタンを押したときだけLEDが光るプログラムを作ってみましょう。

マイコンは「入力」と「出力」を組み合わせることで、いろいろな動きが作れるようになります。
その第一歩として、ボタンの使い方をしっかり覚えていきましょう!


今回つかったLEDチカチカのINOファイルはこちらからダウンロードできます。

また、動画でも解説しているのでチェックしてみて下さい↓↓↓

UIAPduino_LED

ボタンでLEDを光らせてみよう

ボタンを押したときにLEDが光るようにしてみましょう。
タクトスイッチという4つ足のパーツを使います。
image1


タクトスイッチは、横に並んだ足どうしがつながっていて、
ボタンを押すとすべての足がつながります。

中央の溝をまたぐようにさし、対角線の足に線をつなぎます。
image2


回路をつくろう

前回のLチカの回路に、ボタンと10kΩの抵抗を追加してみましょう。

image3

3V3のピンから電源をもらい ボタンの片方の足につなぎます。
ボタンを押すと、反対側の足につながり、
マイコンの5番ピンに3.3V(HIGH)が伝わります。
また、5番ピンにつながる回路を枝分かれさせて、抵抗を通してGNDにつなぎます。

プログラムを書こう


前回のLチカのプログラムを、変更してみましょう。
5番ピンにBUTTONという名前をつけ
ピンモードをINPUT(入力)モードにします。

ボタンが押されて、3.3Vのピンから5番ピンに電気が流れると
5番ピンがHIGHになるので
HIGHならLEDを点灯、LOWならLEDを消灯させましょう。
■ サンプルコード
#define LED 2
#define BUTTON 5	//5番ピンをBUTTONとよぶ

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);	//5番ピンを入力モードに
}

void loop() {
  int buttonState = digitalRead(BUTTON);	//5番ピンの状態をよみとる

  if (buttonState == HIGH) {	//ステータスがHIGHなら
    digitalWrite(LED, HIGH);	
  } else {			//ステータスがHIGHでないなら
    digitalWrite(LED, LOW);
  }
}

digitalRead()

ピンの状態(HIGHかLOW)を読み取る命令です。



書き込みしてみよう

リセットボタンを押しながらUSBを接続し、書き込みモードにします。
「→」アイコンをクリックして書き込みましょう。

ボタンを押したときだけLEDが光れば成功です。


image4


試してみよう

ボタンから枝分かれさせた10kΩの抵抗を抜いてみましょう。

すると、ボタンを押していないのに LEDが点灯したままになってしまいました。
なぜ抵抗がないとLEDがついてしまうのでしょう?

なぜこうなるの?

ボタンが押されていないとき、ピンはどこにもつながっていない状態になります。
この状態を「解放(オープン)」といいます。

ピンの状態が不安定になり、ノイズの影響でHIGHになってしまうことがあります。

image3_2

プルダウン抵抗

抵抗を使ってGNDにつなぐことで、ピンをLOWに引っ張ることができます。

  • 押してない → LOW
  • 押した → HIGH
image3_3




5番ピンにGNDの道を作ってあげると、ふわふわ状態だったピンがLOWにひっぱられます。
抵抗を入れてあげることで、

 ボタンが押されたとき → 3.3Vが伝わりHIGHになる
 ボタンが離されたとき → GNDに引っ張られてLOWになる

というように、ピンの状態を安定して読み取ることができます。

このように、何もしていないときにピンがLOWになるようにする回路を
プルダウン抵抗、プルダウン回路といいます。

内部プルアップを使ってみよう

ピンをGNDにつないで、ボタンが押されていないときにLOWにする仕組みがプルダウンでした。

マイコンには「内部プルアップ」という機能があり、
ピンが常にHIGHに引っ張られている状態になります。

内部プルアップを使えば、外付けの抵抗はいりません。

image5

図のように配線してみましょう。 プルダウン抵抗は外し、
• ボタンの片方を3番ピンに
• もう片方をGNDに 接続します。

プログラム

■ サンプルコード
#define LED 2
#define BUTTON 3

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);	//ピンをプルアップモードに
}

void loop() {
  int buttonState = digitalRead(BUTTON);

  if (buttonState == LOW) {	//ボタンがおされたときLOW
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

💡 ワンポイント

プルアップでは、押していないときがHIGH、押したときがLOWになります。
条件が逆になるので注意しましょう。


これで、外付け抵抗を使わずに、プルアップ回路でボタンを実装することができました。
UIAPduinoを書き込みモードにして、プログラムを書き込んでみましょう。
ボタンが押されたときにLEDが光れば、プルアップ回路は成功です。

まとめ

ボタンを使って、LEDをコントロールできるようになりました!

プルダウン回路とプルアップ回路の違いも理解できると、入力の扱いがぐっと分かりやすくなります。

ボタンを使えば、押したときだけ動くプログラムやゲームの操作など、できることが一気に広がります。いろいろ試してみましょう!