Как подключить энкодер к ардуино
Подключение энкодера к Ардуино и полнофункциональный код обработки для него
Немного подробностей
Собирая один из проектов с использованием encoder. Я не смог найти код для Ардуино выполняющий все мои условия. Так как для проекта нужно обрабатывать следующие команды: «Вращение без нажатия», «Вращение с нажатием», «Нажатие» и «Длинное нажатие», а так же требуется стабильная работа энкодера. Скетчи использующие один пин с прерыванием INT0 или INT1, работают отвратительно и при вращении вала энкодера вылетает очень много ошибок. Код без использования прерываний работает стабильно, но он не работает в фоновом режиме, его нужно встраивать в тело основной программы, что в свою очередь приводит к не своевременному срабатыванию обработчика и пропускам при вращении энкодера. Еще хуже обстоят дела с обработкой нажатия с вращением вала энкодера и обычным с нажатием. Пришлось написать свой код обработки, который исключает описанные выше проблемы. С дребезгом контактов я не стал бороться программно, так как это приводит к задержкам обработки. Проще и надежней использовать керамические конденсаторы.
Схема подключения энкодера к Ардуино
Для считывания сигналов с выходов EC-11, нужно использовать три цифровых входа Arduino. В схеме подключения я использовал редко используемые мной в своих проектах выводы Arduino(A1, A2 и A3). Внешние подтягивающие резисторы отсутствуют, так как я использовал внутреннюю подтяжку микроконтроллера. Конденсаторы нужны для гашения импульсов дребезга контактов. Если у вас новый и хороший энкодер, то можно обойтись и без них. Но на кнопку в любом случае потребуется конденсатор, так как ее дребезг неизбежен.
Используемые в схеме компоненты:
Скетч для Ардуино
Заключение
Результат работы кода меня порадовал и теперь я могу продолжить работу над своим новым проектом, который скоро здесь выложу. Надеюсь эта короткая статья вам понравилась и вы сможете воспользоваться моей наработкой в своих самоделках.
Если у Вас остались вопросы и замечания, пишите их в комментариях. Я с удовольствием на них отвечу.
Подключение энкодера к Arduino. GyverEncoder v4.9
ОБНОВЛЕНИЯ
ТЕОРИЯ
Энкодер (от англ. encode – преобразовывать) – это устройство для преобразования угловых положений или линейных перемещений в цифровой сигнал, т.е. энкодер – это датчик угла или линейного перемещения, соответственно есть крутильные и линейные энкодеры. Принцип работы энкодера заключается в преобразовании механического перемещения в электрические сигналы, у обычного инкрементального энкодера, который мы будем рассматривать, этот сигнал представляет собой два квадратных сигнала (при равномерном вращении), сдвинутых по фазе на 90 градусов.
Самым хорошим модулем с энкодером на Aliexpress является вот такой, на круглой плате:
ПОДКЛЮЧЕНИЕ
Подключается модуль энкодера очень просто: питание на питание (GND и VCC), логические пины CLK, DT (тактовые выводы энкодера) и SW (вывод кнопки) на любые пины Arduino (D или A). У круглых модулей выводы энкодера подписаны как S1 и S2, а вывод кнопки как Key, подключаются точно так же. От порядка подключения тактовых выводов энкодера зависит “направление” его работы, но это можно поправить в программе.
У модулей энкодера тактовые выводы подтянуты к питанию и дают низкий сигнал при срабатывании, также на них стоят RC цепи для гашения дребезга. Вывод кнопки никуда не подтянут! Промышленный энкодер подключается точно так же, чёрный и красный провода у него питание, остальные – тактовые выходы.
У модулей энкодеров тактовые выходы и кнопка подтянуты к питанию, у круглого модуля также стоят RC цепи для аппаратного подавления дребезга контактов, у KY-40 (прямоугольный) распаяна только подтяжка. Если нужно подключить “голый” энкодер к плате – в целом можно подключить напрямую без обвязки, как на схеме ниже, моя библиотека отработает и подтяжку средствами микроконтроллера (INPUT_PULLUP), и программный антидребезг. Но рекомендуется всё-таки делать RC цепи для кнопки и для тактовых выходов энкодера.
Arduino и энкодер
Описание
Энкодер – общее название устройств, преобразующих одну величину в другую. В данном случае энкодер – это устройство, преобразующее вращательное механическое движение в цифровой сигнал, а сам энкодер в этом случае называется “поворотным” (вращательным, круговым). В наборе GyverKIT идёт инкрементальный поворотный энкодер с кнопкой, который служит очень удобным органом управления для электронного устройства и заменяет сразу несколько кнопок или джойстик, обеспечивая быструю навигацию по пунктам меню и изменение настроек. По сути похож на потенциометр, но не имеет ограничения по углу поворота. Особенности данного модуля:
Инкрементальный энкодер выдаёт импульсные логические сигналы со своих пинов на каждый щелчок. Сигналы отличаются по фазе, что позволяет определить направление текущего щелчка.
Алгоритмы опроса энкодера мы рассматривать не будем, это тема для отдельного серьёзного урока, поэтому научимся подключать модуль и работать с готовой библиотекой.
Подключение
Модуль подключается на питание, логические выводы – на любые цифровые пины. В случае с Wemos – на все кроме D8, так как подтяжка к VCC помешает МК запуститься. Подключу выводы энкодера на D2 и D3, а кнопку – на D4.

