Arduinoでタクトスイッチ入力|配線とコードを初心者向けに解説

プログラミング・電子工作






Arduinoでタクトスイッチ入力|配線とコード







入門 / Arduino

Arduinoでタクトスイッチの状態を読み取る|配線とコードを徹底解説

Arduinoでタクトスイッチの状態をdigitalReadで読み取る仕組み

タクトスイッチは、Arduinoでもっとも身近な入力部品の一つです。ただし、ただつなぐだけでは正しく動きません。プルアップやプルダウンといった回路の工夫が必要です。本記事では、配線の考え方からコードの書き方まで解説します。さらに、チャタリングによる誤入力への対策まで、初心者の方に向けて順を追って紹介します。

YOFUKASI LAB編集部
公開日:2026年8月27日
読了目安:12分

執筆・実機検証:YOFUKASI LAB運営者

理学療法士/Arduino・Pythonを使った医療機器制作・学会発表経験あり

Chapter 01 / Basics

01なぜスイッチの読み取りには回路の工夫が必要か

デジタル入力の基本

Arduinoのデジタルピンは、電圧の高さを2つの状態として読み取ります。5V付近であればHIGH、0V付近であればLOWです。digitalRead()関数を使うと、そのピンの状態を判定できます。スイッチが押されているかどうかを知りたい場合も、この仕組みを利用できそうに思えます。しかし、実際にはひと工夫が必要です。

何もつながっていないと状態が不安定になる

Arduinoのタクトスイッチ入力で起こるフローティングとプルアップ抵抗の違い

タクトスイッチをピンとGNDの間にただつなぐだけでは、うまくいきません。スイッチを押していない間、ピンはどこにもつながっていない状態になります。これを「フローティング」と呼びます。フローティング状態のピンは、HIGHともLOWとも定まりません。周囲のノイズを拾って、値がランダムにふらついてしまいます。だからこそ、ピンの状態を確定させる仕組みが必要です。それが、次の章で説明するプルアップ・プルダウン抵抗です。

編集部想定シナリオ

初めてスイッチを扱うMさんは、深く考えずにスイッチをピンとGNDだけにつないでみた。すると、触れてもいないのにシリアルモニタの表示が細かく変化した。原因はフローティングだった。プルアップ抵抗を追加したところ、表示はぴたりと安定した。「つなぐだけでは動かない」ことを実感できる、よくあるつまずきです。



Chapter 02 / Concept

02プルアップ・プルダウンとは|基礎知識

Arduinoのタクトスイッチで使うプルアップとプルダウンとINPUT_PULLUPの比較

プルアップ抵抗の仕組み

プルアップ抵抗は、ピンを常に5V側に引き上げておく抵抗です。ピンと5Vの間に抵抗を挟みます。スイッチは、ピンとGNDの間に配置します。スイッチを押していないとき、ピンは抵抗を通じて5Vに引き上げられます。この状態がHIGHです。スイッチを押すと、ピンは直接GNDにつながります。電流は抵抗ではなくスイッチ側に流れ、ピンはLOWになります。つまり、プルアップ方式では「押した時にLOW」という読み替えが必要です。

プルダウン抵抗の仕組み

プルダウン抵抗は、考え方がプルアップの逆です。ピンとGNDの間に抵抗を挟みます。スイッチは、ピンと5Vの間に配置します。スイッチを押していないとき、ピンは抵抗を通じてGNDに引き下げられます。この状態がLOWです。スイッチを押すと、ピンは直接5Vにつながり、HIGHになります。プルダウン方式では、「押した時にHIGH」という直感的な対応になります。

Arduinoの内蔵プルアップ(INPUT_PULLUP)

外部に抵抗を用意しなくても、Arduino自身が内蔵のプルアップ抵抗を持っています。pinMode(ピン番号, INPUT_PULLUP)と書くだけで、そのピンの内蔵プルアップが有効になります。

内蔵抵抗の値と使い方の目安

Arduino公式のDigital Pinsチュートリアルによると、多くのAVR系ボードでの内蔵抵抗の値は20kΩから50kΩの範囲です。外部の抵抗を1本も使わずに済むため、配線がとてもシンプルになります。初心者の方には、まずこの内蔵プルアップから試すことをおすすめします。

方式 抵抗の位置 押していない時 押した時
プルアップ(外部抵抗) ピン⇔5V間 HIGH LOW
プルダウン(外部抵抗) ピン⇔GND間 LOW HIGH
内蔵プルアップ(INPUT_PULLUP) Arduino内部(20〜50kΩ) HIGH LOW

※外部抵抗を使う場合、一般的には10kΩ程度の抵抗値がよく使われます。

Chapter 03 / Wiring

03配線方法:外部抵抗と内蔵プルアップ

外部プルアップ抵抗を使う配線

スイッチの片側をArduinoのデジタルピンにつなぎます。同じ側から10kΩ程度の抵抗を経由して5Vにもつなぎます。スイッチのもう片側はGNDにつなぎます。これで、押していない時はHIGH、押した時はLOWになる回路の完成です。

[画像挿入位置]外部プルアップ抵抗を使った配線図(ピン・10kΩ抵抗・5V・スイッチ・GNDの接続関係がわかるもの)

内蔵プルアップを使う配線(部品が少なく簡単)

内蔵プルアップを使う場合は、さらにシンプルです。スイッチの片側をArduinoのデジタルピンに、もう片側をGNDに直接つなぐだけで完成します。抵抗を用意する必要がありません。コード側でINPUT_PULLUPを指定するだけで、外部プルアップ抵抗と同じ「押した時にLOW」という動作になります。

[画像挿入位置]内蔵プルアップを使った配線図(ピン・スイッチ・GNDのみのシンプルな接続を示すもの)

多くのタクトスイッチは4本足

市販のタクトスイッチには、4本の足があるものが多く流通しています。一見複雑に見えますが、内部では対角の2本ずつが常時つながっています。実質的には2点間のスイッチと変わりません。対角にある1本ずつ、合計2本を使えば問題なく動作します。残りの2本は使わなくても構いません。

データ・編集部見解

編集部の見解として、初めての方にはまず内蔵プルアップでの配線をおすすめします。部品数が少なく、配線ミスのリスクも下がるためです。外部抵抗を使う方式は、複数のスイッチをまとめて扱う応用的な場面で検討すると良いでしょう。



Chapter 04 / Code

04基本のコード|digitalRead()で状態を読み取る

内蔵プルアップ配線でのコード

まずは、配線がシンプルな内蔵プルアップの例から見てみましょう。pinMode()INPUT_PULLUPを指定するのがポイントです。押した時にLOWになる点を忘れないようにしてください。

// 内蔵プルアップでタクトスイッチの状態を読み取るコード
const int buttonPin = 2;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // 内蔵プルアップを有効化
  Serial.begin(9600);
}

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

  if (state == LOW) {
    // LOWのときが「押されている」状態
    Serial.println("押されています");
  } else {
    Serial.println("押されていません");
  }

  delay(100);
}

プルダウン配線でのコード

外部にプルダウン抵抗を組んだ場合は、判定が逆になります。押した時にHIGHになるため、直感的なコードになります。

// 外部プルダウン抵抗でタクトスイッチの状態を読み取るコード
const int buttonPin = 2;

void setup() {
  pinMode(buttonPin, INPUT); // 外部抵抗を使うのでINPUTでよい
  Serial.begin(9600);
}

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

  if (state == HIGH) {
    // HIGHのときが「押されている」状態
    Serial.println("押されています");
  } else {
    Serial.println("押されていません");
  }

  delay(100);
}

方式によって変わるのは判定の向きだけ

どちらの方式でも、コードの骨格はほとんど同じです。違うのは、押した時にHIGHとLOWのどちらになるかだけです。まずは動かしてみましょう。自分の配線でどちらの判定になるか確認してみてください。基本文法については、下記の記事でも詳しく解説しています。

Chapter 05 / Debounce

05誤入力対策|チャタリングとその対処法

チャタリングとは何か

Arduinoのタクトスイッチで発生するチャタリングとデバウンス対策

スイッチ内部の金属接点は、押した瞬間や離した瞬間に小刻みに振動します。ごく短い時間だけ、接触と離脱を繰り返すのです。この現象を「チャタリング」と呼びます。人の目には一瞬の出来事に見えます。しかし、Arduinoの処理速度から見ると事情が違います。この間に何度も状態が切り替わって見えることがあるのです。その結果、1回押しただけでも複数回押されたと判定されることがあります。

ソフトウェアで対策する

もっとも手軽な対策は、コード側で一定時間だけ状態の変化を無視することです。これをデバウンス処理と呼びます。Arduino公式のDebounceサンプルでは、millis()を使って現在の時刻を記録します。

公式サンプルの考え方

状態が変化してから50ミリ秒が経過するまで、次の変化を受け付けません。これが公式サンプルの基本的な考え方です。この50ミリ秒という値は、多くのチュートリアルで使われる目安です。チャタリングが収まらない場合は、もう少し長く設定しても構いません。

// millis()を使ったソフトウェアデバウンスの例
const int buttonPin = 2;

int lastReading = HIGH;       // 前回の生の読み取り値
int buttonState = HIGH;       // デバウンス後の確定した状態
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50; // 50ミリ秒待つ

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

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

  // 生の値が変化したら、時刻を記録し直す
  if (reading != lastReading) {
    lastDebounceTime = millis();
  }

  // 変化してから50ミリ秒経過していたら、確定状態を更新
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == LOW) {
        Serial.println("ボタンが押されました");
      }
    }
  }

  lastReading = reading;
}

ハードウェアで対策する

回路の側でチャタリングを抑える方法もあります。スイッチと並列に、小容量のセラミックコンデンサ(0.1μF程度)を追加する方法です。接点が細かく振動しても、コンデンサが電圧の急激な変化を吸収してくれます。ソフトウェアとハードウェア、どちらか一方だけでも十分な場合が多いです。両方を組み合わせれば、さらに安定した動作が期待できます。

編集部見解

まずはソフトウェアによるデバウンスから試すことをおすすめします。部品を追加する必要がなく、コードの修正だけで対応できるためです。それでも不安定さが残る場合は、ハードウェア側のコンデンサ追加を検討すると良いでしょう。



