Поворотный энкодер Arduino (модуль KY-040) очень часто используется в проектах для управления различными устройствами от микроконтроллера Arduino. В этом обзоре мы рассмотрим распиновку и схему подключения модуля KY-040 к Ардуино. Представим несколько примеров с использованием модуля rotary encoder для управления яркостью светодиода, вращением серводвигателя с помощью платы Arduino Uno.
СОДЕРЖАНИЕ
- Ардуино энкодер распиновка, характеристики
- Подключение поворотного энкодера к Ардуино
- Код для управления энкодером от Ардуино
- Подключение светодиода и энкодера к Ардуино
- Код для управления светодиодом от энкодера
- Подключение сервопривода и энкодера к Arduino
- Код для управления сервомотором от энкодера
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- rotary encoder ky-040
- светодиоды и резисторы
- сервомотор
- макетная плата
- коннекторы
- скачать библиотеку RotaryEncoder.h
Дополнительные материалы на эту тему:
Encoder Arduino используется для преобразования угла поворота в электрический сигнал. Поворот ручки на модуле создает два сигнала (A и B), которые находятся в противоположной фазе. Исходящий сигнал зависит от направления поворота ручки энкодера — по часовой стрелке или против часовой стрелки. Цифровые и аналоговые порты микроконтроллера могут быть использованы для считывания сигнала A и B.
Encoder Arduino распиновка, характеристики

Характеристики энкодера ky-040 (datasheet)
- Напряжение питания: 5 В
- Рабочий ток: 10 мА
- Импульсов / оборотов: 20
- Рабочий ресурс: от 15000 оборотов
- Длина вала: 12 мм
Каждый раз, когда сигнал A переходит от положительного значения к нулю, мы считываем значение сигнала B (смотрите схему с принципом работы модуля). Если сигнал B в это время положительный, то поворотный энкодер вращается по часовой стрелке, если сигнал B равен нулю, то энкодер вращается против часовой стрелки. Таким образом, с помощью микроконтроллера Arduino можно определить направление поворота ручки.
Как подключить энкодер к Arduino Uno

Для работы необходимо установить библиотеку RotaryEncoder.h. Начнем с примера для управления энкодером от Arduino Uno, где вся черновая работа по определению вращения ручки энкодера выполняется с помощью библиотеки RotaryEncoder.h. Мы только выводим данные на монитор порта Arduino IDE. Соберите схему с энкодером, как показано на рисунке выше и загрузите в микроконтроллер Ардуино следующую программу.
Скетч для подключения энкодера к Arduino
#include "RotaryEncoder.h"
RotaryEncoder encoder(A2, A3); // (DT, CLK)
static int pos = 0;
int newPos;
void setup() {
Serial.begin(9600);
Serial.println(pos);
}
void loop() {
encoder.tick();
newPos = encoder.getPosition();
if (pos != newPos) {
Serial.println(newPos);
pos = newPos;
}
}
Подключение энкодера к Ардуино и светодиодов

Следующий пример позволяет управлять яркостью светодиода с помощью ШИМ-сигнала, включать и выключать второй светодиод нажатием кнопки энкодера. Для этого соберите схему, показанную на картинке выше. Обратите внимание, что порт SW модуля энкодера подключен к контакту 2 микроконтроллера Ардуино. После сборки схемы загрузите следующий код для управления светодиодами с помощью поворотного энкодера.
Скетч для управления светодиодами от энкодера
#include "RotaryEncoder.h"
RotaryEncoder encoder(A2, A3); // (DT, CLK)
#define STEPS 5
#define POSMIN 0
#define POSMAX 255
int lastPos, newPos;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
encoder.setPosition(10 / STEPS);
}
void loop() {
encoder.tick();
newPos = encoder.getPosition() * STEPS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPS); newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPS);
newPos = POSMAX;
}
if (lastPos != newPos) {
Serial.println(newPos);
lastPos = newPos;
}
analogWrite(11, lastPos);
if (digitalRead(2) == HIGH) { digitalWrite(12, LOW); }
if (digitalRead(2) == LOW) { digitalWrite(12, HIGH); }
}
Управление серво мотором от энкодера Ардуино

На рисунке показано подключение сервопривода и энкодера к Ардуино. Логический провод сервомотора (желтый или оранжевый) подключается к порту 11 микроконтроллера. Программа устанавливает угол поворота сервопривода поворотом ручки модуля ky-040. Работа программы аналогична управлению от потенциометра (переменного резистора), но в случае с энкодером угол micro servo может быть установлен максимально точно.
Скетч для управления сервомотором от энкодера
#include "RotaryEncoder.h"
RotaryEncoder encoder(A2, A3); // (DT, CLK)
#include "Servo.h"
Servo servo;
#define STEPS 10
#define POSMIN 0
#define POSMAX 180
int lastPos, newPos;
void setup() {
servo.attach(11);
Serial.begin(9600);
encoder.setPosition(10 / STEPS);
}
void loop() {
encoder.tick();
newPos = encoder.getPosition() * STEPS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPS); newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPS);
newPos = POSMAX;
}
if (lastPos != newPos) {
Serial.println(newPos);
lastPos = newPos;
}
servo.write(lastPos);
}
Заключение. Мы рассмотрели распиновку энкодера и несколько вариантов подключения модуля ky-040 к Arduino. Пример с управлением светодиода Ардуино и управлением сервомотором с помощью rotary encoder. Модуль можно использовать для создания меню на lcd 1602 и в других проектах. В скетчах использована библиотека RotaryEncoder.h, но есть еще несколько библиотек, которые просто не помещаются в один обзор.
