Рубрики
Схемы на Arduino

Как работает инкрементальный энкодер и как его подключить к Arduino

Инкрементальный энкодер (rotary encoder) – это тип электромеханического датчика, который можно использовать для определения углового положения его оси. Данный датчик формирует на своем выходе электрические сигналы в зависимости от направления вращения своей оси. Энкодер состоит из механических компонентов, поэтому он отличается надежностью работы и используется в различных приложениях: роботы, компьютерные мышки, плоттеры, принтеры и т.д.

Существует два типа энкодеров: абсолютные энкодеры и инкрементальные энкодеры. В данной статье мы будем использовать инкрементальный энкодер.

Ранее на нашем сайте мы уже рассматривали подключение инкрементального энкодера к плате Arduino, но эта статья более свежая и значительно более подробная. Также на нашем сайте есть статьи про подключение инкрементального энкодера к другим микроконтроллерам:

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Инкрементальный энкодер (купить на AliExpress).

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Принципы работы инкрементального энкодера

Распиновка инкрементального энкодера

Модуль инкрементального энкодера содержит 5 контактов: GND, +(VCC), SW(Switch), DT и CLK. Все эти контакты являются цифровыми, за исключением контактов VCC и Ground. Назначение контактов (распиновка) инкрементального энкодера представлена на следующем рисунке.

GND – контакт общего провода (земли) инкрементального энкодера, в нашем проекте его необходимо подключить к общему проводу (ground pin) платы Arduino.

VCC – контакт для подачи питания на инкрементальный энкодер, его необходимо подключать к источнику напряжения питания 5V или 3.3V.

SW (switch pin) – контакт переключения энкодера. Инкрементальный энкодер, который мы используем, содержит внутри себя кнопку, которая активируется при нажатии на верхний край его рукоятки (оси). В активном состоянии эта кнопка формирует уровень LOW.

DT – данный контакт представляет собой фактически то же самое что и контакт CLK, но последовательность импульсов на нем сдвинута по фазе на 90 градусов относительно контакта CLK.

CLK – главный контакт модуля инкрементального энкодера. Каждый раз при вращении рукоятки выходной импульс на нем сменяет свое состояние с High на Low.

Как работает инкрементальный энкодер

Если посмотрим внутрь инкрементального энкодера, то там мы увидим диск с большим количеством вырезанных в нем отверстий. Логика выходных импульсов энкодера определяется его двумя контактами, показанными на рисунке ниже. Пластина энкодера подключается к общему проводу схемы.

При вращении оси энкодера его контакты Output A и Output B вступают в контакт с его пластиной в определенном порядке, который зависит от направления вращения оси энкодера. Если ось энкодера вращается по часовой стрелке, то сначала с пластиной соединяется output A, а потом output B. Если ось энкодера вращается против часовой стрелки, то все происходит с точностью наоборот. Таким образом, при любом направлении вращения оси энкодера сигналы на его выходах output A и output B сдвинуты на до градусов относительно друг друга.

На представленной анимации если мы вращаем ось энкодера по часовой стрелке, контакт A подключается первым, а потом подключается контакт B. Отслеживая какой контакт подключился к пластине первым мы можем определить направление вращения оси энкодера и, соответственно, мы можем инкрементировать или декрементировать состояние счетчика в нашей программе.

Компоненты модуля инкрементального энкодера

Это очень дешевый и простой в использовании модуль, который может быть использован в разнообразных приложениях. В зависимости от направления вращения своей оси он генерирует последовательность цифровых сигналов на своих контактах DATA и clock. Если импульсы начинаются с контакта data, а импульсы на контакте CLK сдвинуты относительно него на 90 градусов, это значит что ось энкодера вращается по часовой стрелке, иначе она вращается против часовой стрелки.

Если вы посмотрите внимательно на модуль инкрементального энкодера, то вы увидите, что на его печатной плате сравнительно мало элементов: на фронтальной части мы видим рукоятку энкодера и контакты, а на тыльной части только подтягивающие резисторы. Фактически, инкрементальный энкодер – это механическое устройство, способное работать с уровнями напряжения 3.3V и 5V.

Наиболее часто задаваемые вопросы про инкрементальный энкодер

Где применяются инкрементальные энкодеры?
Достаточно часто они применяются для управления скоростью и направлением движения ленты транспортёра. Также они востребованы в системах распределения товаров на складах, системах обработки багажа и упаковочных системах.

Какие типы энкодеров существуют?
Энкодеры выпускаются 4-х основных типов: механические, оптические, магнитные и электромагнитные.

Какие сигналы на выходе энкодера?
Инкрементальные энкодеры, также называемые энкодерами с ручкой, представляют собой электромеханические устройства, которые преобразуют угловое положение своей оси в аналоговые или цифровые выходные сигналы. Существует два основных типа подобных энкодеров: абсолютные и инкрементальные.