Chapter 06 / Application

06LEDと組み合わせた実践的な使用例

押している間だけ点灯

もっともシンプルな応用は、スイッチを押している間だけLEDを点灯させる例です。スイッチの状態を、そのままLEDの出力に反映させるだけで実現できます。

// スイッチを押している間だけLEDを点灯させるコード
const int buttonPin = 2;
const int ledPin = 13;

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

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

  if (state == LOW) {
    digitalWrite(ledPin, HIGH); // 押されていたら点灯
  } else {
    digitalWrite(ledPin, LOW);  // 離したら消灯
  }
}

押すたびに状態を切り替える(トグル動作)

次は、押すたびにLEDのON/OFFが切り替わる、トグル式のコードです。1回の押下を正確に1回として数える必要があります。そのため、5章のデバウンス処理と組み合わせるのが基本です。

トグル式コードの実装例

// 押すたびにLEDのON/OFFを切り替えるトグル式コード
const int buttonPin = 2;
const int ledPin = 13;

int lastReading = HIGH;
int buttonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
bool ledState = false;

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

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

  if (reading != lastReading) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      // LOWになった瞬間(押された瞬間)だけLEDを切り替える
      if (buttonState == LOW) {
        ledState = !ledState;
        digitalWrite(ledPin, ledState);
      }
    }
  }

  lastReading = reading;
}


Chapter 07 / Troubleshooting

07よくあるトラブルと対処法

症状別の対処早見表

症状 主な原因 対処法
触れていないのに状態が細かく変化する フローティング状態(プルアップ・プルダウン未設定) INPUT_PULLUPを指定するか、外部抵抗を追加する(2章参照)
押した判定が常に逆になる プルアップとプルダウンの判定を取り違えている LOW/HIGHの条件式を配線方式に合わせて見直す
1回押しただけで複数回反応する チャタリングによる誤カウント デバウンス処理を追加する(5章参照)
コードを書き込んでも一切反応しない 配線ミス、またはピン番号の指定違い スイッチとピンの配線、コード内のピン番号を再確認する
特定のピンだけ反応がおかしい そのピンがすでに他の用途で使われている 別のデジタルピンに配線を移してみる

原因を素早く切り分けるコツ

編集部想定シナリオ

Yさんはトグル式のLED点灯コードを試したが、1回押すたびにLEDが2〜3回切り替わってしまった。狙った通りに動作しなかったのだ。そこで、デバウンス処理が入っていないことに気づいた。5章のコードを参考に追加すると、1回の押下で正確に1回だけ切り替わるようになった。「動くけれど不安定」という症状は、多くの場合チャタリングが原因です。

Chapter 08 / FAQ

08よくある質問

基本のQ&A

Q.プルアップとプルダウン、どちらを使えばいいですか?
A.初心者の方には、Arduinoの内蔵プルアップ(INPUT_PULLUP)を使う方式をおすすめします。外部の抵抗を1本も使わずに済み、配線がシンプルになるためです。押した時にLOWになる、という読み替えだけ覚えておけば問題ありません。

Q.外部の抵抗を使わずにスイッチを直接つないだらどうなりますか?
A.ピンが「フローティング」という不安定な状態になります。スイッチを押していない間、HIGHともLOWとも定まりません。ノイズの影響で値がふらつきます。これでは正しく状態を読み取れません。必ずプルアップかプルダウンのどちらかで、ピンの状態を確定させる必要があります。

応用のQ&A

Q.チャタリング対策は必ず必要ですか?
A.スイッチの状態を表示するだけなら、チャタリングが多少あっても大きな問題にはなりません。しかし、1回の押下を1回のイベントとしてカウントしたい場合は対策が必須です。対策なしでは、1回押しただけで数回分のカウントが加算されてしまうことがあります。

Q.タクトスイッチの4本足はどう配線すればいいですか?
A.多くのタクトスイッチは4本足ですが、内部では対角の2本ずつが常時つながっています。実質的には2点間のスイッチと同じです。対角にある1本ずつ、合計2本を使えば正しく動作します。残りの2本は使わなくても構いません。

関連記事・参考資料

基礎を学べる記事

  1. YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
  2. YOFUKASI LAB「Arduinoのピンモード(pinMode)の基礎解説」2026年, https://yofukasi-lab-wp.com/2026/08/02/pinmode/
  3. YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/

応用・トラブルシューティング記事

  1. YOFUKASI LAB「Arduinoのmillis()でdelayを使わない書き方」2026年, https://yofukasi-lab-wp.com/2026/07/30/delay-millis/
  2. YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
  3. YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/

参考資料(外部・一次情報)

  1. Arduino Documentation「Digital Pins」, https://www.arduino.cc/en/Tutorial/DigitalPins
  2. Arduino Documentation「Debounce on a Pushbutton」, https://docs.arduino.cc/built-in-examples/digital/Debounce
  3. Arduino Documentation「pinMode()」, https://docs.arduino.cc/language-reference/en/functions/digital-io/pinMode/

※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。


関連記事

特集記事

コメント

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

TOP
CLOSE