工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド

概要

このチュートリアルでは、ロータリーエンコーダの仕組みとArduinoでの使い方を学びます。詳細については、以下のビデオまたは文章チュートリアルをご覧ください。

ロータリーエンコーダとは

ロータリーエンコーダは、回転軸の角度位置を検出するポジションセンサの一種です。回転運動に応じてアナログまたはデジタルの電気信号を生成します。

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド

出力信号や検出技術により様々なタイプがありますが、このチュートリアルで使用するのはインクリメンタル(相対)ロータリーエンコーダで、最もシンプルな回転測定センサです。クアドラチャエンコーダとも呼ばれ、出力は一連の矩形波パルスとなります。

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド

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

エンコーダ内部には、均等に配置された接点ゾーンを持つディスクがあり、共通ピンCと、別々の2つの接点ピンA、Bに接続されています。

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド

ディスクが回転すると、ピンAとBが順番に共通ピンCと接触し、2つの矩形波出力信号が生成されます。どちらか一方の出力パルスをカウントするだけで回転量(位置)はわかりますが、回転方向を知るには両信号を同時に考慮する必要があります。

2つの出力信号は互いに90度位相がずれています(クアドラチャ)。時計回り回転時は出力Aが出力Bより先行し、反時計回り時は出力Bが先行します。

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド

信号変化の瞬間(High→LowまたはLow→High)では、時計回りならAとBの値が異なり、反時計回りなら等しくなります。この原理を利用して、マイコンで位置と回転方向を簡単に検出できます。

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

ブレークアウトボードタイプのモジュール(出力A, 出力B, ボタン, VCC, GNDの5ピン)を使用します。出力ピンを任意のデジタルピンに接続します。

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド

必要なコンポーネント

  • ロータリーエンコーダモジュール
  • 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; // 前回状態を更新
}

コード説明

  1. ピン定義と変数宣言
  2. setup()でピンを入力設定、シリアル通信開始、出力Aの初期値をaLastStateに保存
  3. loop()で出力Aの現在値aStateを読み取り
  4. aState != aLastStateでパルス検出
  5. digitalRead(outputB) != aStateで回転方向判定(異なる→時計回り、同じ→反時計回り)
  6. カウンタ更新後、シリアルモニタに表示
  7. aLastState = aStateで次回比較用に更新

このモジュールは1回転で30カウント刻みます。アップロード後、シリアルモニタを開いてエンコーダを回すと位置値が表示されます。

例2: ロータリーエンコーダでステッピングモータを制御

基本例に加え、ロータリーエンコーダでステッピングモータの位置を制御する例を作成しました。

Arduinoでロータリーエンコーダをマスター: 仕組みとステップバイステップ統合ガイド
/* 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);
}

この例ではLCDに現在位置(角度)を表示しながら、エンコーダの回転に合わせてステッピングモータを同期駆動します。時計回りでrotateCW()、反時計回りでrotateCCW()を呼び出し、DIRピンで方向、STEPピンでパルスを制御しています。

ご質問はコメント欄でお気軽にどうぞ。

製造プロセス

  1. Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
  2. Arduino Nanoとロータリーエンコーダーで作る高精度測定ホイール
  3. u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
  4. DHT11 と Blynk で温湿度をリアルタイム監視する Arduino チュートリアル
  5. サーミスタを使った温度測定: Arduinoステップバイステップガイド
  6. Arduinoで楽器演奏:音階生成のステップバイステップガイド
  7. ArduinoをNMEA-0183に接続するステップバイステップガイド
  8. ArduinoでModbusをマスターする:ステップバイステップガイド
  9. 音声制御LEDプロジェクト:Arduino Micro + BitVoicer Serverで音声認識
  10. ArduinoとPythonで作るAIアシスタントロボット「ジャウndice」
  11. C# Queue完全ガイド:Enqueue、Dequeue、FIFO操作の実例解説