Модуль энкодер Ардуино: схема, распиновка
Энкодер служит для преобразования угла поворота в электрический сигнал. При вращении ручки модуля мы получаем два сигнала (A и B), которые противоположны по фазе. Сигналы A и B зависят друг от друга при вращении энкодера Ардуино по часовой или против часовой стрелки. Для считывания сигнала A и B с энкодера можно использовать, как цифровые, так и аналоговые порты микроконтроллера.
Каждый раз, когда сигнал A переходит от положительного уровня к нулю, мы считываем значение сигнала B (смотри диаграмму выше). Если сигнал B находится в этот момент в положительном состоянии, значит энкодер вращается по часовой стрелке, если B равен нулю, то энкодер вращается против часовой стрелки. Считывая оба выхода при помощи Ардуино, можно определить направление и угол поворота.
Как подключить энкодер к Ардуино
Для занятия нам понадобятся следующие детали:
плата Arduino Uno / Arduino Nano / Arduino Mega;
модуль энкодер ky-040;
беспаечная макетная плата;
светодиоды и резисторы;
микро сервопривод;
провода «папа-папа», «папа-мама».
Для работы с энкодером потребуется установить библиотеку RotaryEncoder.h. Если у вас возникли трудности с установкой библиотеки для энкодера, то рекомендуем ознакомиться с информацией, как установить библиотеку в Arduino IDE. Для подключения KY-040 к Arduino можно использовать цифровые и аналоговые пины микроконтроллера, в наших примерах используются пины A1-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 градусов. Шаг поворота и максимальный угол поворота можно изменить в программе.