【徹底解説】Arduinoとブレッドボードで学ぶ!電子工作におけるボタン回路の基礎から応用まで

Arduino 機器制作



 

Arduinoとブレッドボードを用いる電子工作におけるボタンの種類や基礎、配線、応用

目次

  • 1. はじめに
  • 2. ボタンの基礎知識
    • 2.1 ボタンとは
    • 2.2 ボタンの種類
  • 3. Arduinoとブレッドボードの基本的な配線
    • 3.1 ブレッドボードの構造
    • 3.2 Arduinoのピン概要
    • 3.3 抵抗とプルアップ・プルダウンについて
  • 4. 単純なボタン回路とコード例
    • 4.1 外部抵抗を使ったプルダウン回路
    • 4.2 Arduinoの内部プルアップを使う回路
    • 4.3 どちらを使うべきか?
  • 5. ボタンのチャタリング(デバウンス)対策
    • 5.1 チャタリングとは
    • 5.2 ハードウェア的対策
    • 5.3 ソフトウェア的対策(コード例)
  • 6. 応用:複数ボタンと高度な利用例
    • 6.1 複数のボタンを扱う回路例
    • 6.2 長押し判定や連打判定
    • 6.3 状態保持(トグル動作)とLED制御
    • 6.4 マトリクスキーパッド応用
  • 7. まとめ



1. はじめに

Arduinoは初心者から上級者まで幅広く使われるマイコンボードで、アイデアをすばやく形にできるのが魅力です。なかでも、ボタンは最も基本的な入力デバイスのひとつであり、LED点灯のON/OFF制御やメニュー選択など、様々なプロジェクトで頻繁に使用されます。

一見、「ボタンなど簡単」と思うかもしれませんが、いざ深掘りすると、ノイズ(チャタリング)対策や種類別の配線方法、応用的な使い方など、知っておくべき知識が数多く存在します。本記事では、そうしたポイントを余すことなく、読者が驚くほど詳しく、かつ実践的に紹介していきます。

2. ボタンの基礎知識

2.1 ボタンとは

「ボタン」とは、電気回路上のスイッチの一種です。押されている間だけ回路をオンにするモーメンタリスイッチ(押している間だけ接点がつながるタイプ)が代表的で、Arduinoなどのデジタル入力においては、この接点のオン・オフを読み取って制御に役立てます。

2.2 ボタンの種類

電子工作で一般的に使われるボタンの主な種類は以下の通りです。

  1. タクトスイッチ(タクトボタン)
    小型で、ブレッドボード上でよく見かけるタイプ。押すと「カチッ」としたフィーリングがあり、押している間のみ接点が導通するモーメンタリスイッチ。
  2. メカニカルスイッチ(押しボタン)
    大きめのプラスチックボディを持ち、はんだ付けやパネルへの取り付けに使われることが多い。やはりモーメンタリのものが一般的だが、押すたびにオン・オフを切り替えるトグルスイッチもある。
  3. DIPスイッチ
    小さなスイッチが複数連なった形状。1つ1つがON/OFFを切り替えられ、設定用スイッチとして重宝される。ただし通常は回路のジャンパピンを切り替える目的で使われ、モーメンタリではなく保持型のスイッチ。
  4. タッチセンサー(静電容量式)
    物理的に押し込むのではなく、指先の静電容量を検知するセンサー。厳密には機械式スイッチではないが、「指で触れると信号を送る」というボタンの役割を果たす。

本記事では、主にタクトスイッチ(タクトボタン)を例に解説しますが、配線やプルアップ・プルダウンなどの考え方は他のボタンにも応用できます。

3. Arduinoとブレッドボードの基本的な配線

3.1 ブレッドボードの構造

ブレッドボードは、ジャンパワイヤを使い、はんだ付けをせずに回路を組める便利なツールです。
一般的には縦または横に電線が内部でつながっており、中央部分で左右に分割されている構造です。
タクトスイッチ用の四隅は対角に内部配線されている場合が多いので、取り付け向きに注意する必要があります。

ブレッドボードの配列(簡易図)

[ 5つの穴が縦につながっている列 ]
[ 5つの穴が縦につながっている列 ]
[中央(溝)で分割] ← タクトスイッチをまたいで配置すると便利
[ 5つの穴が縦につながっている列 ]
[ 5つの穴が縦につながっている列 ]

3.2 Arduinoのピン概要

Arduino Unoを例にとると、デジタルピン(0〜13)アナログ入力ピン(A0〜A5) が存在します。ボタンの信号を読み取るには、主にデジタル入力ピンを使用します。

  • デジタルピン:HIGH(5V)とLOW(0V)を判定したり出力したりする
  • アナログピン:0〜5Vを1024段階(10ビット)で読み取る

タクトスイッチで単純にON/OFFを読み取る場合は、デジタルピンで十分です。

3.3 抵抗とプルアップ・プルダウンについて

