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

タクトスイッチは、Arduinoでもっとも身近な入力部品の一つです。ただし、ただつなぐだけでは正しく動きません。プルアップやプルダウンといった回路の工夫が必要です。本記事では、配線の考え方からコードの書き方まで解説します。さらに、チャタリングによる誤入力への対策まで、初心者の方に向けて順を追って紹介します。
01なぜスイッチの読み取りには回路の工夫が必要か
デジタル入力の基本
Arduinoのデジタルピンは、電圧の高さを2つの状態として読み取ります。5V付近であればHIGH、0V付近であればLOWです。digitalRead()関数を使うと、そのピンの状態を判定できます。スイッチが押されているかどうかを知りたい場合も、この仕組みを利用できそうに思えます。しかし、実際にはひと工夫が必要です。
何もつながっていないと状態が不安定になる

タクトスイッチをピンとGNDの間にただつなぐだけでは、うまくいきません。スイッチを押していない間、ピンはどこにもつながっていない状態になります。これを「フローティング」と呼びます。フローティング状態のピンは、HIGHともLOWとも定まりません。周囲のノイズを拾って、値がランダムにふらついてしまいます。だからこそ、ピンの状態を確定させる仕組みが必要です。それが、次の章で説明するプルアップ・プルダウン抵抗です。
初めてスイッチを扱うMさんは、深く考えずにスイッチをピンとGNDだけにつないでみた。すると、触れてもいないのにシリアルモニタの表示が細かく変化した。原因はフローティングだった。プルアップ抵抗を追加したところ、表示はぴたりと安定した。「つなぐだけでは動かない」ことを実感できる、よくあるつまずきです。
02プルアップ・プルダウンとは|基礎知識

プルアップ抵抗の仕組み
プルアップ抵抗は、ピンを常に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Ω程度の抵抗値がよく使われます。
03配線方法:外部抵抗と内蔵プルアップ
外部プルアップ抵抗を使う配線
スイッチの片側をArduinoのデジタルピンにつなぎます。同じ側から10kΩ程度の抵抗を経由して5Vにもつなぎます。スイッチのもう片側はGNDにつなぎます。これで、押していない時はHIGH、押した時はLOWになる回路の完成です。
内蔵プルアップを使う配線(部品が少なく簡単)
内蔵プルアップを使う場合は、さらにシンプルです。スイッチの片側をArduinoのデジタルピンに、もう片側をGNDに直接つなぐだけで完成します。抵抗を用意する必要がありません。コード側でINPUT_PULLUPを指定するだけで、外部プルアップ抵抗と同じ「押した時にLOW」という動作になります。
多くのタクトスイッチは4本足
市販のタクトスイッチには、4本の足があるものが多く流通しています。一見複雑に見えますが、内部では対角の2本ずつが常時つながっています。実質的には2点間のスイッチと変わりません。対角にある1本ずつ、合計2本を使えば問題なく動作します。残りの2本は使わなくても構いません。
編集部の見解として、初めての方にはまず内蔵プルアップでの配線をおすすめします。部品数が少なく、配線ミスのリスクも下がるためです。外部抵抗を使う方式は、複数のスイッチをまとめて扱う応用的な場面で検討すると良いでしょう。
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のどちらになるかだけです。まずは動かしてみましょう。自分の配線でどちらの判定になるか確認してみてください。基本文法については、下記の記事でも詳しく解説しています。
05誤入力対策|チャタリングとその対処法
チャタリングとは何か

スイッチ内部の金属接点は、押した瞬間や離した瞬間に小刻みに振動します。ごく短い時間だけ、接触と離脱を繰り返すのです。この現象を「チャタリング」と呼びます。人の目には一瞬の出来事に見えます。しかし、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程度)を追加する方法です。接点が細かく振動しても、コンデンサが電圧の急激な変化を吸収してくれます。ソフトウェアとハードウェア、どちらか一方だけでも十分な場合が多いです。両方を組み合わせれば、さらに安定した動作が期待できます。
まずはソフトウェアによるデバウンスから試すことをおすすめします。部品を追加する必要がなく、コードの修正だけで対応できるためです。それでも不安定さが残る場合は、ハードウェア側のコンデンサ追加を検討すると良いでしょう。
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;
}
07よくあるトラブルと対処法
症状別の対処早見表
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| 触れていないのに状態が細かく変化する | フローティング状態(プルアップ・プルダウン未設定) | INPUT_PULLUPを指定するか、外部抵抗を追加する(2章参照) |
| 押した判定が常に逆になる | プルアップとプルダウンの判定を取り違えている | LOW/HIGHの条件式を配線方式に合わせて見直す |
| 1回押しただけで複数回反応する | チャタリングによる誤カウント | デバウンス処理を追加する(5章参照) |
| コードを書き込んでも一切反応しない | 配線ミス、またはピン番号の指定違い | スイッチとピンの配線、コード内のピン番号を再確認する |
| 特定のピンだけ反応がおかしい | そのピンがすでに他の用途で使われている | 別のデジタルピンに配線を移してみる |
原因を素早く切り分けるコツ
Yさんはトグル式のLED点灯コードを試したが、1回押すたびにLEDが2〜3回切り替わってしまった。狙った通りに動作しなかったのだ。そこで、デバウンス処理が入っていないことに気づいた。5章のコードを参考に追加すると、1回の押下で正確に1回だけ切り替わるようになった。「動くけれど不安定」という症状は、多くの場合チャタリングが原因です。
08よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
- YOFUKASI LAB「Arduinoのピンモード(pinMode)の基礎解説」2026年, https://yofukasi-lab-wp.com/2026/08/02/pinmode/
- YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/
応用・トラブルシューティング記事
- YOFUKASI LAB「Arduinoのmillis()でdelayを使わない書き方」2026年, https://yofukasi-lab-wp.com/2026/07/30/delay-millis/
- YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
- YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
参考資料(外部・一次情報)
- Arduino Documentation「Digital Pins」, https://www.arduino.cc/en/Tutorial/DigitalPins
- Arduino Documentation「Debounce on a Pushbutton」, https://docs.arduino.cc/built-in-examples/digital/Debounce
- Arduino Documentation「pinMode()」, https://docs.arduino.cc/language-reference/en/functions/digital-io/pinMode/
※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。
コメント