Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Мастерство работы с инкрементальными энкодерами на Arduino: принцип работы и пошаговая интеграция

В этом уроке мы узнаем, как работает вращательный энкодер и как использовать его с Arduino. Вы можете посмотреть следующее видео или прочитать письменное руководство ниже.

Обзор

Вращательный энкодер — это тип датчика положения, используемый для определения углового положения вращающегося вала. Он генерирует электрический сигнал, либо аналоговый, либо цифровой, в соответствии с вращательным движением.

Мастерство работы с инкрементальными энкодерами на Arduino: принцип работы и пошаговая интеграция

Существует множество различных типов вращательных энкодеров, которые классифицируются либо по выходному сигналу, либо по технологии 감живания. Конкретный вращательный энкодер, который мы будем использовать в этом уроке, является инкрементальным вращательным энкодером — это простейший датчик положения для измерения вращения.

Мастерство работы с инкрементальными энкодерами на Arduino: принцип работы и пошаговая интеграция

Этот вращательный энкодер также известен как квадратурный энкодер или относительный вращательный энкодер, и его выходом является серия прямоугольных импульсов.

Как работает вращательный энкодер

Рассмотрим энкодер подробнее и посмотрим на его принцип работы. Вот как генерируются прямоугольные импульсы: Энкодер имеет диск с равномерно распределенными контактными зонами, которые подключены к общему выводу C и двум другим отдельным контактным выводам A и B, как показано на иллюстрации ниже.

Мастерство работы с инкрементальными энкодерами на Arduino: принцип работы и пошаговая интеграция

Когда диск начинает вращаться шаг за шагом, выводы A и B начинают контактировать с общим выводом, и два прямоугольных выходных сигнала генерируются соответственно.

Любой из двух выходов может использоваться для определения повернутого положения, если мы просто считаем импульсы сигнала. Однако, если мы хотим определить направление вращения, нам нужно учитывать оба сигнала одновременно.

Можно заметить, что два выходных сигнала смещены на 90 градусов по фазе друг относительно друга. Если энкодер вращается по часовой стрелке, выход A опережает выход B.

Мастерство работы с инкрементальными энкодерами на Arduino: принцип работы и пошаговая интеграция

Если мы считаем шаги каждый раз, когда сигнал меняется с High на Low или с Low на High, мы можем заметить, что в этот момент два выходных сигнала имеют противоположные значения. Наоборот, если энкодер вращается против часовой стрелки, выходные сигналы имеют равные значения. Учитывая это, мы можем легко запрограммировать наш контроллер для чтения положения энкодера и направления вращения.

Пример Arduino с вращательным энкодером

Сделаем практический пример с использованием Arduino. Конкретный модуль, который я буду использовать для этого примера, поставляется на плате расширения и имеет пять выводов. Первый вывод — выход A, второй — выход B, третий — вывод кнопки, и, конечно, остальные два — VCC и GND.

Мастерство работы с инкрементальными энкодерами на Arduino: принцип работы и пошаговая интеграция

Выходные выводы можно подключить к любым цифровым выводам платы Arduino.

Компоненты, необходимые для этого урока Arduino, можно найти по ссылкам ниже:

  • Модуль вращательного энкодера……………….
  • Плата Arduino ……………………………
  • Безпаечная макетная плата и перемычки ………

Исходный код

Вот код Arduino:

/* Arduino Rotary Encoder Tutorial
 * by Dejan Nedelkovski, www.HowToMechatronics.com
 */
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
  pinMode(outputA, INPUT);
  pinMode(outputB, INPUT);
  Serial.begin(9600);
  aLastState = digitalRead(outputA);
}
void loop() {
  aState = digitalRead(outputA);
  if (aState != aLastState) {
    if (digitalRead(outputB) != aState) {
      counter++;
    } else {
      counter--;
    }
    Serial.print("Position: ");
    Serial.println(counter);
  }
  aLastState = aState;
}Язык кода: Arduino (arduino)

Описание кода: Сначала определяем выводы, к которым подключен наш энкодер, и определяем переменные, необходимые для программы. В разделе setup определяем два вывода как входы, запускаем последовательную связь для вывода результатов в монитор последовательного порта, а также считываем начальное значение выхода A и помещаем его в переменную aLastState.

Затем в разделе loop снова считываем выход A, но теперь помещаем значение в переменную aState. Если мы вращаем энкодер и генерируется импульс, эти два значения будут отличаться, и первый оператор «if» станет истинным. Сразу после этого, с помощью второго оператора «if», определяем направление вращения. Если состояние выхода B отличается от состояния выхода A, счетчик увеличится на единицу, иначе уменьшится. В конце, после вывода результатов в монитор последовательного порта, нужно обновить переменную aLastState значением переменной aState.

Это всё, что нужно для этого примера. Если загрузить код, запустить монитор последовательного порта и начать вращать энкодер, мы начнем получать значения в мониторе последовательного порта. Конкретный модуль, который у меня есть, делает 30 отсчетов за полный цикл.

Узнайте больше: Ультразвуковой датчик HC-SR04 и Arduino — Полное руководство

Пример 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;
int angle = 0;
int aState;
int 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) {
      counter++;
      angle++;
      rotateCW();
    } else {
      counter--;
      angle--;
      rotateCCW();
    }
    if (counter >= 30) {
      counter = 0;
    }
    lcd.clear();
    lcd.print("Position: ");
    lcd.print(int(angle * (-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);
}Язык кода: Arduino (arduino)

Не стесняйтесь задавать любые вопросы в разделе комментариев ниже.


Производственный процесс

  1. Очереди в C#: Enqueue, Dequeue и операции First-In-First-Out
  2. Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
  3. Сборка точного измерительного колеса на Arduino Nano и вращательном энкодере
  4. Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
  5. Чтение температуры и влажности DHT11 через Blynk — пошаговый урок для Arduino
  6. Использование термистора: пошаговое руководство для Arduino
  7. Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино
  8. Подключение Arduino к NMEA-0183: пошаговое руководство
  9. Мастерство Modbus на Arduino: пошаговое руководство
  10. Голосовое управление светодиодами: Arduino Micro + BitVoicer Server для распознавания речи