INPUT | INPUT_PULLUP | OUTPUT の解説と実装リファレンス
本ドキュメントでは、ArduinoフレームワークにおけるGPIO(General Purpose Input/Output)の動作モードを定義する3つの定数(INPUT, INPUT_PULLUP, OUTPUT)について、電気的特性およびハードウェアレベルでの挙動を含めた詳細な技術解説を行う。
【概要】
これらの定数は、pinMode(pin, mode) 関数に引数として渡されるものであり、指定したGPIOピンのデータ方向(Data Direction)および内部プルアップ抵抗の有効状態を制御する。これらはマイクロコントローラのGPIOレジスタを操作し、ピンを「入力を受け付ける状態」にするか「出力を駆動する状態」にするかを決定する。
【仕様】
| 定数 | 入力/出力 | 内部抵抗 | 電気的状態 | 主要な用途 |
| INPUT | 入力 | なし (High-Z) | 高インピーダンス状態 | 外部抵抗を用いたスイッチ、センサー入力 |
| INPUT_PULLUP | 入力 | 有効 (Pull-up) | デフォルトでHIGH、接地でLOW | 外部抵抗なしのプッシュボタン接続 |
| OUTPUT | 出力 | なし (Drive) | 内部回路によりHIGH/LOWを駆動 | LED、リレー、他デバイスへの信号送出 |
- データ型:
uint8_tまたは内部的な列挙型(定義により異なる) - 初期状態: Arduinoボードの初期状態は、多くの場合すべてのピンが
INPUT状態として初期化される。
【技術的特徴】
1. INPUT(高インピーダンス)
ピンをハイインピーダンス(High-Impedance)状態に設定する。この状態では、ピンは電気的に「浮いた(Floating)」状態となり、外部から電圧が供給されない限り、ノイズの影響を非常に受けやすくなる。正確な電圧を読み取るためには、外部のプルアップ抵抗またはプルダウン抵抗が必要となる。
2. INPUT_PULLUP(内部プルアップ)
マイクロコントローラ内部の抵抗(一般に20kΩ〜50kΩ程度)を有効化する。これにより、外部信号がない状態ではピンを論理「HIGH」に固定する。スイッチを接続する際、スイッチが押されていない時はHIGH、押された時にGNDに接続されることでLOWになる、という構成を外部抵抗なしで実現可能にする。
3. OUTPUT(低インピーダンス駆動)
ピンを低インピーダンス状態にし、マイクロコントローラの出力ドライバを有効にする。digitalWrite() 関数によって、ピンを特定の電圧レベル(VCCまたはGND)に強制的に駆動する。このとき、ピンは電流を供給または吸収する能力を持つ。
【注意点】
- フローティング状態の危険性:
INPUTモードで外部抵抗を接続せずに配線を放置すると、ADC(アナログ・デジタル変換)やデジタル入力において不安定な挙動を引き起こす。設計意図に合致しないノイズを拾う原因となる。 - 内部プルアップの強さ: 内部プルアップ抵抗は比較的高抵抗であるため、高速な信号伝送や大きな容量の負荷を駆動する用途には適さない。信号の立ち上がり時間が鈍くなる可能性がある。
- 電流制限:
OUTPUTモード時、各ピンが許容できる最大電流(例:Arduino Unoでは約20mA〜40mA)を超えないように設計すること。過電流はMCUのGPIOポートを破壊する原因となる。 - ショートの防止:
OUTPUTモードでHIGHを出力している間に、外部回路を誤ってGNDに短絡させると、過大な電流が流れポートを破損する。必ず電流制限抵抗を挿入すること。
【サンプルコード】
以下に、INPUT_PULLUP を用いたボタン入力と、OUTPUT を用いたLED点灯の基本的な実装を示す。
// ピン定義
const int BUTTON_PIN = 2; // INPUT_PULLUP を使用
const int LED_PIN = 13; // OUTPUT を使用
void setup() {
// ボタンピンを内部プルアップ有効の入力に設定
pinMode(BUTTON_PIN, INPUT_PULLUP);
// LEDピンを出力に設定
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// ボタンの状態を読み取る(押すとLOW、離すとHIGH)
int buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
// ボタンが押されている(GNDに接続されている)
digitalWrite(LED_PIN, HIGH);
} else {
// ボタンが離されている(内部プルアップによりHIGH)
digitalWrite(LED_PIN, LOW);
}
}
【活用例】
- プッシュボタンの入力:
INPUT_PULLUPを使用することで、配線を簡素化(ボタンの両端を「ピン」と「GND」に接続するだけ)しつつ、信頼性の高い入力を取得できる。 - 状態表示:
OUTPUTを使用して、システムのステータスをLEDやブザーで通知する。 - インターフェース制御:
OUTPUTを用いて、I2CやSPIなどの通信プロトコルの一部をソフトウェアでエミュレートしたり、他のマイコンへ信号を送信したりする。


コメント