Arduinoでエンコーダ値を読み取る方法

D

Daniel Zhang

最終更新日 Jul 12, 2026

エンコーダ値の読み取り方法は、エンコーダの種類によって異なります。インクリメンタルエンコーダとアブソリュートエンコーダの読み取り方法を以下に説明します。

インクリメンタルエンコーダ

インクリメンタルエンコーダは、A相とB相の2つの出力信号チャンネルを備えています。これらは互いに電気角90度位相がずれたパルス信号です。A相とB相の状態変化を検出することで、回転方向と回転角度の両方を判別できます。以下は、Arduinoでインクリメンタルエンコーダを読み取る基本的な手順です。

  1. エンコーダのA相とB相を、Arduinoの割り込み対応ピン(例:ピン2とピン3)に接続します。
  2. Arduinoコード内で、エンコーダカウントを格納するグローバル変数を定義します。
  3. A相とB相の状態変化を処理する割り込みサービスルーチン(ISR)を記述します。このルーチン内で、一方のチャンネルの現在の状態ともう一方のチャンネルの直前の状態を比較して回転方向を判別し、それに応じてエンコーダカウントを更新します。
volatile long encoderCount = 0;
int lastB = 0;

void encoderInterrupt() {
  int A = digitalRead(2);
  int B = digitalRead(3);
  // 簡易2逓倍デコード:現在のAと直前のBを比較
  if (A == lastB) {
    encoderCount++;
  } else {
    encoderCount--;
  }
  lastB = B;
}
  1. setup()関数内で、ピンモードを設定し、A相またはB相の状態が変化するたびにISRがトリガされるように割り込みをアタッチします。
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  lastB = digitalRead(3);
  attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
  1. メインのloop()内で、encoderCount変数を読み取り、モータシャフトの相対位置と回転方向を取得します。

注意: 上記の例では簡易的な2逓倍デコード方式を使用しています。高速または高分解能のエンコーダを使用する場合は、信号ジッタや接点バウンスによるカウントロスを防ぐため、完全な4逓倍ステートマシンまたは専用エンコーダインタフェースライブラリの使用を検討してください。

アブソリュートエンコーダ

アブソリュートエンコーダは、モータシャフトの絶対位置を表すデジタル信号を出力します。以下の例は、パラレル出力タイプのアブソリュートエンコーダに特化したもので、位置値の各ビットが個別のデータ線に割り当てられています。

注意: 産業用のアブソリュートエンコーダの多くは、パラレル出力ではなくSSI、SPI、RS-485などのシリアル通信インタフェースを使用しています。これらのインタフェースには異なる読み取り方法が必要であり、場合によっては専用のプロトコルライブラリが必要になります。正しいインタフェースと配線の詳細については、必ずエンコーダのデータシートを参照してください。

  1. エンコーダの各データピンをArduinoのデジタル入力ピンに接続します。
  2. setup()関数内で、各データピンを入力モードに設定します。
void setup() {
  pinMode(dataPin1, INPUT);
  pinMode(dataPin2, INPUT);
  // ... エンコーダのビット数に応じた追加のデータピン
}
  1. エンコーダ値を読み取る関数を記述します。この関数内で、digitalRead()を使用して各データピンの状態を読み取り、結果を1つの整数値に結合します。
int readEncoder() {
  int value = 0;
  value |= digitalRead(dataPin1) << 0;
  value |= digitalRead(dataPin2) << 1;
  // ... エンコーダのビット数に応じた追加のデータピン
  return value;
}
  1. メインのloop()内で、readEncoder()関数を呼び出し、モータシャフトの絶対位置を取得します。

注意: これらの例は基本的なエンコーダタイプを対象としています。実際のアプリケーションで使用されるエンコーダでは、信号のチャタリング除去処理の実装や専用エンコーダインタフェースICの使用など、より高度な処理が必要になる場合があります。適切な配線と信号処理を確保するため、必ずエンコーダのデータシートを参照してください。