Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド
このチュートリアルでは、ロータリーエンコーダの仕組みとArduinoでの使い方を学びます。詳細については、以下のビデオまたは文章チュートリアルをご覧ください。 ロータリーエンコーダは、回転軸の角度位置を検出するポジションセンサの一種です。回転運動に応じてアナログまたはデジタルの電気信号を生成します。 出力信号や検出技術により様々なタイプがありますが、このチュートリアルで使用するのはインクリメンタル(相対)ロータリーエンコーダで、最もシンプルな回転測定センサです。クアドラチャエンコーダとも呼ばれ、出力は一連の矩形波パルスとなります。 エンコーダ内部には、均等に配置された接点ゾーンを持つディスクがあり、共通ピンCと、別々の2つの接点ピンA、Bに接続されています。 ディスクが回転すると、ピンAとBが順番に共通ピンCと接触し、2つの矩形波出力信号が生成されます。どちらか一方の出力パルスをカウントするだけで回転量(位置)はわかりますが、回転方向を知るには両信号を同時に考慮する必要があります。 2つの出力信号は互いに90度位相がずれています(クアドラチャ)。時計回り回転時は出力Aが出力Bより先行し、反時計回り時は出力Bが先行します。 信号変化の瞬間(High→LowまたはLow→High)では、時計回りならAとBの値が異なり、反時計回りなら等しくなります。この原理を利用して、マイコンで位置と回転方向を簡単に検出できます。 ブレークアウトボードタイプのモジュール(出力A, 出力B, ボタン, VCC, GNDの5ピン)を使用します。出力ピンを任意のデジタルピンに接続します。 このモジュールは1回転で30カウント刻みます。アップロード後、シリアルモニタを開いてエンコーダを回すと位置値が表示されます。 基本例に加え、ロータリーエンコーダでステッピングモータの位置を制御する例を作成しました。 この例ではLCDに現在位置(角度)を表示しながら、エンコーダの回転に合わせてステッピングモータを同期駆動します。時計回りで ご質問はコメント欄でお気軽にどうぞ。概要
ロータリーエンコーダとは


ロータリーエンコーダの仕組み


Arduinoでのロータリーエンコーダ使用例

必要なコンポーネント
ソースコード(基本例)
/* Arduino Rotary Encoder Tutorial
* by Dejan Nedelkovski, www.HowToMechatronics.com */
#define outputA 6
#define outputB 7
int counter = 0;
int aState, aLastState;
void setup() {
pinMode(outputA, INPUT);
pinMode(outputB, INPUT);
Serial.begin(9600);
aLastState = digitalRead(outputA); // 初期状態読み取り
}
void loop() {
aState = digitalRead(outputA); // 現在状態読み取り
// 状態変化 = パルス発生
if (aState != aLastState) {
// 出力Bと出力Aが異なる = 時計回り
if (digitalRead(outputB) != aState) {
counter++;
} else { // 同じ = 反時計回り
counter--;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // 前回状態を更新
}コード説明
setup()でピンを入力設定、シリアル通信開始、出力Aの初期値をaLastStateに保存loop()で出力Aの現在値aStateを読み取りaState != aLastStateでパルス検出digitalRead(outputB) != aStateで回転方向判定(異なる→時計回り、同じ→反時計回り)aLastState = aStateで次回比較用に更新例2: ロータリーエンコーダでステッピングモータを制御

/* Stepper Motor using a Rotary Encoder
* by Dejan Nedelkovski, www.HowToMechatronics.com */
#include <LiquidCrystal.h>
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0, angle = 0;
int aState, aLastState;
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(outputA, INPUT);
pinMode(outputB, INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16, 2);
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState) {
if (digitalRead(outputB) != aState) { // CW
counter++; angle++;
rotateCW();
} else { // CCW
counter--; angle--;
rotateCCW();
}
if (counter >= 30) counter = 0; // 1周期でリセット
lcd.clear();
lcd.print("Position: ");
lcd.print(int(angle * (-1.8))); // 角度表示(1.8度/ステップ想定)
lcd.print("deg");
lcd.setCursor(0, 0);
}
aLastState = aState;
}
void rotateCW() {
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH); delayMicroseconds(2000);
digitalWrite(stepPin, LOW); delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH); delayMicroseconds(2000);
digitalWrite(stepPin, LOW); delayMicroseconds(2000);
}rotateCW()、反時計回りでrotateCCW()を呼び出し、DIRピンで方向、STEPピンでパルスを制御しています。
製造プロセス
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- Arduino Nanoとロータリーエンコーダーで作る高精度測定ホイール
- u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
- DHT11 と Blynk で温湿度をリアルタイム監視する Arduino チュートリアル
- サーミスタを使った温度測定: Arduinoステップバイステップガイド
- Arduinoで楽器演奏:音階生成のステップバイステップガイド
- ArduinoをNMEA-0183に接続するステップバイステップガイド
- ArduinoでModbusをマスターする:ステップバイステップガイド
- 音声制御LEDプロジェクト:Arduino Micro + BitVoicer Serverで音声認識
- ArduinoとPythonで作るAIアシスタントロボット「ジャウndice」
- C# Queue完全ガイド:Enqueue、Dequeue、FIFO操作の実例解説