Библиотеки
Существует несколько библиотек для работы с энкодером, например:
В примерах на этом сайте мы будем использовать EncButton, т.к. она имеет самый большой набор вариантов опроса энкодера (поворот, нажатый поворот, быстрый поворот), а также хорошо оптимизирована и поддерживает расширенную работу с кнопкой. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию EncButton. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Подключение энкодера к Ардуино (KY-040)
Энкодер Ардуино, а точнее модуль KY-040 очень часто используется в проектах для управления различными устройствами от платы Arduino. В этом обзоре мы рассмотрим схему подключения модуля к микроконтроллеру, а также представим сразу несколько примеров с использованием датчика для включения и управления яркостью светодиодов, вращение сервопривода с помощью энкодера и платы Arduino.
Модуль энкодер Ардуино: схема, распиновка
Энкодер служит для преобразования угла поворота в электрический сигнал. При вращении ручки модуля мы получаем два сигнала (A и B), которые противоположны по фазе. Сигналы A и B зависят друг от друга при вращении энкодера Ардуино по часовой или против часовой стрелки. Для считывания сигнала A и B с энкодера можно использовать, как цифровые, так и аналоговые порты микроконтроллера.

Каждый раз, когда сигнал A переходит от положительного уровня к нулю, мы считываем значение сигнала B (смотри диаграмму выше). Если сигнал B находится в этот момент в положительном состоянии, значит энкодер вращается по часовой стрелке, если B равен нулю, то энкодер вращается против часовой стрелки. Считывая оба выхода при помощи Ардуино, можно определить направление и угол поворота.
Как подключить энкодер к Ардуино
Для этого занятия нам потребуется:

| Encoder | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| + | 5V | 5V | 5V |
| SW | 2 | 2 | 2 |
| DT | A2 | A2 | A2 |
| CLC | A3 | A3 | A3 |
Для работы с энкодером потребуется установить библиотеку RotaryEncoder.h, скачать архив можно здесь. Если у вас возникли трудности с установкой библиотеки для энкодера, то рекомендуем ознакомиться с информацией, как установить библиотеку в Arduino IDE. Для подключения KY-040 к Arduino можно использовать цифровые и аналоговые пины микроконтроллера, в наших примерах используются пины A2-A3.
Скетч. Пример Ардуино энкодер прерывание
Разберем для начала самый простой пример управления энкодером от Ардуино с помощью прерываний, где вся черновая работа по определению положения ручки энкодера выполняется с помощью библиотеки RotaryEncoder.h. Мы лишь выводим данные на монитор порта Arduino IDE. Соберите схему с энкодером, как показано на картинке выше и загрузите в микроконтроллер Arduino следующую программу.
Пояснения к коду:
Скетч. Управление энкодером Ардуино светодиодом
Следующий пример позволит управлять яркостью светодиода с помощью ШИМ сигнала, а также включать и выключать второй светодиод с помощью нажатия кнопки энкодера. Для этого соберите схему, размещенную выше. Обратите внимание, что порт SW энкодера подключен к пину 2 Arduino, а светодиоды к 12 и 11 пину. После сборки схемы загрузите следующий код управления светодиодами на Arduino с энкодером.
Пояснения к коду:
Скетч. Управление серво мотором от энкодера
Следующий скетч демонстрирует подключение серво с энкодером. Логический провод микросерво (желтый или оранжевый цвет) подключается к ШИМ порту 11 микроконтроллера. В программе задается угол поворота серво с помощью поворота ручки модуля ky-040. Работа программы похожа на управление потенциометром серво, но в случае с энкодером, можно задавать максимально точный угол поворота.
Как подключить инкрементальный энкодер к Ардуино
Часто в устройствах на микроконтроллерах нужно организовать управление пунктами меню или реализовать какие-то регулировки. Есть множество способов: использовать кнопки, переменные резисторы или энкодеры. Инкрементальный энкодер позволяет управлять чем-либо посредством бесконечного вращения ручки. В этой статье мы рассмотрим, как заставить работать инкрементальный энкодер и Arduino.
Особенности инкрементального энкодера
Инкрементальный энкодер, как и энкодеры любых других типов представляют собой устройство с вращающейся рукоятью. Отдаленно он напоминает потенциометр. Основным отличием от потенциометра является то, что рукоять энкодера вращается на 360 градусов. У него нет крайних положений.
Энкодеры бывают разных типов. Инкрементальный отличается тем, что с его помощью нельзя узнать положение рукояти, а только сам факт вращения в какую-то сторону – влево или вправо. По количеству импульсов сигнала вы уже можете рассчитать на какой угол он повернулся.
Таким образом вы можете передать микроконтроллеру команду, управлять меню, уровнем громкости, например, и так далее. В быту вы могли их видеть в автомагнитолах и другой технике. Его используют в качестве многофункционального органа регулировки уровней, эквалайзера и навигации по меню.
Принцип работы
Внутри инкрементального энкодера есть диск с метками и ползунки, которые с ними соприкасаются. Его строение подобно потенциометру.
На рисунке сверху вы видите диск с метками, они нужны для прерывания электрического соединения со подвижным контактом, в результате вы получаете данные о направлении вращения. Конструкция изделия не столь важна, давайте разберемся в принципе работы.
У энкодера есть три информационных вывода один общий, остальные два обычно называют «A» и «B», на рисунке выше вы видите цоколевку энкодера с кнопкой – вы можете получать сигнал при нажатии на его вал.
Какой сигнал мы получим? В зависимости от направления вращения логическая единица сначала появится на выводе A или B, таким образом мы получаем сдвинутый по фазе сигнал, а этот сдвиг позволяет определить в какую сторону. Сигнал получается в виде прямоугольной формы, а управление микроконтроллером происходит после обработки данных направления вращения и количества импульсов.
На рисунке изображено условное обозначение диска с контактами, по середине график выходных сигналов, а справа таблица состояний. Этот прибор часто рисуют как две клавиши, что логично, ведь фактически мы получаем сигнал «вперед» или «назад», «вверх» или «вниз», и количество воздействий.
Вот пример цоколевки реального энкодера:
Научитесь разрабатывать устройства на базе микроконтроллеров и станьте инженером умных устройств с нуля: Инженер умных устройств
Интересно:
Неисправный энкодер можно заменить двумя кнопками без фиксации, и наоборот: самоделку управление в которой осуществляется двумя такими кнопками можно доработать, установив энкодер.
На видео ниже вы видите чередование сигнала на выводах – при плавных вращениях светодиоды загораются в последовательности отраженной на предыдущем графике.
Не менее наглядно это проиллюстрировано на следующей анимации (нажмите на рисунок):
Энкодер может быть и оптическим (сигнал формируется излучателями фотоприемниками, см. на рисунке ниже), и магнитным (работает на эффекте Холла). В таком случае у него нет контактов и больше срок службы.
Как уже было сказано, направление вращения можно определить по тому, какой из выходных сигналов раньше изменился, а вот так это выглядит на практике!
Точность управления зависит от разрешения энкодера – количества импульсов на оборот. Количество импульсов может быть от единиц до тысяч штук. Так как энкодер может выступать в качестве датчика положения, то чем больше импульсов – тем точнее будет происходить определение. Этот параметр обозначается как PPR – pulse per revolution.
Но есть небольшой нюанс, а именно похожее обозначение LPR – это количество меток на диске.
А количество обрабатываемых импульсов. Каждая метка на диске даёт 1 прямоугольный импульс на каждом из двух выходов. У импульса есть два фронта – задний и передний. Так как выхода два то с каждого из них мы в сумме получаем 4 импульса значения которых вы можете обработать.
Явно полезное:
Подключаем энкодер к Arduino
Мы разобрались с тем что нужно знать об инкрементальном энкодере, теперь давайте узнаем, как подключить его к Ардуино. Рассмотрим схему подключения:
Модуль энкодера – это плата на которой расположен инкрементальный энкодер и подтягивающие резисторы. Пины можно использовать любые.
Если у вас не модуль, а отдельный энкодер, вам всего лишь нужно добавить эти резисторы, схема не будет ничем отличаться принципиально. Для проверки направления вращения и работоспособности его в связке с Ардуино мы можем прочитать информацию с последовательного порта.
Разберем код подробнее, по порядку. В void setup() мы объявили что будем использовать связь через последовательный порт, а затем установили пины 2 и 8 в режим входа. Номера пинов выбираете сами исходя из вашей схемы подключения. Константа INPUT_PULLUP выставляет режим входа, у ардуино есть два варианта:
INPUT – вход без подтягивающих резисторов;
INPUT_PULLUP – подключение ко входу подтягивающих резисторов. Внутри микроконтроллера уже есть резисторы, через которые вход соединяется с плюсом питания (pullup).
Если вы используете резисторы для подтяжки к плюсу питания как изображено на схемах, приведенных выше или используете модуль энкодера – пользуйтесь командой INPUT, а если по какой-то причине не можете или не хотите использовать внешние резисторы – INPUT_PULLUP.
Логика основной программы следующая: если на входе «2» у нас единица – выдаёт в монитор порта H, если нет – L. Таким образом при вращении в одну сторону на мониторе последовательного порта получится что-то вроде этого: LL HL HH LH LL. А в обратную: LL LH HH HL LL.
Если вы внимательно прочли строки, то наверняка заметили, что в одном случае первый символ приобретал значение, а в другом случае сначала изменялся второй символ.
Заключение
Инкрементальные энкодеры нашли широкое практическое применение в усилителях для акустических систем – их использовали в качестве органа управления регулятора громкости, в автомагнитолах – для регулировки параметров звука и навигации по меню, в компьютерных мышках с его помощью вы ежедневно прокручиваете страницы (на его вале установлено колесико). А также в измерительных инструментах, ЧПУ станках, роботах, в сельсинах не только в качестве органов управления, но и измерения величин и определения положения.




















