Arduinoに押しボタンをつなぐ方法:プルアップ、プルダウン、チャタリング対策
Arduinoに押しボタンをどうつなぐのか。4本足ボタンの内部構造、プルアップ抵抗とプルダウン抵抗、INPUT_PULLUP、チャタリング対策、LEDを切り替える例を解説します。
ボタンは、ユーザーの操作をArduinoのプロジェクトに取り込むためのいちばんシンプルな部品です。押すと2つの接点がつながり、離すと離れます。単純に見えますが、配線を間違えるとランダムな値を読んだり、1回押しただけで何回も数えたりします。このガイドでは、ボタンを正しくつないで読み取る方法を説明します。

4本足ボタンの内部
ブレッドボードでいちばんよく使う6×6 mmのタクトスイッチには4本の足がありますが、接続点は2つしかありません。向かい合う足のペアが内部ですでにつながっているからです。ボタンを押すと、この2つのペアがつながります。ボタンをブレッドボードの中央の溝をまたぐように置けば、それぞれのペアが別々の列に入り、正しい向きにしやすくなります。
プルアップ抵抗やプルダウン抵抗が必要な理由
ボタンが押されていないとき、Arduinoの入力ピンはどこにもつながっていません。これをフローティング状態の入力といいます。このようなピンは電気的なノイズを拾い、HIGHやLOWをランダムに読み取ります。解決策は、抵抗を通してピンを決まったレベルに引っ張っておくことです。
| 方法 | 配線 | 押していないとき | 押したとき |
|---|---|---|---|
| プルダウン | 10 kΩ:ピン → GND、ボタン:ピン → 5V | LOW | HIGH |
| プルアップ(外付け) | 10 kΩ:ピン → 5V、ボタン:ピン → GND | HIGH | LOW |
| INPUT_PULLUP(内蔵) | ボタン:ピン → GND、抵抗は不要 | HIGH | LOW |
いちばん手軽な方法はpinMode(pin, INPUT_PULLUP)です。Arduinoに内蔵された約20〜50 kΩの抵抗が有効になり、ボタンをピンとGNDの間につなぐだけで済みます。違いはロジックが逆になることだけで、押すとLOWが読み取られます。
チャタリング対策:1回押しただけで何回も数えられるのはなぜ?
ボタンの金属接点が触れた瞬間、接点は数ミリ秒のあいだ振動し、回路が何度も開いたり閉じたりします。Arduinoは読み取りがとても速いので、1回の押下を3〜5回の押下として認識することがあります。これをチャタリング(接点のバウンス)といいます。ソフトウェアで解決するには、最後の変化から約50 msのあいだ、新しい変化を無視します。
1const int BUTTON_PIN = 2; // buton pin ile GND arasında / button between pin and GND
2const int LED_PIN = 13; // karttaki LED / onboard LED
3
4bool ledOn = false;
5int lastReading = HIGH;
6int stableState = HIGH;
7unsigned long lastChange = 0;
8
9void setup() {
10 pinMode(BUTTON_PIN, INPUT_PULLUP); // dahili pull-up / internal pull-up
11 pinMode(LED_PIN, OUTPUT);
12}
13
14void loop() {
15 int reading = digitalRead(BUTTON_PIN);
16 if (reading != lastReading) lastChange = millis(); // değişti / changed
17 if (millis() - lastChange > 50 && reading != stableState) {
18 stableState = reading; // 50 ms kararlı / stable for 50 ms
19 if (stableState == LOW) { // basıldı / pressed
20 ledOn = !ledOn; // LED'i değiştir / toggle LED
21 digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
22 }
23 }
24 lastReading = reading;
25}このコードは、ボタンを1回押すごとにLEDを1回切り替えます。押し続けても切り替わり続けることはありません。delay()ではなくmillis()を使っているので、ループが待ち状態にならず、同時にほかの処理もできます。
よくある失敗
- ボタンを間違った向きに差す:もともとつながっている足のペアを使うと、ボタンが常に押された状態として読み取られます。ボタンを90°回してください。
- 抵抗を使わない:プルアップやプルダウンがないと、読み取り値がランダムに変わります。
- INPUT_PULLUPでロジックを逆に考える:押したときに読み取られるのはHIGHではなくLOWです。条件はそれに合わせて書いてください。
- チャタリング対策に長いdelay()を使う:その間プログラムは何もできません。millis()でタイミングを取るほうが適しています。
- ESP32で34〜39番ピンを使う:これらのピンには内蔵プルアップがありません。外付けの抵抗を追加するか、別のピンを選んでください。
ボタンと抵抗をブレッドボードに正しく配置するにはブレッドボードとは?を、プルアップ抵抗の値を理解するには抵抗とは?を読んでみてください。
よくある質問
ボタンにはどの抵抗が必要ですか?
プルアップやプルダウンには10 kΩが標準です。INPUT_PULLUPを使えば、外付けの抵抗はまったく必要ありません。
ボタンを押すとLOWになるのはなぜですか?
INPUT_PULLUPや外付けのプルアップを使っていると、ピンは通常HIGHです。ボタンがピンをGNDにつなぐので、押したときにLOWになります。これは想定どおりの動作です。
チャタリング対策の時間はどのくらいにすればいいですか?
ほとんどのボタンは20〜50 msで十分です。古いボタンや品質の低いボタンでは80〜100 msが必要な場合があります。
複数のボタンを読み取るにはどうすればいいですか?
ボタンをそれぞれ別のピンにつなぎ、すべてINPUT_PULLUPに設定します。ボタンが多い場合は、キーパッドを使うか、異なる抵抗を使って1本のアナログピンで読み取ります。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
ボタンでLEDを点灯(押している間のみ)
呼び鈴のように、押している間は点灯し、離すと消灯します。Arduinoはボタンの状態を常に読み取り、押されている間はLEDを点灯させ、指を離した瞬間に消灯させます。このシンプルな回路で、ボードが外部からの操作を検知する仕組みを学べます。

