ボタンを押していないのにLEDが点いたり、Arduinoの値が0と1の間で不規則に変わったりした経験はありませんか。部品やプログラムの故障を疑いたくなりますが、原因は入力ピンが「どちらの状態なのか決まっていない」ことかもしれません。電子回路 プルアップ抵抗 基礎 ガイドとして、デジタル入力を安定させるための考え方を、実際に配線して確かめられる形で説明します。
プルアップ抵抗は入力の「待機状態」を決める部品
マイコンのデジタル入力ピンは、HIGHとLOWという2種類の電圧状態を読み取ります。一般的な3.3V系または5V系の回路なら、電源電圧に近い状態をHIGH、GNDに近い状態をLOWとして扱います。
ここで困るのが、入力ピンに何もつながっていない状態です。これは「OFF」ではありません。ピンは外部からのわずかなノイズ、手で近づいたときの静電気、周囲の配線からの影響を拾い、HIGHにもLOWにもなり得ます。この不安定な状態をフローティング状態、または浮いた入力と呼びます。
プルアップ抵抗は、入力ピンを抵抗を介して電源のプラス側へつなぎます。ボタンが押されていないとき、入力はHIGHになります。ボタンを押して入力ピンをGNDへつなぐと、入力はLOWになります。抵抗があるため、電源とGNDを直接ショートさせずに済むのです。
つまりプルアップ抵抗の役割は、単に電流を減らすことではありません。「スイッチが操作されていないときはHIGH」と、回路の初期状態を明確に決めることです。
電子回路のプルアップ抵抗を配線で理解する
もっとも基本的な回路は、マイコン、タクトスイッチ、抵抗の3つで作れます。入力ピンとVCCの間にプルアップ抵抗を入れ、入力ピンとGNDの間にスイッチを置きます。
スイッチを離している間は、入力ピンは抵抗を通じてVCCにつながるためHIGHです。スイッチを押すと、入力ピンはGNDへつながるためLOWになります。このときVCCからGNDへ流れる電流は抵抗で制限されます。
たとえば5V電源と10kΩの抵抗なら、スイッチを押したときの電流はおおよそ次のように計算できます。
`5V ÷ 10,000Ω = 0.0005A`
これは0.5mAです。小さな電流なので、一般的なタクトスイッチやマイコンの入力回路に無理をさせません。一方、抵抗なしでVCCとGNDをスイッチでつなぐと、大電流が流れて発熱や故障につながります。ブレッドボードで組むときほど、この抵抗を省略しない習慣が大切です。
プルアップでは「押すとLOW」になる
初心者が混乱しやすいのは、ボタンを押したのにプログラムで読む値がLOWになる点です。これは故障ではなく、配線どおりの動作です。プルアップ回路では、何もしていないときがHIGH、押したときがLOWです。
プログラムでは、条件を次のように考えます。
“`cpp if (digitalRead(buttonPin) == LOW) { // ボタンが押されたときの処理 } “`
LEDを点ける、サーボを動かす、レーザーカッター用の作品に組み込んだ仕掛けを起動するなど、処理の内容は自由です。まずはシリアルモニタにHIGHとLOWを表示し、指でスイッチを押したときだけ値が変化することを確認すると、回路とコードの対応がつかみやすくなります。
抵抗値はなぜ10kΩがよく使われるのか
プルアップ抵抗には10kΩがよく使われます。これは絶対の決まりではなく、消費電流とノイズへの強さのバランスが取りやすい値だからです。
抵抗値が小さすぎると、スイッチを押している間に余分な電流が流れます。たとえば5Vで1kΩなら5mAです。動作する場合も多いものの、電池駆動の作品では不要な消費になります。複数のボタンを使う場合は、その差も無視できません。
反対に抵抗値が大きすぎると、入力が外部ノイズの影響を受けやすくなります。また、配線や部品が持つわずかな静電容量との組み合わせで、電圧が切り替わるまでに時間がかかる場合があります。短い配線のボタン入力なら10kΩは扱いやすく、4.7kΩから47kΩ程度も用途によって選ばれます。
ただし、人が触る長いケーブル、モーターの近く、屋外センサーの配線では事情が変わります。抵抗値だけで解決しようとせず、GND配線、ケーブル長、コンデンサによるノイズ対策、プログラム側の判定時間も合わせて見直しましょう。
Arduinoは内部プルアップを使える
Arduinoの多くのボードでは、入力ピンに内蔵されたプルアップ抵抗を有効にできます。外付け抵抗を省けるため、試作を早く進めたいときに便利です。
“`cpp const int buttonPin = 2;
void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); }
void loop() { Serial.println(digitalRead(buttonPin)); delay(100); } “`
この設定では、ボタンの一方を2番ピン、もう一方をGNDへ接続します。VCCへ配線する必要はありません。押していないときはHIGH、押すとLOWです。
内部プルアップの抵抗値は、外付けの10kΩと同じとは限りません。ボードやマイコンによって数十kΩ程度になることがあり、高精度な電圧設計やノイズが多い環境には外付け抵抗のほうが向く場合があります。それでも、LED点灯、メニュー操作、簡単なセンサー用スイッチといった工作では、内部プルアップは非常に実用的です。
Raspberry PiでもGPIOの内部プルアップを設定できます。ただしGPIOは基本的に3.3V系です。5Vの信号をGPIOへ直接入れると破損するおそれがあるため、Arduinoの5V回路をそのまま移植しないでください。使うボードの論理電圧を最初に確認することが、安全な電子工作の第一歩です。
プルダウン抵抗との違いを使い分ける
プルダウン抵抗は、入力ピンを抵抗を介してGNDへつなぐ方法です。スイッチを押してVCCへつなぐとHIGH、離すとLOWになります。つまりプルアップとは待機時と操作時の論理が反対です。
どちらが正しいかは、作りたい回路と使う部品で決まります。内部プルアップを使えるマイコンでは、部品数を減らせるプルアップが選ばれやすい傾向があります。一方で「ボタンを押したらHIGH」という読み方に統一したい、外部モジュールの出力仕様がHIGHアクティブである、といった理由でプルダウンを選ぶこともあります。
大切なのは、配線図、プログラム、作品の説明書で論理をそろえることです。「ONなのにLOW」という表現が混乱を招くなら、「押下時はLOW」と具体的に書くと、あとから修理や改造をするときにも役立ちます。
動かないときは抵抗より先に接点を確認する
ボタン入力が不安定な場合、抵抗値を変更する前に、タクトスイッチの端子配置を確認しましょう。4本足のタクトスイッチは、同じ側の2本が内部でつながっている構造が多く、ブレッドボードに向きを間違えて挿すと、押しても状態が変わりません。テスターの導通チェックがあれば、押す前と押した後にどの端子がつながるかを確かめられます。
次に、マイコンと電源のGNDが共通になっているかを見ます。別電源のセンサーやモジュールを組み合わせる場合、信号線だけをつないでも基準となるGNDが共有されていなければ、正しい電圧を判断できません。
また、ボタンを押した直後に値が何度も切り替わるなら、接点のチャタリングが考えられます。これは機械的な接点が一瞬だけ細かく振動する現象です。数十msの待ち時間を設けるソフトウェア処理や、必要に応じたコンデンサの追加で対策できます。プルアップ抵抗は入力の待機状態を決めますが、すべてのノイズ問題を単独で解決する部品ではありません。
小さな抵抗1本にも、電圧、電流、プログラムの論理、操作感がつながっています。まずはLEDとボタンの回路でHIGHとLOWを実測し、配線を1か所ずつ変えてみてください。その発見は、センサー付きのIoT作品や動く立体作品を自分の手で形にするときの、確かな土台になります。




