Энкодер что это такое ардуино
Arduino и энкодер
Описание
Энкодер – общее название устройств, преобразующих одну величину в другую. В данном случае энкодер – это устройство, преобразующее вращательное механическое движение в цифровой сигнал, а сам энкодер в этом случае называется “поворотным” (вращательным, круговым). В наборе GyverKIT идёт инкрементальный поворотный энкодер с кнопкой, который служит очень удобным органом управления для электронного устройства и заменяет сразу несколько кнопок или джойстик, обеспечивая быструю навигацию по пунктам меню и изменение настроек. По сути похож на потенциометр, но не имеет ограничения по углу поворота. Особенности данного модуля:
Инкрементальный энкодер выдаёт импульсные логические сигналы со своих пинов на каждый щелчок. Сигналы отличаются по фазе, что позволяет определить направление текущего щелчка.
Алгоритмы опроса энкодера мы рассматривать не будем, это тема для отдельного серьёзного урока, поэтому научимся подключать модуль и работать с готовой библиотекой.
Подключение
Модуль подключается на питание, логические выводы – на любые цифровые пины. В случае с Wemos – на все кроме D8, так как подтяжка к VCC помешает МК запуститься. Подключу выводы энкодера на D2 и D3, а кнопку – на D4.
Библиотеки
Существует несколько библиотек для работы с энкодером, например:
В примерах на этом сайте мы будем использовать EncButton, т.к. она имеет самый большой набор вариантов опроса энкодера (поворот, нажатый поворот, быстрый поворот), а также хорошо оптимизирована и поддерживает расширенную работу с кнопкой. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию EncButton. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Подключение энкодера к Ардуино и полнофункциональный код обработки для него
Немного подробностей
Собирая один из проектов с использованием encoder. Я не смог найти код для Ардуино выполняющий все мои условия. Так как для проекта нужно обрабатывать следующие команды: «Вращение без нажатия», «Вращение с нажатием», «Нажатие» и «Длинное нажатие», а так же требуется стабильная работа энкодера. Скетчи использующие один пин с прерыванием INT0 или INT1, работают отвратительно и при вращении вала энкодера вылетает очень много ошибок. Код без использования прерываний работает стабильно, но он не работает в фоновом режиме, его нужно встраивать в тело основной программы, что в свою очередь приводит к не своевременному срабатыванию обработчика и пропускам при вращении энкодера. Еще хуже обстоят дела с обработкой нажатия с вращением вала энкодера и обычным с нажатием. Пришлось написать свой код обработки, который исключает описанные выше проблемы. С дребезгом контактов я не стал бороться программно, так как это приводит к задержкам обработки. Проще и надежней использовать керамические конденсаторы.
Схема подключения энкодера к Ардуино
Для считывания сигналов с выходов EC-11, нужно использовать три цифровых входа Arduino. В схеме подключения я использовал редко используемые мной в своих проектах выводы Arduino(A1, A2 и A3). Внешние подтягивающие резисторы отсутствуют, так как я использовал внутреннюю подтяжку микроконтроллера. Конденсаторы нужны для гашения импульсов дребезга контактов. Если у вас новый и хороший энкодер, то можно обойтись и без них. Но на кнопку в любом случае потребуется конденсатор, так как ее дребезг неизбежен.
Используемые в схеме компоненты:
Скетч для Ардуино
Заключение
Результат работы кода меня порадовал и теперь я могу продолжить работу над своим новым проектом, который скоро здесь выложу. Надеюсь эта короткая статья вам понравилась и вы сможете воспользоваться моей наработкой в своих самоделках.
Если у Вас остались вопросы и замечания, пишите их в комментариях. Я с удовольствием на них отвечу.
Как подключить энкодер к Ардуино
Энкодер — это устройство, которое преобразует вращательное движение вала в серию электрических импульсов. Некоторые знают определенные виды оборудования, где ручка способна вращаться при настройке какого-то параметра (например, аудиоусилителя). Некоторые из них также оснащены кнопкой, где при нажатии на ось происходит контакт (например, в устройствах, использующихся на многих музыкальных контроллерах). Они бывают всех видов разрешений, считывают от 16 до 1024 сигналов при полном обороте.
Энкодеры также очень часто используются для подсчета угла поворота в двигателях. В автоматизации и робототехнике, это крайне необходимые устройства. Далее рассмотрен принцип работы и подключения устройства.
Типы поворотных энкодеров и как они работают
Прежде чем разбирать принцип подключения энкодера, стоит рассмотреть основные виды этих устройств и разобрать их конструкцию.
Механический поворотный энкодер
Поворотный угловой энкодер — это тот, который измеряет абсолютный угол закодированного вала, имея уникальный код для каждого положения вала. При этом каждая позиция диапазона/угла измерения, идентифицируется определенным кодом. Это означает, что отпадает необходимость в счетчиках, поскольку позиционные значения всегда доступны напрямую, даже если питание отключено.
Механический поворотный энкодер — это распространенный, недорогой вариант, который состоит из металлического диска и работает следующим образом:
Приведенное выше объяснение относится к принципу работы механического датчика абсолютного вращения, но есть два других способа, с помощью которых можно обнаружить изменение положения и изменения оптических либо магнитных датчиков.
Оптические поворотные энкодеры
Оптические энкодеры состоят из диска, вала, стекла либо пластика с прозрачными и непрозрачными поверхностями, что позволяет источнику света и фотодетектору обнаруживать оптические сигналы. Такое обнаружение помогает определить позицию вала в любое время.
Процесс определения положения с помощью оптических энкодеров:
Магнитные энкодеры
Магнитные приборы состоят из серии магнитных полюсов для обозначения положения устройства и датчиков, которые обычно работают на эффекте Холла. Данное устройство имеет тот же принцип работы, что и оптические энкодеры, но вместо света, датчики обнаруживают изменение магнитных полей.
Процесс определения положения с помощью магнитных энкодеров:
Инкрементальный энкодер
По сравнению с предыдущими энкодерами, инкрементальный работает, замеряя изменения углового смещения, а не считывая абсолютный угол закодированного вала.
Инкрементальный энкодер, также известный как квадратурный, имеет два выходных сигнала, A и B, которые генерируют прямоугольные волны при вращении вала. Частота прямоугольной волны указывает скорость вращения вала, а соотношение фаз AB указывает направление вращения.
Поворотные инкрементальные энкодеры определяют количество вращений через отдельный счетчик, который подсчитывает количество импульсов, выдаваемых в ответ на величину вращательного смещения вала.
Инкрементальные энкодеры проходят процесс определения положения с помощью магнитных угловых устройств:
Различия поворотного энкодера и потенциометра
Чтобы лучше понять описываемое устройство, стоит сравнить его с похожим — потенциометром. Не вдаваясь в подробности описания, можно сказать, почему поворотные энкодеры в настоящее время являются более предпочтительным вариантом:
Тем не менее, с учетом сказанного, на рынке существуют цифровые потенциометры, которые обеспечивают сопряжение с платами микроконтроллеров. Однако по остальным параметрам, на данный момент потенциометр проигрывает энкодеру.
Выбор лучших энкодеров для Ардуино
Чтобы упростить процесс выбора энкодера к Arduino, здесь будет подборка каждого варианта.
Поворотный энкодер EC11
Нужен простой угловой энкодер, который поможет начать распознавать вращающийся вал с помощью Ардуино? Тогда стоит выбрать EC11.
Устройство имеет в общей сложности 5 контактов, 3 с одной стороны для вращательного кодирования, которым требуется простая цепь для подачи постоянного тока 5В. Два других замыкаются при нажатии, поэтому нет недостатка в какой-либо функциональности при использовании этого энкодера с Ардуино.
Магнитный энкодер Grove AS5600
Нужно устройство, которое может одновременно работать как магнитный потенциометр или магнитный энкодер с отличной надежностью и долговечностью? Тогда это устройство отлично подойдет.
Оно не только работает в обоих направлениях, но по сравнению с традиционным энкодером/потенциометром, Grove AS5600 бесконтактный, без ограничения угла поворота, обеспечивает высокоточный сигнал. Все это стало возможным благодаря встроенному AS5600, основанному на эффекте Холла.
Grove — оптический поворотный прибор
Этот оптический датчик угла поворота (для уно, нано и других) включает в себя инфракрасный излучатель и два фототранзисторных детектора. Подходит не только для определения скорости/вращения, но и для определения направления вращения.
Подключение поворотного энкодера с Ардуино
Теперь, когда принципы работы различных энкодеров изучены, можно приступить к описанию схемы подключения к Ардуино.
Для этого понадобятся:
Обзор поворотного энкодера
Поворотный энкодер — это датчик, используемый для определения углового положения вала, подобный потенциометру.
Пины, и что они означают:
Поворотный прибор может быть использован в основном для тех же целей, что и потенциометр. Однако потенциометр обычно имеет точку, за которую вал не может вращаться, в то время как энкодер может вращаться в одном направлении без ограничений. Чтобы сбросить показания положения, нужно нажать на вал вниз.
Данное устройство определяет угловое положение вращающегося вала с помощью серии прямоугольных импульсов. Он по существу имеет равномерно расположенные контактные зоны, соединенные с общим узлом, а также два дополнительных контакта, называемых A и B, которые находятся на 90 градусов вне фазы. Когда вал вращается вручную, контакты A и B синхронизируются с общим контактом и генерируют импульс. Подсчитав количество импульсов любого из этих выходов, можно определить положение вращения.
Чтобы определить направление и проверить, вращается ли штифт по часовой стрелке или против часовой стрелки, нужно сделать следующее:
Подключение
Если говорить в общем, то CLK, DT и SW, должны быть подключены к цифровым выводам на Ардуино, + должен быть подключен к 5V, а GND заземлен.
Пошаговая инструкция подключения проводов энкодера к Ардуино:
Как кодировать
Код изменяет высоту тона в зависимости от того, в каком направлении повернут энкодер. Когда он поворачивается против часовой стрелки, шаг уменьшается, а когда он поворачивается по часовой стрелке, шаг увеличивается.
Описание кода
Итак, сначала нужно определить контакты, к которым подключен кодер, и назначить некоторые переменные, необходимые для работы программы. В разделе «Настройки» нужно определить два контакта в качестве входных данных, и запустить последовательную связь для печати результатов на последовательном мониторе. Также нужно прочитать начальное значение вывода A, затем поместить это значение в переменную aLastState.
Далее в разделе цикла снова изменить вывод A, но теперь поместить значение в переменную aState. Таким образом, если повернуть вал и сгенерировать импульс, эти два значения будут отличаться. Сразу после этого, используя второй параметр «if», определить направление вращения. Если выходное состояние B отличается от A, счетчик будет увеличен на единицу, в противном случае он будет уменьшен. В конце, после вывода результатов на мониторе, нужно обновить переменную aLastState с помощью переменной aState.
Это все, что нужно для этого примера. Если загрузить код, запустить монитор и начать вращать вал, значения станут отображаться на мониторе.
Упрощенный пример
Следующий пример кода продемонстрирует, как считывает сигналы Arduino на датчике энкодера. Он просто обновляет счетчик (encoder0Pos) каждый раз, когда энкодер поворачивается на один шаг, а параметры вращения отправляются на порт ПК.
Код:
/ * Чтение квадратурного энкодера
Подключите энкодер к контактам encoder0PinA, encoder0PinB и + 5V.
* /
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup () <
pinMode (encoder0PinA, INPUT);
pinMode (encoder0PinB, INPUT);
Serial.begin (9600);
>
void loop () <
n = digitalRead (encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) <
if (digitalRead (encoder0PinB) == LOW) <
encoder0Pos—;
> else <
encoder0Pos ++;
>
Serial.print (encoder0Pos);
Serial.print («/»);
>
encoder0PinALast = n;
>
Следует обратить внимание на то, что приведенный выше код не является высокопроизводительным. Он предоставлен для демонстрационных целей.
Дальнейшее описание, включая форму волны энкодера
Ниже приведено изображение, показывающее формы сигналов каналов A и B кодера:
Это может прояснить, как работает выше указанный код. Когда устройство обнаруживает переход от низкого к высокому уровню на канале A, он проверяет, перешел ли канал к B высоким или низким уровням. Затем происходит увеличение/уменьшение переменной, чтобы учесть направление, в котором кодер должен вращаться. Это нужно, чтобы генерировать найденную форму волны. Также на изображении показаны переходы красным или зеленым цветом. Они зависят от того, в каком направлении движется кодировщик.
Одним из недостатков приведенного выше кода является то, что на самом деле он учитывает только одну четверть возможных переходов.
Руководство по энкодерам и тому, как оно подключается к Ардуино, закончилось. Благодаря этому можно получить общее представление о том, что из себя представляют данные устройства, и как они работают.
Видео по теме
Как работает поворотный энкодер. Взаимодействие с Ардуино
Поворотный энкодер — это тип датчика положения, который преобразует угловое положение (вращение) ручки в выходной сигнал, используемый для определения направления вращения ручки.
Благодаря своей надежности и точному цифровому управлению энкодеры используются во многих приложениях, включая робототехнику, станки с ЧПУ и так далее.
Поворотные энкодеры против потенциометров
Поворотные энкодеры являются современным цифровым эквивалентом потенциометра и они более универсальны, чем потенциометры. Они могут полностью вращаться без концевых упоров, в то время как потенциометр может вращаться только примерно на 3/4 круга.
Потенциометры лучше всего подходят в ситуациях, когда вам нужно знать точное положение ручки. Однако поворотные энкодеры лучше всего подходят в ситуациях, когда вам нужно знать изменение положения, а не точное положение.
Как работают поворотные энкодеры
Внутри энкодера находится диск с прорезями, подключенный к общему контакту «C», и два контакта «A» и «B», как показано ниже:
Когда вы поворачиваете ручку, выводы «A» и «B» входят в контакт с общим контактом «C» в определенном порядке в соответствии с направлением, в котором вы поворачиваете ручку.
Когда они вступают в контакт с выводом «С», они вырабатывают сигналы. Эти сигналы сдвинуты по фазе на 90° друг относительно друга, поскольку один вывод входит в контакт раньше другого:
Когда вы поворачиваете ручку по часовой стрелке, сначала подключается контакт «A», а затем контакт «B». Когда вы поворачиваете ручку против часовой стрелки, сначала подключается контакт «B», а затем контакт «A».
Отслеживая последовательность замыкания и размыкания с контактом «C», мы можем определить в каком направлении была повернута ручка энкодера. Вы можете сделать это, просто наблюдая за состоянием «B» в момент когда «A» меняет состояние.
Когда сигнал на выводе «А» меняет состояние, то:
Распиновка поворотного энкодера
Распиновка у модуля поворотного энкодера следующая:
Подключение поворотного энкодера к Ардуино
Теперь, когда мы знаем все о поворотном энкодере, пришло время применить его! Подключим поворотный энкодер к Ардуино. Подключение довольно простое. Начните с подключения вывода VCC на модуле к 5 В на Ардуино и вывода GND к GND Ардуино.
Теперь подключите контакты CLK и DT к цифровым контактам №2 и №3 Ардуино соответственно. Наконец, подключите вывод SW к цифровому выводу №4. На следующем рисунке показана схема соединения:
Скетч Ардуино — чтение поворотных энкодеров
Теперь, когда у вас подключен энкодер, вам необходимо записать код, чтобы все заработало. Следующий код определяет, когда энкодер вращается, определяет, в каком направлении он вращается и нажимается ли кнопка. Загрузите скетч в Ардуино, а затем более подробно разберем его работу:
Если все в порядке, то вы должны в мониторе последовательного порта увидеть следующее:
Если сообщения о вращении противоположно ожидаемому, попробуйте поменять местами строки CLK и DT.
Пояснение к коду:
Скетч начинается с объявления выводов Ардуино, к которым подключены выводы CLK, DT и SW энкодера:
Затем определяются несколько переменных. Переменная counter представляет собой счетчик, который будет изменен каждый раз, когда ручка энкодера будет повернута на один щелчок.
Переменные currentStateCLK и lastStateCLK содержат состояние выхода CLK и используются для определения величины вращения. Вызываемая строка currentDir используется при печати текущего направления вращения в последовательный монитор. Переменная lastButtonPress используется для исключения дребезга контактов кнопки:
Далее в функции setup() мы сначала определяем подключения к энкодеру как входы, а затем подключаем подтягивающий резистор на выводе SW. Мы также настраиваем последовательный монитор. В конце мы считываем текущее состояние вывода CLK и сохраняем его в переменной lastStateCLK:
В функции loop() мы снова проверяем состояние CLK и сравниваем его со значением lastStateCLK. Если они разные, это означает, что ручка повернута и возник импульс. Мы также проверяем, равно ли значение currentStateCLK 1, чтобы отреагировать только на одно изменение состояния, чтобы избежать двойного счета:
Внутри оператора if мы определяем направление вращения. Для этого мы просто считываем вывод DT на модуле энкодера и сравниваем его с текущим состоянием вывода CLK.
Если они разные, это означает, что ручка повернута против часовой стрелки. Затем мы уменьшаем значение счетчика и устанавливаем его currentDir на «CCW».
Если два значения совпадают, это означает, что ручка вращается по часовой стрелке. Затем мы увеличиваем счетчик и устанавливаем currentDir на «CW»:
Затем мы отправляем наши результаты в монитор последовательного порта:
Вне оператора if мы обновляем lastStateCLK текущее состояние CLK:
Далее идет логика для считывания кнопки и предотвращения дребезга ее контактов. Сначала мы читаем текущее состояние кнопки, если оно LOW, мы ждем 50 мсек, чтобы отметить нажатие кнопки. Если кнопка остается в LOW состоянии более 50 мс, мы печатаем в монитор последовательного порта «Button pressed!«:
Затем мы все повторяем снова.
Код Ардуино с использованием прерываний
Чтобы поворотный энкодер работал, нам необходимо постоянно отслеживать изменения в сигналах DT и CLK. Чтобы определить, когда происходят такие изменения, мы можем постоянно их опрашивать (как мы это делали в нашем предыдущем скетче). Однако это не лучшее решение по нижеприведенным причинам:
Широко распространенным решением является использование прерывания. С прерыванием вам не нужно постоянно опрашивать конкретное событие. Это освобождает Ардуино для выполнения какой-то другой работы, не пропуская событие.
Подключение энкодера к Ардуино с учетом прерывания
Поскольку большинство Ардуино (включая Ардуино UNO) имеют только два внешних прерывания, мы можем отслеживать только изменения в сигналах DT и CLK. Вот почему мы удалили соединение вывода SW с предыдущей схемы подключения.
Итак, теперь схема подключения выглядит так:
Некоторые платы (например, Ардуино Mega 2560) имеют больше внешних прерываний. Если у вас есть что-то из этого, вы можете оставить соединение для вывода SW и расширить рисунок ниже, чтобы использовать код и для кнопки.
Код Ардуино
Ниже приведен скетч, демонстрирующий использование прерываний при чтении углового энкодера:
Обратите внимание, что основной цикл этой программы loop() остается пустым, поэтому Ардуино ничего не делает.
Между тем, эта программа отслеживает изменение значения на цифровом выводе 2 (соответствует прерыванию 0) и цифровом выводе 3 (соответствует прерыванию 1). Другими словами, программа ищет изменение напряжения с HIGH на LOW или с LOW на HIGH, которое происходит при повороте ручки.
Когда это происходит, вызывается функция updateEncoder() (часто называемая подпрограммой обслуживания прерывания или просто ISR ). Код в этой функции выполняется, а затем программа возвращается к исполнению основного кода с момента прерывания.
За все это отвечают две строки в коде. Эта функция attachInterrupt() которая сообщает Ардуино, какой вывод следует контролировать, какой ISR выполнять, если прерывание срабатывает, и какой тип триггера следует искать.
Подключение энкодера к 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 цепи для кнопки и для тактовых выходов энкодера.