Модуль KY-040 является модулем механического энкодера с тактовой кнопкой, расположенной под штоком ротора. Вал вращается как по часовой стрелке, так и против, угол вращения не ограничен. Энкодер имеет 30 фиксированных позиций.
Модуль имеет 5 выводов, два из которых отведены на подачу питания (5 В), а три предназначены для работы с сигналами, получаемыми от энкодера. Отслеживая когда на выводе DT появляется сигнал (до или после сигнала на CLK), можно определять в какую сторону вращается вал: по часовой стрелке или против.
На анимации ниже представлено схематичное изображение принципа работы энкодера. На схеме изображен металлический диск с некоторым количеством лучей на подложке из диэлектрика и три контакта. Контакт C (соединенный с выводом GND) подключен к металлическому диску всегда, в то время как A (CLK) и B (DT) замыкаются на диск только в определенные фазы его вращения. Диск, очевидно, выступает в роли перемычки между A и C, равно как и для B и C. Когда A замыкается с C, то сигнал появляется на выводе CLK, а когда с B – на выводе DT.
Контактная группа модуля:
- CLK — выдает импульсы, свидетельсвующие о смене позиции (шаге) вала
- DT — выдает импульсы, позволяющие определить в какую сторону вращается вал
- WS — вывод тактовой кнопки
- + – питание, 5 В
- GND – питание, «земля»
Пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#define CLK 7 #define DT 8 #define SW 9 #include "GyverEncoder.h" Encoder enc1(CLK, DT, SW); void setup() { Serial.begin(9600); } void loop() { // обязательная функция отработки. Должна постоянно опрашиваться enc1.tick(); if (enc1.isTurn()) { // если был совершён поворот (индикатор поворота в любую сторону) // ваш код } if (enc1.isRight()) Serial.println("Right"); // если был поворот if (enc1.isLeft()) Serial.println("Left"); if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот if (enc1.isLeftH()) Serial.println("Left holded"); if (enc1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) if (enc1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) if (enc1.isHolded()) Serial.println("Holded"); // если была удержана и энк не поворачивался //if (enc1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки } |