Подсоедините сигнальные контакты CLK и DT к цифровым входам платы, например, D2 и D3. Питание подается на +5V, земля – на GND. Для защиты от дребезга добавьте конденсатор 0.1 мкФ между контактами и землей.
Считывание импульсов реализуется через прерывания. При повороте вала генерируются два сигнала со сдвигом фазы. Обработка в коде выглядит так:
volatile int counter = 0;
void setup() {
attachInterrupt(0, updateEncoder, CHANGE);
}
void updateEncoder() {
if (digitalRead(2) == digitalRead(3)) counter++;
else counter--;
}
Для точного определения направления вращения проверяйте состояние CLK при изменении DT. Если уровни совпадают – движение по часовой стрелке, при различии – против.
Работа с инкрементальным датчиком поворота и Arduino
Схема соединений
- CLK → D2
- DT → D3
- SW → D4 (через резистор 10 кОм)
- + → 5V
- GND → Земля
Код для считывания поворотов
- Установите Encoder.h через менеджер плат.
- Используйте этот фрагмент:
#include <Encoder.h>
Encoder myEnc(2, 3);
void setup() {
Serial.begin(9600);
}
void loop() {
int pos = myEnc.read();
if (pos != 0) {
Serial.println(pos);
myEnc.write(0);
}
}
При повороте вправо значения будут положительными, влево – отрицательными.
Обработка нажатия кнопки
Добавьте в loop() проверку состояния пина SW:
if (digitalRead(4) == LOW) {
Serial.println("Кнопка активирована");
delay(200); // Защита от дребезга
}
Подсоедините CLK к цифровому входу 2, DT – к 3, а SW – к 4. Питание подайте на +5V, землю – на GND. Если используется подтяжка, добавьте резисторы 10 кОм между каждым сигнальным контактом и +5V.
Для обработки сигналов в скетче задействуйте прерывания. Настройте пины как INPUT_PULLUP, если резисторы не установлены:
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), readEncoder, CHANGE);
Функция readEncoder должна сравнивать состояния CLK и DT. Если CLK равен DT, вращение по часовой стрелке, иначе – против:
void readEncoder() {
if (digitalRead(2) == digitalRead(3)) {
counter++;
} else {
counter--;
}
}
Кнопку обрабатывайте через digitalRead с защитой от дребезга. Задержка 50 мс устраняет ложные срабатывания:
if (digitalRead(4) == LOW) {
delay(50);
if (digitalRead(4) == LOW) {
buttonPressed = true;
}
}
Считывание поворотов и нажатий: рабочий код
Подключите CLK к пину 2, DT к пину 3, SW к пину 4. Используйте прерывания для точного отслеживания изменений.
volatile int counter = 0;
int lastStateCLK;
const int buttonPin = 4;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), updateEncoder, CHANGE);
Serial.begin(9600);
lastStateCLK = digitalRead(2);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
delay(50); // Защита от дребезга
Serial.println("Кнопка нажата");
}
}
void updateEncoder() {
int currentStateCLK = digitalRead(2);
if (currentStateCLK != lastStateCLK) {
if (digitalRead(3) != currentStateCLK) {
counter++;
} else {
counter--;
}
Serial.print("Позиция: ");
Serial.println(counter);
}
lastStateCLK = currentStateCLK;
}
Для уменьшения дребезга контактов добавьте конденсатор 0.1 мкФ между SW и землей. Если вращение считывается в обратную сторону, поменяйте местами CLK и DT.
Для обработки быстрых поворотов замените CHANGE
на RISING
в attachInterrupt
. Это снизит нагрузку на процессор, но уменьшит точность.