デジタルピンは、入力状態にしただけでは「フローティング」と呼ばれる不安定な状態になる場合があります。これを防ぐために、ピンを常にHIGHもしくはLOWに固定(プルアップまたはプルダウン)する仕組みが必要になります。

  • プルアップ:ピンが通常はHIGH(5V)に保たれ、ボタンを押すとLOW(0V)になる
  • プルダウン:ピンが通常はLOW(0V)に保たれ、ボタンを押すとHIGH(5V)になる

Arduinoには、内部にプルアップ抵抗を有効にする機能があり、外部抵抗を用意しなくても良いのが利点です。ただし、Arduino Unoの場合、内部プルダウン抵抗は存在しません。プルダウンを使う場合には、外付け抵抗を使って回路を組む必要があります。



4. 単純なボタン回路とコード例

ここでは、プルダウン配線と内部プルアップ配線の2種類を紹介します。どちらもよく使われる方法ですので、どちらもマスターしましょう。

4.1 外部抵抗を使ったプルダウン回路

回路例(プルダウン)

+5V --- ボタン ---+--- デジタルピン(例: 2番ピン)
                  |
                 [R] 10kΩ
                  |
                 GND
  1. ボタンの片側を+5V(Arduino 5Vピン)へ接続。
  2. ボタンのもう片側をデジタルピン(例: 2番ピン)へ接続。
  3. さらに、その同じボタン側を10kΩ抵抗を介してGNDへ接続(これがプルダウン抵抗)。

この場合、通常時:デジタルピンはGNDと10kΩでつながりLOWとなる
ボタン押下時:デジタルピンは+5VにつながりHIGHとなる

Arduino側の設定

pinMode(2, INPUT) として定義し、プルダウンは外部抵抗で行う。

コード例(プルダウン)

const int buttonPin = 2;
const int ledPin    = 13; // Arduino UnoのオンボードLED

void setup() {
  pinMode(buttonPin, INPUT); // 外部プルダウン回路
  pinMode(ledPin, OUTPUT);
}

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

  if (buttonState == HIGH) {
    // ボタンが押されている
    digitalWrite(ledPin, HIGH);
  } else {
    // ボタンが押されていない
    digitalWrite(ledPin, LOW);
  }
}
    

4.2 Arduinoの内部プルアップを使う回路

Arduinoには内部プルアップ抵抗を使う機能があります。これを使うと、外部の10kΩ抵抗が不要になります。

回路例(内部プルアップ)

デジタルピン(例:2番ピン) --- ボタン --- GND
  1. ボタンの片側をGNDへ接続。
  2. ボタンのもう片側をデジタルピン(例: 2番ピン)へ接続。

Arduino側のプルアップを有効にすると、通常時はピンがHIGH(5V相当) となり、ボタンを押すとGNDに引き落とされLOWになるという状態になります。

Arduino側の設定

pinMode(2, INPUT_PULLUP) を使用

コード例(内部プルアップ)

const int buttonPin = 2;
const int ledPin    = 13;

void setup() {
  // 内部プルアップ有効
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int buttonState = digitalRead(buttonPin);
  
  // 内部プルアップでは押されている時にLOWになる点が注意
  if (buttonState == LOW) {
    // ボタンが押されている
    digitalWrite(ledPin, HIGH);
  } else {
    // ボタンが押されていない
    digitalWrite(ledPin, LOW);
  }
}
    

ポイント:内部プルアップ使用時は、「押している時 = LOW」 という判定になるため、条件分岐が逆になることを覚えておきましょう。

4.3 どちらを使うべきか?

  • 外部抵抗を使ったプルダウン → 回路の状態がHIGHで読みたい、またはどうしてもプルダウンにする必要がある場合。
  • 内部プルアップ → 配線が簡単、追加の抵抗不要、逆論理に慣れれば便利。

ほとんどの場合は内部プルアップの方が部品が少なく済むので推奨されます。



5. ボタンのチャタリング(デバウンス)対策

5.1 チャタリングとは

ボタンは機械的に接点を合わせるため、押した瞬間や離した瞬間に接点が数ミリ秒単位で高速にON/OFFを繰り返します。これをチャタリング(またはバウンス)と呼びます。

もしチャタリングを無視してArduinoがそのまま高速サンプリングしてしまうと、「押された」→「押されてない」→「押された」… と何度も検出してしまい、想定外の挙動を引き起こします。

5.2 ハードウェア的対策

ハードウェア的対策としては、以下が挙げられます。

  • RCフィルタ(低パスフィルタ):ボタンと抵抗、コンデンサを組み合わせて、短時間のスイッチングを吸収する。
  • シュミットトリガ回路:入力にヒステリシスを持たせ、チャタリングを軽減する。

初心者のうちは上記の対策よりも、まずソフトウェア的デバウンスで十分な場合が多いです。

5.3 ソフトウェア的対策(コード例)

以下の例では、押された状態が一定時間継続しないと「有効な押下」とみなさない手法をとっています。

