Подключение энкодера KY-040 к Arduino: управление скоростью мотора

Энкодер KY-040 — недорогой и очень удобный поворотный датчик с кнопкой. В этом проекте своими руками мы подключим энкодер к Arduino, научимся правильно считывать вращение и нажатие, и используем его для дискретного управления скоростью мощного двигателя постоянного тока через MOSFET-транзистором. Проект — отличная основа для меню, настройки часов, регулировки яркости, громкости и любых систем управления.

Подключение энкодера KY-040 и управление мотором Arduino

Возможности проекта

  • Точное определение направления и скорости вращения энкодера
  • 6 фиксированных скоростей двигателя (можно изменить)
  • Полная остановка мотора по нажатию кнопки на энкодере
  • Защита Arduino и стабильная работа благодаря подтягивающему и ограничительному резисторам
  • Простое расширение до меню, часов, регулятора яркости

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

  • Arduino Uno / Nano
  • Модуль энкодера KY-040
  • Двигатель постоянного тока 6–12 В
  • N-канальный MOSFET (IRLZ44N, IRF3205, IRF540 и др.)
  • Резистор 10 кОм (подтяжка затвора)
  • Резистор 100–220 Ом (ограничение тока)
  • Отдельный источник питания для мотора (12 В)
  • Диод 1N4007 (опционально, защита от ЭДС)

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

Энкодер KY-040:

  • CLK → D2
  • DT → D3
  • SW → D4 (кнопка)
  • + → 5V
  • GND → GND

Управление мотором:

  • Затвор MOSFET → через резистор 220 Ом к D9 (ШИМ)
  • От затвора к GND — резистор 10 кОм (подтяжка)
  • Сток → один вывод мотора
  • Другой вывод мотора → +12 В
  • Источник → сток MOSFET (или наоборот — зависит от логики)

Установка библиотеки

Установите из менеджера библиотек Arduino IDE: Encoder by Paul Stoffregen

Готовый скетч Arduino

#include <Encoder.h>

Encoder myEnc(2, 3);  // CLK, DT
const int motorPin = 9;
const int buttonPin = 4;

long oldPosition = 0;

void setup() {
  Serial.begin(9600);
  pinMode(motorPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  long newPos = myEnc.read() / 4;  // делим на 4 — один щелчок

  if (digitalRead(buttonPin) == LOW) {
    myEnc.write(0);
    newPos = 0;
    delay(200);
  }

  if (newPos != oldPosition) {
    oldPosition = newPos;
    int speed;

    switch (newPos) {
      case 0:  speed = 0;    break;
      case 1:  speed = 50;   break;
      case 2:  speed = 80;   break;
      case 3:  speed = 110;  break;
      case 4:  speed = 150;  break;
      case 5:  speed = 200;  break;
      case 6:  speed = 255;  break;
      default: speed = 0;    break;
    }
    analogWrite(motorPin, speed);
    Serial.println(speed);
  }
}
Считывает положение энкодера и дискретно изменяет скорость двигателя через PWM на пине 9.
Каждый «щелчок» энкодера (деление на 4) соответствует одному фиксированному уровню скорости.
Кнопка на пине 4 сбрасывает положение энкодера и останавливает двигатель.
Текущая скорость выводится в Serial Monitor.

Как пользоваться

  • Вращение вправо — увеличение скорости (6 ступеней)
  • Вращение влево — уменьшение скорости
  • Нажатие на ручку — полная остановка (сброс в 0)
  • При превышении диапазона — мотор останавливается

Заключение

Энкодер KY-040 — идеальный элемент управления для любых проектов Arduino. Один модуль заменяет десяток кнопок, делает интерфейс интуитивным и профессиональным. Этот пример легко переделать под регулировку яркости светодиодов, громкости, выбор пунктов меню или настройку часов.

FAQ — Энкодер KY-040 и управление мотором

Зачем нужны резисторы 10 кОм и 220 Ом у MOSFET?

10 кОм — подтягивает затвор к земле, защищает от наводок. 220 Ом — ограничивает ток заряда ёмкости затвора, защищает выход Arduino.

Можно использовать обычный биполярный транзистор вместо MOSFET?

Можно (например, BD139), но MOSFET лучше: почти нулевое потребление тока управления и меньший нагрев.

Почему делим на 4 в myEnc.read()/4?

Энкодер выдаёт 4 импульса на один физический щелчок. Деление делает счётчик удобным и стабильным.

Можно сделать плавную регулировку вместо ступенчатой?

Да, просто уберите switch и пишите analogWrite(motorPin, constrain(newPos * 10, 0, 255));

Работает ли это с двигателем 24 В?

Да, если выбрать подходящий MOSFET (например, IRF3205 до 55 В) и логику уровня (или добавить драйвер).

Можно использовать без библиотеки Encoder?

Да, но библиотека Paul Stoffregen самая стабильная и не пропускает шаги даже при быстром вращении.

Как сделать паузу вместо сброса по кнопке?

Замените myEnc.write(0) на сохранение текущего значения в переменную и возврат при следующем нажатии.

📁 Скачать примеры