pinMode() の解説と実装リファレンス

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

pinMode() の解説と実装リファレンス

【概要】

pinMode() は、Arduinoフレームワークにおいて指定したGPIOピンの動作モードを「入力」または「出力」として構成するための基本関数である。この関数を呼び出すことで、マイコン内部のデータ方向レジスタ(DDR)を操作し、ピンの電気的特性を特定の用途に適した状態へと遷移させる。

【仕様】

  • 関数シグネチャ: void pinMode(uint8_t pin, uint8_t mode)
  • 引数:
  • pin (uint8_t): 設定対象のGPIOピン番号。
  • mode (uint8_t): 動作モードを指定する定数。
    • INPUT: ピンを入力モードに設定する。高インピーダンス状態となり、外部からの電圧を読み取れる状態になる。
    • OUTPUT: ピンを出力モードに設定する。マイコンから電流を供給、または吸収できる状態になる。
    • INPUT_PULLUP: ピンを入力モードにし、内部プルアップ抵抗を有効にする。外部抵抗なしでスイッチ入力を安定化させる際に使用する。
  • 戻り値: void
  • 初期状態: マイコンの起動直後の状態はボードによって異なるが、通常は setup() 関数内で明示的に初期化を行うのが標準的な設計である。

【技術的特徴】

  • ハードウェアレベルの挙動:
    AVRマイコン等のアーキテクチャにおいて、この関数は内部のデータ方向レジスタ(Data Direction Register)を書き換える操作を抽象化したものである。OUTPUT に設定すると、ピンの出力ドライバが有効化され、INPUT に設定すると入力バッファが有効化される。
  • 内部プルアップの仕組み:
    INPUT_PULLUP を指定した場合、マイコン内部の抵抗(Arduino Uno等の場合、約20kΩ〜50kΩ)がVCCに接続される。これにより、スイッチの反対側をGNDに接続するだけで、「プルダウン」抵抗を外部に実装することなく、入力信号を「HIGH」に固定(待機状態)することができる。
  • PWMとの関係:
    pinMode(pin, OUTPUT) を設定することで、対象のピンがPWM(Pulse Width Modulation)対応ピンである場合、analogWrite() を用いたデューティ比制御が可能になる。

【注意点】

  • フローティング状態:
    INPUT モードで外部プルアップ/プルダウン抵抗を接続していない場合、ピンは「フローティング(浮いた状態)」となり、周囲の電磁ノイズや静電気の影響を受けて不定な値を読み取ることがある。意図しない動作を防ぐため、スイッチ入力には INPUT_PULLUP を使用するか、外部抵抗を適切に配置する必要がある。
  • 最大電流制限(Source/Sink Current):
    OUTPUT モードに設定したピンには、マイコンのI/Oポートが許容する最大電流制限(例:Arduino Unoでは各ピンあたり最大40mA、推奨は20mA以下)がある。この制限を超える負荷(高輝度LED、モータ、リレー等)を直接接続すると、ICの破損や過熱の原因となるため、パワーデバイスを駆動する場合はトランジスタやFETなどのドライバ回路を介する必要がある。
  • 実行タイミング:
    pinMode() はレジスタへの書き込みを伴うため、極めて高い周波数で動くループ内での頻繁な呼び出しは避けるべきである。通常は setup() 内で一度だけ呼び出し、起動時の初期状態を確定させるのがベストプラクティスである。

【サンプルコード】

const int LED_PIN = 13;      // 出力:内蔵LED
const int BUTTON_PIN = 2;    // 入力:スイッチ

void setup() {
  // LEDピンを出力として設定
  pinMode(LED_PIN, OUTPUT);
  // ボタンピンを入力(内部プルアップ有効)として設定
  // これにより、ボタンを押すとLOW、離すとHIGHを読み取る
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  // ボタンの状態を読み取る
  int buttonState = digitalRead(BUTTON_PIN);

  // ボタンが押された(LOW)場合、LEDを点灯
  if (buttonState == LOW) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
}

【活用例】

  • タクトスイッチのインターフェース: INPUT_PULLUP を活用し、回路構成を簡略化したボタン入力の実装。
  • LED・リレーの制御: OUTPUT 設定と digitalWrite() を組み合わせた、状態のON/OFF制御。
  • センサー等のデジタル信号取得: 赤外線センサや人感センサなど、デジタル出力を持つデバイスの状態を INPUT モードで常時監視するアプリケーション。

コメント

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