スイッチでLEDをつけたり消したりしてみる【Arduino入門】

Arduino

 

スイッチと回路を作ってArduinoでLEDをつけたり消したりできるようになります。

今回は『Arduinoで電子工作入門ガイド』を参考にしました。

用意するもの

・Arduino UNO R3

・LED

・抵抗 330Ω、1kΩ

・タクトスイッチ

・ブレッドボード

・ジャンプワイヤー

回路

<スイッチ側>

Arduinoの5V ピン→ タクトスイッチ片脚 → タクトスイッチ反対の脚 → 抵抗330Ω片脚 → Arduinoの13番ピン へ

抵抗330Ωもう片脚 → ArduinoのGND へ

<LED側>

Arduino7番ピン → LEDアソード(長い方)→ LEDカソード → 1kΩ抵抗片脚 → 1kΩ抵抗もう片脚 → ArduinoのGND 

スイッチを押すと光るスイッチ

<タクトスイッチを押している間だけ光る>

#define LED 7
#define SWITCH 13

void setup() {
	pinMode(LED, OUTPUT);
	pinMode(SWITCH, INPUT);
}

void loop() {
	if (digitalRead(SWITCH)) {
	  digitalWrite(LED, HIGH);
	} else {
	  digitalWrite(LED, LOW);
	}
}

 

・#define

<書式> # define <名前> <置き換わる数字や文字列>

#define LED 7

GPIOの7番ピンをLEDという名前で呼ぶ。

#define SWITCH 13

GPIOの13ピンをSWITCHという名前で呼ぶ。

pinMode(LED, OUTPUT);
pinMode(SWITCH, INPUT);

LEDという名前のついた7番ピンをOUTPUT(出力)とする。 SWITCHという名前がついた13番ピンをINPUTとする。 ・if 文

if(<ブール型を返す条件>) {
   Statements(しんの場合ここに書いたスケッチが実行される)
}

 

if(<ブール型を返す条件>) {
	Statements(しんの場合ここに書いたスケッチが実行)
	} else {
	Statements(偽の場合ここに書いたスケッチが実行)
}

 

if (digitalRead(SWITCH)) {
	  digitalWrite(LED, HIGH);
	} else {
	  digitalWrite(LED, LOW);
	}

 

digitalRead(SWITCH)

……スイッチに電気が流れていたら(真なら)、digitalWrite(LED, HIGH); つまりLEDを点灯する。

そうでなかったら(偽なら)、digitalWrite(LED, LOW); つまりLEDを点けない(消す)。

スイッチを押すと点いたり消えたりするスケッチ

<スイッチを押すとLEDランプの点灯・消灯を切り替える(?)>

void loop() {
	if (digitalRead(SWITCH)) {
	  if (LEDOn) {
		LEDOn = false;
		digitalWrite(LED, LOW);
	  } else {
		LEDOn = true;
		digitalWrite(LED, HIGH);
	  }
	}
}

 

・変数……名前をつけた箱のようなものと言われてます。その箱を作っておけば、途中で箱(データ)の中身を変えられるが変数です。

 ここでは変数LEDOnを用意します。スイッチを押すごとに変数の中身が変わるようにします。

boolean LEDOn = false

boolean型の変数LEDOnにfalseを代入しているという意味です。

最初にfalseにしているのは電源を入れた時にLEDを消しておくためです。

・boolean……boolean型の変数は真か偽を返す変数型。

<書式>

boolean 変数名 = trueまたはfalse ;

boolean a = true;

完成版 スイッチを押すと点いたり消えたりするスケッチ

<チャンとスイッチが反応する完成系>

#define LED 7
#define SWITCH 13

boolean LEDOn = false;
boolean switchOn = false;

void setup() {
	pinMode(LED, OUTPUT);
	pinMode(Switch, INPUT);
}

void loop() {
	if (digitalRead(SWITCH) && !switchOn) {
		if (LEDOn) {
		  LEDOn = false;
		  digitalWrite(LED, LOW);
		} else {
		  LEDOn = true;
		  digitalWrite(LED, HIGH);
		}
	}``
	switchOn = digitalRead(SWITCH);
}

 

・&& (AND回路)……左の式と右の式がどちらも真であれば真を返す演算子。

・! ‥…真であれば偽を返し、偽であれば真を返す演算子。

(digitalRead(SWITCH) && !switchOn)

 digitalRead(SWITCH)が真(true)であり、switchOnが偽(false)である時、if文に合致するということ。

 つまり、上の文が真である時、LEDOn変数は偽となり、LEDは消える。

 そうでないなら、つまり、digitalRead(SWITCH)が偽であり、switchOnが真である時は、LEDは点く。

 別の言い方をすれば、今スイッチが押されているが前に調べた時は押されていなかった瞬間、つまりスイッチが押された瞬間を検知するようになっている。その時にLEDは点く。

switchOn = digitalRead(SWITCH);

switchOnにdigitalReadの値が代入されることで、digitalRead(SWITCH)が義を返していたのに次にloop関数に入った時に真を返すタイミングを知ることができるようになる。そのことでスイッチのズレがなくなる。 

まとめ

最後のスイッチを押してる間にループしてしまうのを調整するスケッチが難しかったですが、ここは慣れですね。

もう一度違うスケッチでやってみたいと思うのでまた復習してくださいね。

コメント