Модуль инкрементального энкодера KY-040

Узнайте всё о модуле инкрементального энкодера KY-040: спецификации, распиновка, схемы подключения к ESP32, документация и примеры кода для Arduino, Raspberry Pi

KY-0xx модуль Digital

Обзор

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

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

Модуль KY-040
Быстрая навигация
Основные разделы статьи
Примеры кода
Популярные платформы

О модуле энкодера KY-040

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

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

  • Continuous Rotation – Энкодер вращается на 360 градусов без ограничений.
  • Встроенная кнопка – Нажатие на вал замыкает контакт, что заменяет отдельную тактовую кнопку.
  • Цифровой интерфейс – Легко подключается к любым микроконтроллерам через цифровые GPIO.
Где купить

Приобретите KY-040

Технические характеристики

Характеристики KY-040

Полные технические параметры модуля инкрементального энкодера KY-040.

Рабочее напряжение
3.3В – 5В
Импульсов на оборот
20
Выход
2-битный код Грея
Механический угол
360° (непрерывно)
Скачать полный даташит
Конфигурация пинов

Распиновка KY-040

KY-040 — это 5-контактный модуль энкодера со встроенной кнопкой. Правильное подключение сигналов CLK и DT критично для определения направления вращения.

Диаграмма распиновки
Схема расположения выводов
Распиновка KY-040
Всего выводов
5
Типы
Питание + Цифровой
Быстрые советы
  • Интерфейс — Квадратурный выход (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. Рекомендуется использовать пины с поддержкой аппаратных прерываний для точного отслеживания быстрых вращений.

Схема соединений
Типовое подключение
Световая схема подключения уточняется — используйте таблицу ниже
Подключений
4-5
Уровни
3.3В или 5В
Функционал
Энкодер + Кнопка
Таблица соединений
Вывод KY-040 Направление Вывод ESP32 Описание
VCC обязательно 3.3V Питание модуля
GND обязательно GND Общий минус
CLK обязательно GPIO18 Основной сигнал фазы А
DT обязательно GPIO19 Сигнал данных (фаза B)
SW опционально GPIO21 Сигнал встроенной кнопки
⚡ Питание: 3.3В для ESP32 🔄 360° Вращение 🔘 Встроенная кнопка 🎯 20 импульсов/оборот
Устранение неполадок

Устранение неполадок KY-040

Популярные вопросы и проблемы при использовании энкодера.

Пропуски импульсов или дребезг
Значения скачут при вращении

Причина: Механические контакты энкодера создают шум (дребезг).

Решение: Добавьте конденсаторы 0.1мкФ между CLK/DT и GND или примените программный антидребезг в коде. Также убедитесь, что вы обрабатываете сигналы через прерывания.

Неверное направление вращения
Инверсия право/лево

Решение: Просто поменяйте местами провода на контактах CLK и DT или измените логику сравнения фаз в коде программы.

Примеры кода

Примеры программирования KY-040

Код для чтения состояния энкодера и кнопки на разных платформах.

Пример для Arduino

Чтение через цифровые пины

C++
#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
#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
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, чтобы избежать превышения допустимых уровней на входах контроллера.