Что лучше: инкрементальный энкодер или потенциометр?
Основным преимуществом инкрементальных энкодеров перед потенциометрами является то, что они могут вращаться в одном направлении бесконечно долго, что позволяет значительно увеличить точность регулировки необходимого параметра. А потенциометры могут совершать в обоих направлениях только по одному обороту, что не всегда удобно для управления какими либо процессами.

Что такое джиттер энкодера?
Джиттер (дрожание) сигнала энкодера заключается в непостоянстве формы импульсов на выходах двух каналов энкодера относительно друг друга, что приводит к нежелательному смещению импульса вперед или назад.

Схема модуля инкрементального энкодера

Модуль инкрементального энкодера состоит из легко доступных компонентов общего назначения, в простейшем случае это сам энкодер и три подтягивающих резистора. Схема энкодера показана на следующем рисунке.

Схема проекта

Схема подключения инкрементального энкодера к плате Arduino представлена на следующем рисунке.

Как видите, схема подключения достаточно проста, необходимо всего лишь подключить контакты CLK и DT инкрементального энкодера к контактам внешних прерываний D2 и D3 платы Arduino. Также необходимо подключить контакт SW энкодера к контакту D4 платы Arduino – этот контакт мы также будем конфигурировать для обработки внешнего прерывания.

Внешний вид собранной конструкции проекта представлен на следующем рисунке.

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В коде нашей программы для обработки угловых координат оси энкодера мы будем использовать прерывания, поскольку в этом случае они значительно уменьшают вероятность ошибки.

Первым делом в программе мы подключим необходимые библиотеки и назначим контактам платы Arduino, к которым подключены контакты энкодера, осмысленные имена.

Далее объявим все необходимые переменные.

Затем, в функции void setup(), мы зададим режимы работы используемых контактов (на ввод данных, и на ввод данных с использованием внутреннего подтягивающего резистора для контакта SW) и инициализируем последовательную связь для целей отладки.

После этого мы будем считывать текущее состояние контакта CLK энкодера и сохранять его в переменной initState. Это весьма важный шаг при работе с энкодером и без него счетчик инкрементального энкодера работать не будет.

Наконец, в функции setup мы настроим обработку прерываний на используемых нами контактах. Прерывания у нас будут срабатывать при любом изменении состояния контакта (CHANGE), поэтому мы будем схватывать все прерывания от инкрементального энкодера. Более подробно о работе с прерываниями в платах Arduino вы можете прочитать в этой статье.

Функция void loop() будет у нас пустой поскольку в ней мы не будем производить никаких действий.

Также мы запрограммируем функцию button_press(), которая будет автоматически вызываться при срабатывании прерывания. Внутри этой функции мы будем проверять состояние контакта SW. Если на нем уровень low, мы будем еще ждать некоторое время (это необходимо для борьбы с эффектом дребезга контактов) чтобы проверить действительно ли нажата кнопка или нет. Если кнопка нажата, то в окно монитора последовательной связи мы будем передавать сообщение «Button pressed!».

Еще мы запрограммируем функцию encoder_value(). В ней мы будем проверять позицию энкодера и направление его вращения и в соответствии инкрементировать или декрементировать значение счетчика (переменная counter). Если ось энкодера будет вращаться по часовой стрелке мы будем инкрементировать значение счетчика, а если против часовой – то декрементировать.

Тестирование работы проекта

В представленном ниже видео показан принцип работы инкрементального энкодера. Слева на нем вы видите что мы вращаем ось энкодера по часовой стрелке, а справа – увеличивающееся значение счетчика в окне монитора последовательной связи. Потом мы нажимаем кнопку энкодера и видим в окне монитора последовательной связи соответствующее появившееся сообщение.

https://circuitdigest.com/sites/default/files/inlineimages/u4/Arduino-Rotary-Encoder-Project.mp4

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

  • проверьте хорошо ли контакты VCC и общего провода (земли) инкрементального энкодера подключены к соответствующим контактам платы Arduino;
  • если вы работаете с энкодером без использования прерываний, то существует вероятность того, что какие-нибудь операции в основном цикле программы loop могут привести к такой задержке, из-за которой плата Arduino не сможет корректно отрабатывать данные от энкодера;
  • если на выходе энкодера появляется достаточно много импульсов шума, это свидетельствует о том что энкодер старый и уровень его джиттера достаточно большой. Единственное решение этой проблемы – заменить энкодер;
  • поскольку инкрементальной энкодер почти никак не защищен о воздействия внешней среды, то рядом с его осью может набиться достаточно много пыли, что сделает его бесполезным. Решением данной проблемы является чистка энкодера.

Исходный код программы (скетча)

Все необходимые файлы для этого проекта вы можете скачать по следующей ссылке.

Источник статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *