INPUT_PULLUP(pinMode関数)について
INPUT_PULLUP
は、Arduinoのデジタルピンを入力モードで使用する際に、内蔵プルアップ抵抗を有効にする設定です。この設定を行うと、外部に抵抗を接続しなくてもピンが常に一定の電圧に保たれ、安定した入力が得られます。以下に、INPUT_PULLUP
の仕組みや使用方法、メリットと注意点について詳しく解説していきます。
1. INPUT_PULLUPとは?
Arduinoのデジタルピンには、内蔵の「プルアップ抵抗」があります。これを有効にすることで、ピンが自動的に「HIGH」の5Vまたは3.3V (ボードの種類によって異なる)に引き上げられます。pinMode
関数を使ってピンをINPUT_PULLUP
モードに設定すると、この内蔵プルアップ抵抗が有効になります。
pinMode(pin, INPUT_PULLUP);
2. プルアップ抵抗の役割
ボタンやスイッチなどの入力デバイスをArduinoに接続する際、ピンが安定した入力状態(HIGHまたはLOW)を維持するためにプルアップ抵抗やプルダウン抵抗が必要です。抵抗がないと、ピンが接続されていない状態や不安定な状態で電圧が変動し、「フローティング状態」となり、誤作動が発生する可能性があります。
内蔵プルアップ抵抗を使うことで、ピンが常に「HIGH」状態に保たれ、安定した入力が得られます。ボタンが押されるとピンが「LOW」に引き下げられるため、ピンの状態変化(HIGHからLOW)を検出しやすくなります。
3. INPUT_PULLUPを使ったボタン入力の例
次のサンプルコードでは、ボタンをArduinoに接続し、INPUT_PULLUP
モードでピンの状態を読み取ります。ボタンが押された場合に内蔵LEDが点灯します。
回路図
- ボタンの一端をデジタルピンに接続し、もう一端をGNDに接続します。
サンプルコード
const int buttonPin = 7; // ボタンを接続するピン
const int ledPin = 13; // 内蔵LED(ピン13)
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // ボタンピンをプルアップ付きの入力モードに設定
pinMode(ledPin, OUTPUT); // LEDピンを出力モードに設定
}
void loop() {
// ボタンの状態を読み取る
int buttonState = digitalRead(buttonPin);
// ボタンが押されたとき(LOW)にLEDを点灯させる
if (buttonState == LOW) { // 押されるとGNDに接続され、LOWになる
digitalWrite(ledPin, HIGH); // LEDを点灯
} else {
digitalWrite(ledPin, LOW); // ボタンが押されていないときはLEDを消灯
}
}
動作説明
INPUT_PULLUP
によって、ボタンが押されていないときはbuttonPin
がHIGH(5V)に保たれます。- ボタンを押すと
buttonPin
がGNDに接続されてLOW(0V)となり、Arduinoがその状態を検知してLEDを点灯します。
4. INPUT_PULLUPのメリット
- 外部プルアップ抵抗が不要:プルアップ抵抗を使わずに安定した入力が得られるため、回路がシンプルになります。
- 安定した入力:
INPUT_PULLUP
により、ピンがフローティング状態にならず、誤作動を防ぐことができます。 - 消費電力の低減:外部抵抗と比較して非常に低い消費電流でプルアップが可能です。
5. 注意点
- ボタンが押されていないときはHIGH:
INPUT_PULLUP
を使うとボタンが押されていない状態が「HIGH」となり、押されたときに「LOW」となります。このため、通常のボタン接続と挙動が逆になります。条件分岐で「LOW」を押下と見なすようにコードを記述しましょう。 - 消費電流の微増:プルアップ抵抗が有効になるため、若干の消費電流が増加しますが、通常の使用では問題にならない程度です。
- 環境ノイズ:非常に長い配線や強い電磁ノイズがある環境では、内蔵プルアップ抵抗だけでは不十分な場合もあります。その場合、外部に強めのプルアップ抵抗を追加するか、プルダウン抵抗を使用するよう工夫が必要です(通常の環境では必要ありません)。
6. 応用例: 複数ボタンを使ったプルアップ抵抗
複数のボタンをArduinoに接続し、各ボタンに異なる動作を割り当てるプログラムを考えてみましょう。
const int button1Pin = 7; // ボタン1のピン
const int button2Pin = 8; // ボタン2のピン
const int ledPin = 13; // 内蔵LED
void setup() {
pinMode(button1Pin, INPUT_PULLUP); // ボタン1をプルアップ付き入力モードに設定
pinMode(button2Pin, INPUT_PULLUP); // ボタン2をプルアップ付き入力モードに設定
pinMode(ledPin, OUTPUT); // LEDピンを出力モードに設定
}
void loop() {
int button1State = digitalRead(button1Pin); // ボタン1の状態
int button2State = digitalRead(button2Pin); // ボタン2の状態
// ボタン1が押されるとLEDが点灯、ボタン2が押されるとLEDが消灯
if (button1State == LOW) { // ボタン1が押された場合
digitalWrite(ledPin, HIGH); // LEDを点灯
} else if (button2State == LOW) { // ボタン2が押された場合
digitalWrite(ledPin, LOW); // LEDを消灯
}
}
動作説明
button1Pin
とbutton2Pin
にそれぞれボタンを接続し、プルアップを有効にします。- ボタン1を押すとLEDが点灯し、ボタン2を押すとLEDが消灯します。
まとめ
INPUT_PULLUP
を使うことで、内蔵プルアップ抵抗が有効化され、安定した入力検知が可能になります。これにより、外部抵抗が不要となり、回路設計が簡単になるメリットがあります。ボタンやスイッチの入力を扱う際には、INPUT_PULLUP
を活用することでフローティングを防止し、誤作動を避けることができます。
コメント