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

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

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

【概要】

digitalRead() は、Arduinoフレームワークにおいて特定のデジタル入力ピンの状態を読み取るための標準的な関数です。この関数は、指定されたピンの電圧レベルを判定し、それが「HIGH」(電圧が高い状態)か「LOW」(電圧が低い状態)かを論理値として返します。

【仕様】

  • 引数: 状態を読み取る対象のデジタルピン番号。
  • 戻り値: int 型(または HIGH/LOW 定数)。
    • HIGH: ピンが電圧供給源に接続されている、または規定の閾値以上の電圧が印加されている状態。
    • LOW: ピンがグランド(GND)に接続されている、または規定の閾値以下の電圧が印加されている状態。
  • 前提条件: pinMode(pin, INPUT) または pinMode(pin, INPUT_PULLUP) を用いて、対象ピンの入出力モードが事前に設定されていること。

【技術的特徴】

  • ハードウェア抽象化(HAL): digitalRead() は、実行環境(AVR, ESP32, SAMD等)のアーキテクチャに依存する具体的なレジスタ操作を隠蔽する抽象化レイヤーとして機能します。
  • レジスタ操作の内部挙動: 例えばAVRマイコンの場合、内部的には対象ポートの PINx レジスタを読み取り、該当するビット位置をマスク処理(論理演算)することで状態を抽出します。
  • analogRead() との比較:
    • analogRead(): ADC(アナログ・デジタル変換器)を介して電圧を数値化(例: 0-1023)する。
    • digitalRead(): 直接的な論理レベル判定を行い、量子化プロセスを経ずに現在の状態を即座に返す。

【注意点】

  • フローティング状態: 内部プルアップ抵抗(INPUT_PULLUP)を使用せずに INPUT モードで動作させる場合、ピンがどこにも接続されていない状態では浮遊容量や電磁ノイズの影響を受け、判定が不安定になる(フローティング状態)。
  • サンプリング速度の制約: digitalRead() は関数呼び出しのオーバーヘッドが含まれるため、MHz単位の極めて高速なパルス信号を正確にキャプチャするには不向きです。超高速な信号処理が必要な場合は、直接レジスタを操作するか、外部割り込み(External Interrupts)を使用するのが標準的な設計です。
  • 割り込みの影響: この関数は同期的に動作します。極めて短いパルス信号を検出する場合、プログラムの実行タイミングによっては読み取りを逃す可能性があることを考慮する必要があります。
  • 論理電圧の許容範囲: マイコンの動作電圧(例: 3.3V)を超える電圧をピンに入力すると、ハードウェアの破損を招く可能性があるため、入力電圧のレベルには注意が必要です。

【サンプルコード】

const int buttonPin = 2; // ボタンをデジタル2番ピンに接続

void setup() {
  Serial.begin(9600);
  // 内部プルアップを有効にする。ボタンの反対側をGNDに接続する構成。
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // ピンの状態を読み取り
  int buttonState = digitalRead(buttonPin);

  // プルアップ構成のため、ボタン押下時はLOWを返す
  if (buttonState == LOW) {
    Serial.println("Button Pressed");
  }

  delay(50); // チャタリング防止のための簡易的な遅延
}

【活用例】

  • ユーザーインターフェース: プッシュボタンやトグルスイッチによる操作入力の検知。
  • 状態監視(ポーリング): リレーの状態確認や、他の通信デバイスからのデジタル信号の監視。
  • デジタルセンサーの受容: PIR人感センサー、磁気センサー(リッドスイッチ)、近接センサーなど、デジタル出力を提供するセンサーとの連携。

コメント

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