const int buttonPin = 2;
const int ledPin    = 13;

unsigned long lastDebounceTime = 0;   // 最後に状態が変わった時刻
unsigned long debounceDelay    = 50;  // チャタリング除去用の待ち時間 (ミリ秒)

int lastButtonState = HIGH;  // 内部プルアップを想定
int buttonState     = HIGH;  // 今の実際のボタン状態
int ledState        = LOW;   // LEDの状態

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

void loop() {
  int reading = digitalRead(buttonPin);

  // ボタンの状態が変化したかどうかをチェック
  if (reading != lastButtonState) {
    // 状態が変わったら、時刻を記録
    lastDebounceTime = millis();
  }

  // 状態変化から debounceDelayミリ秒経過したら、状態を確定
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // ここで実際のボタン状態を更新する
    if (reading != buttonState) {
      buttonState = reading;

      // ボタンが押された(LOW)になったタイミングでLEDを切り替え
      if (buttonState == LOW) {
        ledState = (ledState == HIGH) ? LOW : HIGH;
      }
    }
  }
  
  // LEDを実際に設定
  digitalWrite(ledPin, ledState);

  // 次のループに備え、lastButtonStateを更新
  lastButtonState = reading;
}
    

※ debounceDelay を増やせばチャタリングを確実に抑えられますが、ボタンの反応がやや遅く感じられることも。一般的には10〜50ms程度が目安。



6. 応用:複数ボタンと高度な利用例

6.1 複数のボタンを扱う回路例

複数のボタンを使用する場合、内部プルアップを使うのが配線は楽です。各ボタンの片側をGNDに、もう片側をそれぞれのデジタルピンに繋ぎます。

例:

ボタンデジタルピン配線方式
ボタン12番内部プルアップ
ボタン23番内部プルアップ
ボタン34番内部プルアップ
const int buttonPins[] = {2, 3, 4};
const int numButtons = 3;

void setup() {
  for(int i = 0; i < numButtons; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
}

void loop() {
  for(int i = 0; i < numButtons; i++) {
    int state = digitalRead(buttonPins[i]);
    // stateがLOWなら押されている
    // 各ボタンごとの処理を記述
  }
}
    

6.2 長押し判定や連打判定

「ボタンを1秒以上押し続けたら特別な処理を行う」などの要件がある場合、押し始めの時刻を記録し、millis() 関数を使って押している時間を測定します。

unsigned long pressStartTime = 0;
bool isPressed = false;

void loop() {
  int reading = digitalRead(buttonPin);
  
  // 押され始めた瞬間の処理
  if (reading == LOW && !isPressed) {
    isPressed = true;
    pressStartTime = millis();
  }
  
  // 離された瞬間の処理
  if (reading == HIGH && isPressed) {
    unsigned long pressDuration = millis() - pressStartTime;
    isPressed = false;

    if (pressDuration < 1000) {
      // 短押し
    } else {
      // 長押し
    }
  }
}
    

6.3 状態保持(トグル動作)とLED制御

上のデバウンスコード例を参考に、ボタンが押されるたびに何かの状態をトグルするのは、基本的な操作方法のひとつです。
例えば、LEDのON/OFFを切り替える、モーターの回転/停止を切り替える、他のセンサーの計測を開始/停止する、などに応用可能です。

6.4 マトリクスキーパッド応用

多数のボタンを省ピンで扱いたい場合、ボタンを行列上に配置して読み取る「キーパッド」方式もあります。
例:3×3=9個のボタンを、3本の行ピン + 3本の列ピン = 計6本で読み取る。
スキャン方式でどのボタンが押されたかを判定します。

ただし、チャタリング対策やダイオードの設置なども必要になる場合があり、やや上級者向けです。

7. まとめ

本記事では、Arduinoとブレッドボードでボタンを扱う際の基礎から応用までを詳しく紹介しました。重要なポイントは以下の通りです。

  1. ボタンはデジタル入力の基本:モーメンタリスイッチが多い
  2. プルアップ・プルダウン:フローティングを回避するために必須
    • Arduinoには内部プルアップがあり、外部抵抗を使わずに済む
    • 押下時の論理がLOWになるため注意
  3. チャタリング(デバウンス)対策:機械的な接点が起こすノイズ
    • ハードウェア(RCフィルタ、シュミットトリガ)
    • ソフトウェア(一定時間の状態確認)
  4. 応用
    • 複数ボタンの扱い
    • 長押し・連打判定
    • トグル動作
    • マトリクスキーパッドによる省ピン化

これらの知識を押さえることで、どのような種類のボタンを使っても柔軟にプロジェクトを進められるはずです。実際の電子工作やArduinoプロジェクトで本記事の内容を応用しながら、ぜひ色々なアイデアに挑戦してみてください。

以上が、Arduinoとブレッドボードを用いる電子工作におけるボタンの種類や基礎、配線、応用に関する総合的な解説です。

 

特集記事

コメント

この記事へのコメントはありません。

TOP