Энкодер. Модуль KY-040 для Ардуино

Модуль KY-040 для arduino является энкодером, то есть датчиком угла поворота.
Ещё KY-040 называют модулем датчика вращения или валкодером. Сам валкодер (энкодер), в данном модуле, напоминает переменный резистор, но в отличии от него не имеет ограничений по количеству оборотов, что очень удобно.
При вращении вала энкодера хорошо ощущаются “ступеньки”. В моём случаи при полном обороте их 20. То есть 20 импульсов на оборот. Хотя во всех описаниях к модулю KY-040 стоит цифра 24. В продаже, к слову, можно найти энкодеры от 4 до 1024 импульсов на оборот.
Но модуль энкодера KY-040 не просто крутилка, это ещё и кнопка. Поясню: вал не только можно крутить в обе стороны, но на него можно ещё и нажать. Или даже нажать и крутить. На модуле есть отдельный выход SW, при нажатии на вал на него подаётся питание.
Рас уж мы заговорили о выходах, перейдём непосредственно к подключению KY-040 к ардуино.
Подключение модуля KY-040 к arduino

На “+” подаём 5В, на “GND” – землю, “CLK” (импульсы отсчета энкодера) – подключаем к пину 8, “DT” (импульсы направления энкодера) - подключаем к пину 7. Если нужно задействовать кнопку, то выход “SW” подключаем к ардуино, как обычную кнопку, но с использованием подтягивающего резистора. Так как при нажатии на кнопку энкодера на выход “SW” подаётся земля.
Принцип работы энкодера KY-040
Не будим углубляется в тонкости и сразу зальём простой скетч на arduino:
int pin_DT = 7; // пин 7 подключаем к DT енкодера
int pin_CLK = 8; // пин 8 подключаем к CLK енкодера
int Last;
void setup() {
pinMode (pin_DT,INPUT);
pinMode (pin_CLK,INPUT);
Last = digitalRead(pin_DT);
Serial.begin (9600);
}
void loop() {
int DT = digitalRead(pin_DT);
if (DT != Last){
Serial.print("DT:");
Serial.print(digitalRead(pin_DT)); // Считываем значение на выходе DT
Serial.print(" ");
Serial.print(digitalRead(pin_CLK));//Считываем значение на выходе CLK
Serial.println(":CLK");
}
Last = DT;
}
Открываем монитор порта и смотрим данные с выходов CLK и DT при повороте вала энкодера. Сигналы с выходов поступают в виде логических 0 и 1.

Как видно если DT и CLK равны, то поворот осуществляется против часовой стрелки (налево). А если DT и CLK не равны, то всё на оборот: вращение идёт по часовой стрелке (направо).
Но тут следует отметить, что не всё так гладко: иногда проскакивают сбойчики. Например, быстро крутим на лево, а на мониторе строка где DT и CLK не равны… Но в целом всё ok.
Далее расширим функциональность нашего скетча.
Пример скетча для arduino
int pin_DT = 7; // пин 7 подключаем к DT енкодера
int pin_CLK = 8; // пин 8 подключаем к CLK енкодера
int pos_encoder = 0; // Первоначальная позиция енкодера равна 0
int Last; // Тут всегда будет лежать предыдущие значение положения енкодера
int DT;
boolean left;
void setup() {
pinMode (pin_DT,INPUT);
pinMode (pin_CLK,INPUT);
Last = digitalRead(pin_DT); // Считываем значение на выходе DT и запоминаем его
Serial.begin (9600);
}
void loop() {
DT = digitalRead(pin_DT);
if (DT != Last){ // Сравниваем фактическое положение с предыдущим, если они не равны то енкодер изменил положение
if (digitalRead(pin_CLK) != DT) { // Если значение с pin_CLK не равно значению с pin_DT, то значит вращение было НАПРАВО ->
pos_encoder++;
left = false;
} else { // Если значение с pin_CLK равно значению с pin_DT, то значит вращение было НАЛЕВО <-
left = true;
pos_encoder--;
}
Serial.print ("Napravlenie vrasheniya: ");
if (!left){
Serial.println("NAPRAVO ->");
}else{
Serial.println("NALEVO <-");
}
Serial.print("Polozhenie: ");
Serial.println(pos_encoder);
}
Last = DT;
}

Теперь при вращении вала энкодера мы видим на мониторе направление его вращения и положение. Изначально положение всегда равно 0, в независимости в каком положении находится вал энкодера. При повороте на право к положению прибавляется по единице, налево – отнимается. Причем при повороте на один импульс (щелчок), на мониторе порта появляется сразу четыре строки и положение становится равно 2. То есть каждый импульс равен двум. В нашем случае, когда энкодер имеет 20 импульсов на оборот, после полного оборота на право положение будет равно 40.
Дребезг энкодера
Надо отметить, что у энкодера прослеживается такое явление как дребезг. То есть некие помехи, ложные срабатывания, которые мешают со стопроцентной вероятностью считывать данные с энкодера. Если вы попробовали выполнить вышеописанный пример, то вы понимаете, о чем речь: быстро крутим налево, но периодически проскальзывает NAPRAVO ->, либо наоборот…Бороться с этим можно как аппаратным методом, так и программно, но полностью искоренить это сложно.
Где купить
Banggood.com:37 в 1 набор модулей для Ардуино: http://bgd.by/27soby
Aliexpress.com:
Модуль энкодер KY-040 для Ардуино: http://ali.pub/20bihg
10 штук KY-040 для Ардуино: http://ali.pub/1l4how
37 в 1 набор модулей для Ардуино: http://ali.pub/1arpsm