ボタンでLEDの点灯・消灯を切り替え
部屋の照明スイッチのように、ボタンを1回押すと点灯し、もう1回押すと消灯します。Arduinoはボタンが押されるたびにLEDの状態を反転させます。ボタン内部の小さな接点の振動で誤動作しないよう、短い待ち時間も設けます。1つのボタンでオン・オフを切り替える、シンプルな仕組みです。

ブザーとボタンで作る簡単なピアノ
8個のボタンで小さなピアノを作ります。各ボタンには、低い音から順にド、レ、ミ、ファ、ソ、ラ、シ、高いドが割り当てられています。ボタンを押している間はブザーから音が鳴り、離すと止まります。簡単な曲を弾きながら、音符の正体が音の振動であることを実感できます。

7セグメントディスプレイとボタンで作るカウンター
3つのボタンを使うシンプルなカウンターです。1つ目のボタンを押すと表示の数字が1増え、2つ目を押すと1減り、3つ目を押すと0に戻ります。1桁の7セグメントディスプレイで0から9まで数え、範囲の端に達すると隅の小さな点が0.5秒間点灯して知らせます。スコアボードや順番表示器などのプロジェクトの基礎になります。

ESP32でボタンによるLED制御(押している間だけ点灯)
ボタンを押している間はLEDが点灯し、離すと消灯します。ESP32のデジタル入力ピンと内蔵プルアップ抵抗の使い方を学びます。INPUT_PULLUPモードを使うため、外付け抵抗は不要です。

ESP32でボタンによるLED制御(トグル)
ボタンを押すたびにLEDの状態が切り替わり、点灯中なら消灯し、消灯中なら点灯します。基本的なトグル動作です。チャタリング対策でボタンの機械的なノイズを除去し、1回の操作で1回だけ切り替わるようにします。

Raspberry Pi PicoでボタンによるLEDの点灯・消灯切り替え
ボタンとLEDを使って、さらに一歩進みます!基本のボタンプロジェクトと違い、ボタンを押し続ける必要はありません。1回押して離すとLEDが点灯し、もう1回押して離すと消灯します(トグル動作)。回路は同じ(LEDはGP14、ボタンはGP2)ですが、コードは大きく変わります。エッジ検出(1→0に変わる瞬間の検出)、状態の記録、チャタリング対策(機械的な接点の振動を除去)を学びます。MicroPythonのled.toggle()なら1行で状態を切り替えられます。モード切り替え、IRQ、ダブルクリックなど、ボタン操作を使うあらゆるプロジェクトの基礎になります。

Raspberry Pi Picoのボタンのチャタリング対策:IRQとソフトウェアポーリングの比較
ボタンを1回押しただけで、コードでは3~4回と数えられますか?原因はチャタリングです。金属接点がマイクロ秒単位で振動します!シリアルモニタで、2つのカウント方法を並べて比較します。未処理のポーリングは振動も検出して多く数え、IRQとソフトウェアによるチャタリング対策は正確に数えます。接点が振動する仕組み、ソフトウェアによる対策(ticks_diff() > 50ms)、Pin.irq()による割り込みの登録、IRQ_FALLINGトリガー、ISRハンドラー、globalとISRの安全な扱い方を学びます。IRQでLEDを切り替え、動作を目で確認できます。シリアルモニタには押すたびに両方のカウントが表示されます。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

