さてさて、前回はPWMという仕組みを使ってLEDを無段階に明るさ制御する方法を扱いましたが、今回はタクトスイッチを使って段階的に明るさを切り替える方法について扱ってみたいと思います。

スポンサーリンク




目次

  1. 必要なもの
    1. 必要なものリスト
    2. タクトスイッチとは?
  2. 回路の組み立て
    1. タクトスイッチの接続
    2. LEDの接続
  3. プログラムして実行!
    1. プログラムコード
    2. コードの解説
  4. まとめ

1. 必要なもの

1-1. 必要なものリスト

  • Arduino UNO
  • LED(何色でもOK)
  • 固定抵抗器(10Ω)※帯:茶-黒-オレンジ-金
  • 固定抵抗器(330Ω程度のもの)※帯:オレンジ-オレンジ-茶-金
  • ジャンパワイヤ(オス-オス)
  • タクトスイッチ
  • Arduinoをはじめようキット」だと、必要なものが全て揃っています。

※上記一覧のリンクはamazonへのリンクとなっています。

1-2. タクトスイッチとは?

今回初めて使う「タクトスイッチ」とはプッシュ式のスイッチで、ブレッドボードに差し込んで使います。電子工作でスイッチングする時によく使います。

秋月電子通商などで1個10円で購入できます。

またこのスイッチと一緒に10Ωの固定抵抗器もセットで使うので、用意しておきましょう。

2. 回路の組み立て

回路は下図を参考に組んでみてください。

※クリックで拡大します。

2-1. タクトスイッチの接続

タクトスイッチの片側の足に「5v」出力からジャンパー線で繋ぎ、もう片方にはデジタルI/Oピンの7番(入力として使用)を繋ぎます。また、10Ωの固定抵抗器を介して「GND」にも繋ぎます。

2-2. LEDの接続

LEDの方は、PWM出力が使えるデジタルI/Oピンの9番を使用します。前回までと同様に、330Ω程度の固定抵抗器を介して「GND」に繋ぎます。極性を間違えないようにして繋ぎましょう!

3. プログラムして実行!

今度はArduino IDEでプログラミングです。こんな感じで組んでみます。

3-1. プログラムコード

// 5段階の明るさ制御機能を実装

const int LED = 9;            // LEDが接続されているピン
const int BUTTON = 7;         // プッシュボタンが接続されているピン

int val = 0;                  // 入力ピンの状態
int state = 0;                // LEDの状態(0ならオフ、1〜5ならオン)

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);       // ArduinoにLEDが出力であることを伝える
  pinMode(BUTTON, INPUT);     // BUTTONは入力に設定
}

void loop() {
  val = digitalRead(BUTTON);  // 入力を読み取りvalに格納

  // ボタン押下回数による明るさ定義
  if (state == 0) {
    analogWrite(LED, 0);      // 明るさ:0%
    delay(10);
    if (val == 1) {
      state++;
      Serial.println(state);
      delay(500);
    }
  } else if (state == 1) {
    analogWrite(LED, 51);     // 明るさ:20%
    delay(10);
    if (val == 1) {
      state++;
      Serial.println(state);
      delay(500);
    }
  } else if (state == 2) {
    analogWrite(LED, 102);    // 明るさ:40%
    delay(10);
    if (val == 1) {
      state++;
      Serial.println(state);
      delay(500);
    }
  } else if (state == 3) {
    analogWrite(LED, 153);    // 明るさ:60%
    delay(10);
    if (val == 1) {
      state++;
      Serial.println(state);
      delay(500);
    }
  } else if (state == 4) {
    analogWrite(LED, 204);    // 明るさ:80%
    delay(10);
    if (val == 1) {
      state++;
      Serial.println(state);
      delay(500);
    }
  } else if (state == 5) {
    analogWrite(LED, 255);    // 明るさ:100%
    delay(10);
    if (val == 1) {
      state = 0;
      Serial.println(state);
      delay(500);
    }
  }
}

※Arduinoの言語はC/C++に似ていますが、独自の言語ということになっています。

3-2. コードの解説

まず、3〜7行目はピン設定を定数として定め、このプログラムで使用する変数の初期化を行なっています。

「val」はスイッチで得た値を格納します。0か1の整数(int)が入ります。スイッチを押した時だけ「1」が返されるようになっています。また、「state」は明るさの設定を格納していますが、今回は5段階の制御ですので、0〜5までの整数(int)が格納されることになります。

9〜13行目のsetup関数では、3つの記述が入ります。

最初の記述の「Serial.begin(9600);」はデバッグに使用するシリアルモニタを初期化するための記述です。「ツール > シリアルモニタ」で小さいデバッグ用のウィンドウが開くのですが、今回はそこに「state」の値を表示してみたいと思っています。

続く記述ですが、pinMode関数を使って、接続しているLEDとタクトスイッチの入出力の初期化を行なっています。

15行目以降のloop関数では、このプログラムの繰り返しの動作を定義しています。if文を使って、現在の明るさ設定値「state」毎の処理を記述しています。analogWrite()関数の第一引数には「LED」を指定し、第二引数にはPWMの数値を指定します。0〜255の整数が入るので、5段階だとこのような区分けになります。ちなみにPWMって何のこと?と思われた方は、前回のこちらの記事を参照してください。

ネスト(入れ子)しているif文では、スイッチが押されて「val == 1」となった時の処理、つまり「state」の値を変更し、明るさを変更する処理を入れてあります。加えて、シリアルモニタに出力するデバッグ用の記述「Serial.println(state);」を加えてあります。

ちなみに、今回使用しているSerial.println関数は改行コード付きです。他に、Serial.print関数という関数もあるのですが、こちらは改行コード無しで出力ができます。必要に応じて使い分けましょう。

ところどころ、delay関数で処理を遅延させていますが、これを無くしてしまうとうまく動作しないことがあるので、必須の記述となります。

4. まとめ

Arduinoでタクトスイッチを扱う場合は、今回のようにdigitalRead関数を使って0か1かの値を読み込んで使用しますが、様々な回路に使用可能な応用範囲が広いものですので、是非とも覚えておきたいところです。

市販のLEDのデスクライトには一つのボタンで明るさ調整・消灯を制御するものがありますが、その機能をArduinoで実装すると概ねこのようなやり方になると思います。

またデバッグの際にSerial.println関数を使ってシリアルモニタに出力する方法も今回扱いましたが、この方法も是非覚えておきましょう。