Библиотека энкодера для ардуино подключение и примеры

0
7

Энкодер ардуино библиотека

Подсоедините сигнальные контакты 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 → Земля

Код для считывания поворотов

  1. Установите Encoder.h через менеджер плат.
  2. Используйте этот фрагмент:
#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. Это снизит нагрузку на процессор, но уменьшит точность.

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь