ArduinoでLEDを点滅させる

Arduinoとスイッチを使ってLチカした。

スイッチを押している間点灯し、離している間消灯する。

使用した部品

  • Arduino Uno R3
  • USBケーブル
  • ブレッドボード
  • ジャンパワイヤ
  • タクトスイッチ
  • LED (OSDR3133A)
  • カーボン抵抗 10kΩ、680Ω

10kΩはプルアップ用、680ΩはLEDの電流制限用に使用した。

使用したLED (OSDR3133A)のデータシートを見ると、順電流IF=20mAの場合、順電圧VF=2.0Vと記載されている。

IF=20mA流してもいいが、最近のLEDは少ない電流でも明るいらしいので今回は5mAほど流す。

データシートには5mA時のVFは書いていないが、大きく変わらないと思うのでVF=2.0Vで抵抗値を計算する。

抵抗値を求める式は以下の通り。

R = \frac{V-VF}{IF}

オームの法則によりR=V/Iとなるが、LEDによってVF[V]の電圧降下が起こるのでV-VFとなる。

R = \frac{5-2}{5m} = 600Ω

今回は、手元にあった600Ωに近い値の680Ω抵抗を使用した。

回路図

LEDは7番ピン、タクトスイッチはプルアップして8番ピンに接続した。

プルアップした回路を下図に示す。

この10kΩ抵抗をプルアップ抵抗と呼ぶ。

f:id:szty1012:20180117014231j:plain
プルアップした回路

Arduinoの入力端子はハイインピーダンス(抵抗がとても大きい)なので、100MΩ抵抗に置き換えた。

100MΩ抵抗の両端にかかる電圧を入力端子の電圧とする。

スイッチを押した場合、電流は短絡された方にだけ流れ入力端子の電圧は0V、スイッチを離した場合、分圧により入力端子の電圧は5Vになる。

また、スイッチの下に抵抗を付けた回路をプルダウンと呼ぶ。

この10kΩ抵抗をプルダウン抵抗と呼ぶ。

f:id:szty1012:20180117022829j:plain
プルダウンした回路

スイッチを押した場合、入力端子の電圧は並列のため5V、離した場合、100MΩ抵抗の両端は繋がっているため電位差は生じず、入力端子の電圧は0Vになる。

もしプルアップ抵抗もプルダウン抵抗もなかった場合下図になる。

f:id:szty1012:20180206020642j:plain
入力端子にスイッチを直接繋いだ回路

スイッチを押した場合、入力端子の電圧は5V、離した場合、電圧が分からなくなる。

なぜなら、ハイインピーダンス(=100MΩ)=断線している状態=ラベルaはグランドにも5Vにも繋がっていない状態=ラベルaの電位が分からない状態とみなせるため、抵抗の両端の電位差が不安定になるから。

抵抗の両端を導線で繋いで電位差を0Vにすればこの問題は解決するが、それだとスイッチを押した時に短絡して常に0Vになってしまうため、プルアップ抵抗かプルダウン抵抗を入れなければならない。

また、プルアップ・ダウン抵抗が大きすぎるとハイインピーダンス状態になるのでやる意味がないし、小さすぎると消費電流が多くなるため、10kΩくらいがいいらしい。

プログラム

#define LED 7
#define SW 8

unsigned char state;

// 動作時に一度だけ実行
void setup() {
  // 7番ピンを出力に設定
  pinMode(LED, OUTPUT);
}

// 繰り返し実行
void loop() {
  // SWの状態を読み込む
  state = digitalRead(SW);

  if (state == LOW) {
    // もし、SWが押されているならLEDを点灯
    digitalWrite(LED, HIGH);
  } else {
    // SWが押されていなかったら消灯
    digitalWrite(LED, LOW);
  }

}