Найти в Дзене

Инкрементальный энкодер: как «крутилка» превращается в умное устройство управления?

Инкрементальный (или относительный) энкодер — это электромеханический датчик, преобразующий вращательное движение в цифровой сигнал. В отличие от потенциометра, он не имеет ограничения по углу поворота, а вращение происходит «ступенчато», что позволяет тактильно ощущать каждый шаг изменения значения. Ключевые особенности: Внутри энкодера находится диск с отверстиями. При вращении оси два выходных контакта (CLK и DT) поочерёдно замыкаются на общую пластину. Важная особенность: сигналы на этих контактах сдвинуты по фазе на 90° друг относительно друга. Определение направления: Этот фазовый сдвиг позволяет микроконтроллеру точно определить не только факт вращения, но и его направление. Необходимые компоненты: Распиновка энкодера: Схема подключения: // Определяем пины согласно новой схеме подключения
#define CLK 7 // CLK → цифровой пин 7 (D7)
#define DT 6 // DT → цифровой пин 6 (D6)
#define SW 8 // SW → цифровой пин 8 (D8)
// Переменные для отслеживания состояния
int counter
Оглавление

Что такое инкрементальный энкодер?

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

Ключевые особенности:

  • определяет направление вращения (по/против часовой стрелки);
  • выдаёт дискретные импульсы при повороте на фиксированный угол;
  • часто имеет встроенную кнопку (активируется нажатием на ось);
  • надёжен благодаря механической конструкции.

Как это работает: принцип действия

Внутри энкодера находится диск с отверстиями. При вращении оси два выходных контакта (CLK и DT) поочерёдно замыкаются на общую пластину. Важная особенность: сигналы на этих контактах сдвинуты по фазе на 90° друг относительно друга.

Определение направления:

  • По часовой стрелке: сначала замыкается CLK, затем DT.
  • Против часовой стрелки: сначала DT, затем CLK.

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

Подключение к Arduino

Необходимые компоненты:

  • плата Arduino (Uno, Nano и т. п.);
  • инкрементальный энкодер с кнопкой;
  • соединительные провода;
  • макетная плата (опционально).

Распиновка энкодера:

  • GND — общий провод (подключается к GND Arduino);
  • VCC — питание (5 V или 3,3 V);
  • CLK — основной сигнальный контакт;
  • DT — второй сигнальный контакт (с фазовым сдвигом);
  • SW (или KEY) — контакт встроенной кнопки.
-2
-3

Схема подключения:

  • GND → GND Arduino;
  • VCC → 5 V Arduino;
  • CLK → цифровой пин 7 (D7);
  • DT → цифровой пин 6 (D6);
  • SW → цифровой пин 8 (D8).

// Определяем пины согласно новой схеме подключения
#define CLK 7 // CLK → цифровой пин 7 (D7)
#define DT 6 // DT → цифровой пин 6 (D6)
#define SW 8 // SW → цифровой пин 8 (D8)

// Переменные для отслеживания состояния
int counter = 0; // Счётчик поворотов
int lastState; // Предыдущее состояние CLK
int currentState; // Текущее состояние CLK
bool buttonState; // Состояние кнопки

void setup() {
// Настраиваем пины как входы
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP); // Встроенный подтягивающий резистор для кнопки

// Инициализируем последовательный порт для отладки
Serial.begin(9600);

// Читаем начальное состояние CLK
lastState = digitalRead(CLK);
}

void loop() {
// Считываем текущее состояние CLK
currentState = digitalRead(CLK);

// Если состояние CLK изменилось — было вращение
if (currentState != lastState) {
// Определяем направление вращения по состоянию DT
if (digitalRead(DT) != currentState) {
counter++; // Вращение по часовой стрелке
Serial.print("Вращение вправо. Счётчик: ");
} else {
counter--; // Вращение против часовой стрелки
Serial.print("Вращение влево. Счётчик: ");
}
Serial.println(counter);

// Обновляем последнее состояние CLK
lastState = currentState;
}

// Проверяем состояние кнопки (активно-низкий уровень)
buttonState = digitalRead(SW);
if (buttonState == LOW) {
Serial.println("Кнопка нажата!");
delay(200); // Задержка для антидребезга
}
}

Программирование: базовый пример

Ниже — простой скетч, который выводит в монитор порта направление вращения и состояние кнопки.

Практические применения

Инкрементальный энкодер на Arduino подходит для:

  • регулировки громкости/яркости;
  • навигации по меню (как в MP3‑плеерах);
  • управления сервоприводами/шаговыми двигателями;
  • ввода числовых значений (например, температуры);
  • игровых контроллеров;
  • промышленных панелей управления.