Обзор
KY-040 — это модуль инкрементального энкодера, который выдает цифровые сигналы, соответствующие положению и направлению вращения. Он обеспечивает непрерывное вращение на 360 градусов и оснащен встроенной кнопкой, что делает его идеальным для различных систем управления и навигации в интерфейсах.
KY-040 — это устройство ввода, которое позволяет определять величину и направление вращения. В отличие от потенциометров, KY-040 может вращаться бесконечно, что удобно для регулировки громкости, навигации по меню и точного управления параметрами в IoT-проектах.
О модуле энкодера KY-040
Семейство модулей KY, широко используемое в DIY-электронике, включает в себя этот популярный инкрементальный энкодер. KY-040 — это надежное решение для проектов, требующих пользовательского ввода через вращение.
⚡ Ключевые особенности
- Continuous Rotation – Энкодер вращается на 360 градусов без ограничений.
- Встроенная кнопка – Нажатие на вал замыкает контакт, что заменяет отдельную тактовую кнопку.
- Цифровой интерфейс – Легко подключается к любым микроконтроллерам через цифровые GPIO.
Приобретите KY-040
Характеристики KY-040
Полные технические параметры модуля инкрементального энкодера KY-040.
Распиновка KY-040
KY-040 — это 5-контактный модуль энкодера со встроенной кнопкой. Правильное подключение сигналов CLK и DT критично для определения направления вращения.
- Интерфейс — Квадратурный выход (2 фазы).
- Направление — Сдвиг фаз CLK и DT определяет сторону вращения.
- Кнопка — Вывод SW замыкается на землю при нажатии (Active Low).
- Антидребезг — Рекомендуется программная фильтрация сигналов.
| № | Название | Тип | Описание | Примечания |
|---|---|---|---|---|
| 1 | CLK | Digital Out | Тактовый сигнал | Импульсы при вращении |
| 2 | DT | Digital Out | Сигнал данных | Фазовый сдвиг для определения направления |
| 3 | SW | Digital Out | Выход кнопки | Низкий уровень при нажатии |
| 4 | VCC | Power | Питание | 3.3В или 5В |
| 5 | GND | Power | Земля | Общий минус |
Подключение KY-040 к ESP32
Для работы с KY-040 на ESP32 используйте любые свободные GPIO. Рекомендуется использовать пины с поддержкой аппаратных прерываний для точного отслеживания быстрых вращений.
| Вывод KY-040 | Направление | Вывод ESP32 | Описание |
|---|---|---|---|
| VCC обязательно | → | 3.3V | Питание модуля |
| GND обязательно | → | GND | Общий минус |
| CLK обязательно | → | GPIO18 | Основной сигнал фазы А |
| DT обязательно | → | GPIO19 | Сигнал данных (фаза B) |
| SW опционально | → | GPIO21 | Сигнал встроенной кнопки |
Устранение неполадок KY-040
Популярные вопросы и проблемы при использовании энкодера.
Пропуски импульсов или дребезг
Значения скачут при вращении
Причина: Механические контакты энкодера создают шум (дребезг).
Решение: Добавьте конденсаторы 0.1мкФ между CLK/DT и GND или примените программный антидребезг в коде. Также убедитесь, что вы обрабатываете сигналы через прерывания.
Неверное направление вращения
Инверсия право/лево
Решение: Просто поменяйте местами провода на контактах CLK и DT или измените логику сравнения фаз в коде программы.
Примеры программирования KY-040
Код для чтения состояния энкодера и кнопки на разных платформах.
Пример для Arduino
Чтение через цифровые пины
C++
Пример для Arduino
Чтение через цифровые пины
#define CLK_PIN 18
#define DT_PIN 19
#define SW_PIN 21
int counter = 0;
int lastStateCLK;
void setup() {
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
pinMode(SW_PIN, INPUT_PULLUP);
lastStateCLK = digitalRead(CLK_PIN);
Serial.begin(115200);
}
void loop() {
int currentStateCLK = digitalRead(CLK_PIN);
if (currentStateCLK != lastStateCLK) {
if (digitalRead(DT_PIN) != currentStateCLK) {
counter++;
} else {
counter--;
}
Serial.print("Position: ");
Serial.println(counter);
}
lastStateCLK = currentStateCLK;
if (digitalRead(SW_PIN) == LOW) {
Serial.println("Button Pressed!");
delay(200); // Простейший антидребезг для кнопки
}
}
Пример для ESP-IDF
Прерывания GPIO
C
Пример для ESP-IDF
Прерывания GPIO
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define CLK_PIN 18
#define DT_PIN 19
volatile int counter = 0;
int last_clk_state;
static void IRAM_ATTR encoder_isr_handler(void* arg) {
int clk_state = gpio_get_level(CLK_PIN);
if (clk_state != last_clk_state) {
if (gpio_get_level(DT_PIN) != clk_state) {
counter++;
} else {
counter--;
}
last_clk_state = clk_state;
}
}
void app_main(void) {
gpio_config_t io_conf = {
.intr_type = GPIO_INTR_ANYEDGE,
.mode = GPIO_MODE_INPUT,
.pin_bit_mask = (1ULL << CLK_PIN) | (1ULL << DT_PIN),
.pull_up_en = GPIO_PULLUP_ENABLE
};
gpio_config(&io_conf);
last_clk_state = gpio_get_level(CLK_PIN);
gpio_install_isr_service(0);
gpio_isr_handler_add(CLK_PIN, encoder_isr_handler, NULL);
while(1) {
printf("Encoder Position: %d\n", counter);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
Пример для MicroPython
Python-скрипт для ESP32
Python
Пример для MicroPython
Python-скрипт для ESP32
from machine import Pin
import time
clk = Pin(18, Pin.IN, Pin.PULL_UP)
dt = Pin(19, Pin.IN, Pin.PULL_UP)
sw = Pin(21, Pin.IN, Pin.PULL_UP)
counter = 0
clk_last_state = clk.value()
while True:
clk_state = clk.value()
if clk_state != clk_last_state:
if dt.value() != clk_state:
counter += 1
else:
counter -= 1
print("Position:", counter)
clk_last_state = clk_state
if sw.value() == 0:
print("Button Pressed")
time.sleep(0.2)
time.sleep(0.01)
Итоги KY-040
Модуль KY-040 — это универсальный инструмент для создания интерфейсов в ваших проектах. Простота подключения и наличие встроенной кнопки делают его незаменимым компонентом практически в любом устройстве управления.
Рекомендации
Используйте аппаратные прерывания для обработки сигналов CLK, чтобы не пропускать быстрые повороты ручки. Всегда добавляйте задержку или логическую фильтрацию для устранения дребезга контактов.
Безопасность
Не допускайте коротких замыканий между выводами питания. Питание 3.3В предпочтительно при работе с ESP32, чтобы избежать превышения допустимых уровней на входах контроллера.
