СОДЕРЖАНИЕ ►
Энкодер Ардуино, а точнее модуль KY-040 очень часто используется в проектах для управления различными устройствами от платы Arduino. В этом обзоре мы рассмотрим схему подключения модуля к микроконтроллеру, а также представим сразу несколько примеров с использованием датчика для включения и управления яркостью светодиодов, вращение сервопривода с помощью энкодера и платы Arduino.
Модуль энкодер Ардуино: схема, распиновка
Энкодер служит для преобразования угла поворота в электрический сигнал. При вращении ручки модуля мы получаем два сигнала (A и B), которые противоположны по фазе. Сигналы A и B зависят друг от друга при вращении энкодера Ардуино по часовой или против часовой стрелки. Для считывания сигнала A и B с энкодера можно использовать, как цифровые, так и аналоговые порты микроконтроллера.

Каждый раз, когда сигнал A переходит от положительного уровня к нулю, мы считываем значение сигнала B (смотри диаграмму выше). Если сигнал B находится в этот момент в положительном состоянии, значит энкодер вращается по часовой стрелке, если B равен нулю, то энкодер вращается против часовой стрелки. Считывая оба выхода при помощи Ардуино, можно определить направление и угол поворота.
Как подключить энкодер к Ардуино
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- модуль энкодер ky-040;
- беспаечная макетная плата;
- светодиоды и резисторы;
- микро сервопривод;
- провода «папа-папа», «папа-мама».

| Encoder | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| + | 5V | 5V | 5V |
| SW | 2 | 2 | 2 |
| DT | A2 | A2 | A2 |
| CLC | A3 | A3 | A3 |
Для работы с энкодером потребуется установить библиотеку RotaryEncoder.h, скачать архив можно здесь. Если у вас возникли трудности с установкой библиотеки для энкодера, то рекомендуем ознакомиться с информацией, как установить библиотеку в Arduino IDE. Для подключения KY-040 к Arduino можно использовать цифровые и аналоговые пины микроконтроллера, в наших примерах используются пины A2-A3.
Скетч. Пример Ардуино энкодер прерывание
Разберем для начала самый простой пример управления энкодером от Ардуино с помощью прерываний, где вся черновая работа по определению положения ручки энкодера выполняется с помощью библиотеки 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; } }
Пояснения к коду:
- начальное положение ручки равно нулю
static int pos = 0;и это значение выводится на мониторе порта в процедуре void setup в начале программы; - в примере программы для энкодера нет ограничения по положению рукоятки датчика KY-040, положение может быть положительным и отрицательным.

Скетч. Управление энкодером Ардуино светодиодом
Следующий пример позволит управлять яркостью светодиода с помощью ШИМ сигнала, а также включать и выключать второй светодиод с помощью нажатия кнопки энкодера. Для этого соберите схему, размещенную выше. Обратите внимание, что порт SW энкодера подключен к пину 2 Arduino, а светодиоды к 12 и 11 пину. После сборки схемы загрузите следующий код управления светодиодами на Arduino с энкодером.
#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); // пин подключения кнопки энкодера (SW) 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); } }
Пояснения к коду:
- для пина 2 используется конфигурация INPUT_PULLUP, так как кнопка энкодера подключена к GND и при ее нажатии на цифровом входе будет сигнал LOW;
- в программе можно изменить максимальное и минимальное значение поворота энкодера, а также шаг вращения ручки датчика ky-040.
Скетч. Управление серво мотором от энкодера

Следующий скетч демонстрирует подключение серво с энкодером. Логический провод микросерво (желтый или оранжевый цвет) подключается к ШИМ порту 11 микроконтроллера. В программе задается угол поворота серво с помощью поворота ручки модуля ky-040. Работа программы похожа на управление потенциометром серво, но в случае с энкодером, можно задавать максимально точный угол поворота.
#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); }
Пояснения к коду:
- шаг поворота качалки серво Ардуино составляет 10 градусов. Шаг поворота и максимальный угол поворота можно изменить в программе.
Заключение. Мы рассмотрели несколько вариантов подключения модуля энкодера к Arduino: пример с прерыванием и управлением светодиодом, пример с управлением мотором серво. Также модуль можно использовать для управления меню на дисплее 1602 LCD Ардуино. Мы использовали библиотеку RotaryEncoder.h, но есть еще несколько библиотек энкодера для Ардуино, которые в одном обзоре не уместить.










Добавить комментарий