基礎 · 読了まで3分

Arduinoに押しボタンをつなぐ方法:プルアップ、プルダウン、チャタリング対策

Arduinoに押しボタンをどうつなぐのか。4本足ボタンの内部構造、プルアップ抵抗とプルダウン抵抗、INPUT_PULLUP、チャタリング対策、LEDを切り替える例を解説します。

ボタンは、ユーザーの操作をArduinoのプロジェクトに取り込むためのいちばんシンプルな部品です。押すと2つの接点がつながり、離すと離れます。単純に見えますが、配線を間違えるとランダムな値を読んだり、1回押しただけで何回も数えたりします。このガイドでは、ボタンを正しくつないで読み取る方法を説明します。

押しボタン
4本足のタクトスイッチ。足は内部で2本ずつつながっています。

4本足ボタンの内部

ブレッドボードでいちばんよく使う6×6 mmのタクトスイッチには4本の足がありますが、接続点は2つしかありません。向かい合う足のペアが内部ですでにつながっているからです。ボタンを押すと、この2つのペアがつながります。ボタンをブレッドボードの中央の溝をまたぐように置けば、それぞれのペアが別々の列に入り、正しい向きにしやすくなります。

向きがわからないときは、マルチメーターを導通モードにしてください。押さなくても音が鳴る足は、もともとつながっているペアです。押したときだけ音が鳴る足が、ボタンで切り替わる足です。

プルアップ抵抗やプルダウン抵抗が必要な理由

ボタンが押されていないとき、Arduinoの入力ピンはどこにもつながっていません。これをフローティング状態の入力といいます。このようなピンは電気的なノイズを拾い、HIGHやLOWをランダムに読み取ります。解決策は、抵抗を通してピンを決まったレベルに引っ張っておくことです。

方法配線押していないとき押したとき
プルダウン10 kΩ:ピン → GND、ボタン:ピン → 5VLOWHIGH
プルアップ(外付け)10 kΩ:ピン → 5V、ボタン:ピン → GNDHIGHLOW
INPUT_PULLUP(内蔵)ボタン:ピン → GND、抵抗は不要HIGHLOW

いちばん手軽な方法はpinMode(pin, INPUT_PULLUP)です。Arduinoに内蔵された約20〜50 kΩの抵抗が有効になり、ボタンをピンとGNDの間につなぐだけで済みます。違いはロジックが逆になることだけで、押すとLOWが読み取られます。

チャタリング対策:1回押しただけで何回も数えられるのはなぜ?

ボタンの金属接点が触れた瞬間、接点は数ミリ秒のあいだ振動し、回路が何度も開いたり閉じたりします。Arduinoは読み取りがとても速いので、1回の押下を3〜5回の押下として認識することがあります。これをチャタリング(接点のバウンス)といいます。ソフトウェアで解決するには、最後の変化から約50 msのあいだ、新しい変化を無視します。

C++ (Arduino IDE)
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を点灯(押している間のみ)
#9初級

ボタンでLEDを点灯(押している間のみ)

呼び鈴のように、押している間は点灯し、離すと消灯します。Arduinoはボタンの状態を常に読み取り、押されている間はLEDを点灯させ、指を離した瞬間に消灯させます。このシンプルな回路で、ボードが外部からの操作を検知する仕組みを学べます。

4.8(113)
229
ボタンでLEDの点灯・消灯を切り替え
#10初級

ボタンでLEDの点灯・消灯を切り替え

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

4.8(100)
167
ブザーとボタンで作る簡単なピアノ
#26上級
プレミアム

ブザーとボタンで作る簡単なピアノ

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

4.9(66)
88
7セグメントディスプレイとボタンで作るカウンター
#43上級
プレミアム

7セグメントディスプレイとボタンで作るカウンター

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

4.6(35)
47
ESP32でボタンによるLED制御(押している間だけ点灯)
#104初級

ESP32でボタンによるLED制御(押している間だけ点灯)

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

4.6(36)
55
ESP32でボタンによるLED制御(トグル)
#105初級

ESP32でボタンによるLED制御(トグル)

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

4.6(39)
57
Raspberry Pi PicoでボタンによるLEDの点灯・消灯切り替え
#156初級

Raspberry Pi PicoでボタンによるLEDの点灯・消灯切り替え

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

0.0(0)
9
Raspberry Pi Picoのボタンのチャタリング対策:IRQとソフトウェアポーリングの比較
#159中級
プレミアム

Raspberry Pi Picoのボタンのチャタリング対策:IRQとソフトウェアポーリングの比較

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

0.0(0)
12