Подключение энкодера KY-040 к Arduino: управление скоростью мотора
Энкодер KY-040 — недорогой и очень удобный поворотный датчик с кнопкой. В этом проекте своими руками мы подключим энкодер к Arduino, научимся правильно считывать вращение и нажатие, и используем его для дискретного управления скоростью мощного двигателя постоянного тока через MOSFET-транзистором. Проект — отличная основа для меню, настройки часов, регулировки яркости, громкости и любых систем управления.
Возможности проекта
- Точное определение направления и скорости вращения энкодера
- 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);
}
}
Каждый «щелчок» энкодера (деление на 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) на сохранение текущего значения в переменную и возврат при следующем нажатии.