View Categories

Энкодер

Энкодер – общее название устройств, преобразующих одну величину в другую. В данном случае энкодер – это устройство, преобразующее вращательное механическое движение в цифровой сигнал, а сам энкодер в этом случае называется "поворотным" (вращательным, круговым). Рассмотренный ниже инкрементальный поворотный энкодер с кнопкой служит очень удобным органом управления для электронного устройства и заменяет сразу несколько кнопок или джойстик, обеспечивая быструю навигацию по пунктам меню и изменение настроек: например в некоторых 3D принтерах с огромным сложным меню с кучей настроек навигация производится при помощи одного только энкодера! По сути похож на потенциометр, но не имеет ограничения по углу поворота, а само вращение рукоятки - "ступенчатое", что позволяет тактильно ощущать каждый шаг изменения значения.

В наборе GyverKIT START IOT EXTRA
Энкодер

Особенности данного модуля:

  • Качественный инкрементальный энкодер с кнопкой
  • 20 "щелчков" на один оборот
  • Выведено питание (5V, GND), два пина энкодера (S1, S2) и пин кнопки (KEY)
  • Работает также от 3.3V (для Wemos)
  • Все логические пины подтянуты к VCC резисторами на плате
  • RC цепи гашения дребезга на выводах энкодера

Подключение к Arduino #

Модуль подключается на питание, логические выводы – на любые цифровые пины. В случае с Wemos – на все кроме D8, так как подтяжка к VCC помешает МК запуститься. Подключу выводы энкодера на D2 и D3, а кнопку – на D4:

Программирование #

Алгоритмы опроса энкодера разобраны в отдельном уроке.

Библиотеки #

В рамках примеров и проектов будем использовать библиотеку EncButton, она позволяет работать как отдельно с энкодером, так и с энкодером+кнопкой для сложных сценариев управления и выбора. Её можно установить/обновить из встроенного менеджера библиотек Arduino по названию EncButton. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Для работы библиотеки нужно вызывать метод tick() в loop() и опрашивать нужные события. Их там много - смотрите документацию.

Меняем значение переменной
/*
  Меняем значение переменной при помощи энкодера
  Обычный поворот +-1
  "Нажатый" поворот +-5
*/

#include <EncButton.h>
EncButton enc(2, 3, 4);  // выводы энкодера на 2 и 3, кнопка на 4

void setup() {
  Serial.begin(115200);
}

int val = 0;  // будем управлять этой переменной

void loop() {
  // опрос энкодера происходит тут
  enc.tick();

  // вправо
  if (enc.right()) {
    val += 1;
    Serial.println(val);
  }

  // влево
  if (enc.left()) {
    val -= 1;
    Serial.println(val);
  }

  // вправо нажатый
  if (enc.rightH()) {
    val += 5;
    Serial.println(val);
  }

  // влево нажатый
  if (enc.leftH()) {
    val -= 5;
    Serial.println(val);
  }
}
Меняем яркость и состояние светодиода
/*
  Меняем яркость светодиода на пине 13 (программный ШИМ)
  Клик - переключить состояние (вкл выкл)
*/

#include <EncButton.h>
EncButton enc(2, 3, 4);  // выводы энкодера на 2 и 3, кнопка на 4

void setup() {
  // пин 13 как выход (для мигания светодиодом)
  pinMode(13, OUTPUT);
}

int bright = 128; // храним яркость
bool state = 1;   // состояние светодиода

void loop() {
  // опрос энкодера происходит тут
  enc.tick();

  // передаём яркость, умноженную на state (0 или 1)
  // то есть получится bright или 0 в зависимости от state
  softPWM(13, bright * state);

  // вправо - увеличиваем на 10
  if (enc.right()) bright = constrain(bright + 10, 0, 255);

  // влево - уменьшаем на 10
  if (enc.left()) bright = constrain(bright - 10, 0, 255);

  // клик - переключаем состояние по клику
  if (enc.click()) state = !state;
}

// софт шим
void softPWM(byte pin, byte val) {
  static byte count;
  count++;
  if (count == 0 && val != 0) digitalWrite(pin, 1);
  if (count == val) digitalWrite(pin, 0);
}

Полезные страницы #

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх