INPUT | INPUT_PULLUP | OUTPUT の解説と実装リファレンス

記事内には広告が含まれています。

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などの通信プロトコルの一部をソフトウェアでエミュレートしたり、他のマイコンへ信号を送信したりする。

コメント

タイトルとURLをコピーしました