Подключение энкодера к ардуино уно

Самый классический энкодерный модуль KY-040. Имеет 28 тиков на оборот, рукоятка является кнопкой (отдельный выход). Тип энкодера – 1 или 2 импульсный, китайцы могут прислать любой (о типах читайте ниже)

Более новый модуль, гораздо меньший процент брака. Имеет 28 тиков на оборот, рукоятка является кнопкой (отдельный выход). Тип энкодера – 2 импульсный.

Промышленный энкодер – надёжная и точная штука: металлический корпус, подшипниковый узел. Имеет 100, 200, 300, 360, 400, 600, 1000 тиков на оборот (на выбор). Тип энкодера – 2.

Подключается модуль энкодера очень просто: питание на питание (GND и VCC), логические пины CLK, DT (тактовые выводы энкодера) и SW (вывод кнопки) на любые пины Arduino (D или A). У круглых модулей выводы энкодера подписаны как S1 и S2, а вывод кнопки как Key, подключаются точно так же. От порядка подключения тактовых выводов энкодера зависит “направление” его работы, но это можно поправить в программе.

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

У модулей энкодеров тактовые выходы и кнопка подтянуты к питанию, у круглого модуля также стоят RC цепи для аппаратного подавления дребезга контактов, у KY-40 (прямоугольный) распаяна только подтяжка. Если нужно подключить “голый” энкодер к плате – в целом можно подключить напрямую без обвязки, как на схеме ниже, моя библиотека отработает и подтяжку средствами микроконтроллера (INPUT_PULLUP), и программный антидребезг. Но рекомендуется всё-таки делать RC цепи для кнопки и для тактовых выходов энкодера.

Голый энкодер без обвязки

Схема круглого модуля

RC цепь на выводы энка

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

GyverEncoder v4.1

Я не нашёл в интернете нормальных библиотек для энкодера с хорошей функциональностью, поэтому написал свою, GyverEncoder. Что умеет:

  • Отработка поворота рукоятки энкодера
  • Обычный поворот
  • “Нажатый поворот”
  • “Быстрый” поворот
  • Три алгоритма опроса энкодера
    • Быстрый – но не справляется с люфтами
    • Бинарный – медленнее, лучше справляется с люфтами
    • Высокоточный – ещё медленнее, но работает даже с убитым энкодером
    • Возможность работы с “виртуальным” энкодером – через расширитель пинов или ещё как
    • Работа с двумя типами энкодеров (тип 1 и 2, см. выше)
    • Работа с кнопкой энкодера:
      • Отработка нажатия
      • Клика
      • Удержания
      • Антидребезг контактов
      • Возможность полностью убрать код кнопки для быстродействия
      • Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

        Документация

        Инициализация

        Объект энкодера может быть создан несколькими способами:

        Опрос

        Опрос энкодера происходит в методе .tick(), после чего можно узнать состояние энкодера из методов is*. Сам .tick() должен вызываться как можно чаще:

        • В loop() – у вас должен быть “прозрачный” loop без задержек
        • В прерывании таймера – достаточно опрашивать энкодер каждые 5 мс (зависит от скорости поворота)
        • В аппаратном прерывании (достаточно завести одну таковую ногу энкодера)

        Для “расшифровки” состояния энкодера используются следующие методы:

        • isTurn(); // возвращает true при любом повороте, сама сбрасывается в false
        • isRight(); // возвращает true при повороте направо, сама сбрасывается в false
        • isLeft(); // возвращает true при повороте налево, сама сбрасывается в false
        • isRightH(); // возвращает true при удержании кнопки и повороте направо, сама сбрасывается в false
        • isLeftH(); // возвращает true при удержании кнопки и повороте налево, сама сбрасывается в false
        • isFastR(); // возвращает true при быстром повороте
        • isFastL(); // возвращает true при быстром повороте

        Для кнопки энкодера:

        • isPress(); // возвращает true при нажатии кнопки, сама сбрасывается в false
        • isRelease(); // возвращает true при отпускании кнопки, сама сбрасывается в false
        • isClick(); // возвращает true при нажатии и отпускании кнопки, сама сбрасывается в false
        • isHolded(); // возвращает true при удержании кнопки, сама сбрасывается в false
        • isHold(); // возвращает true при удержании кнопки, НЕ СБРАСЫВАЕТСЯ

        Настройки в скетче

        Некоторые параметры работы энкодера можно настроить из программы:

        • setType(type); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
        • setTickMode(tickMode); // MANUAL / AUTO – ручной или автоматический опрос энкодера функцией tick(). (по умолчанию ручной)
        • setDirection(direction); // NORM / REVERSE – направление вращения энкодера
        • setFastTimeout(timeout); // установка таймаута быстрого поворота
        • setPinMode(mode); // тип подключения пинов энкодера, подтяжка HIGH_PULL (внутренняя) или LOW_PULL (внешняя на GND)
        • setBtnPinMode(mode); // тип подключения кнопки, подтяжка HIGH_PULL (внутренняя) или LOW_PULL (внешняя на GND)

        Настройки в библиотеке

        В заголовочном файле библиотеки (GyverEncoder.h) есть несколько дополнительных настроек:

        • ENC_DEBOUNCE_TURN 1 – время антидребезга для энкодера, миллисекунд
        • ENC_DEBOUNCE_BUTTON 80 – время антидребезга для кнопки, миллисекунд
        • ENC_HOLD_TIMEOUT 700 – таймаут удержания кнопки, миллисекунд
        • #define ENC_WITH_BUTTON // если закомментировать данную строку, опрос кнопки будет полностью “убран” из кода, что сделает его легче и чуть быстрее
        • #define DEFAULT_ENC_PULL LOW_PULL // тип подключения энкодера по умолчанию (LOW_PULL или HIGH_PULL)
        • #define DEFAULT_BTN_PULL HIGH_PULL // тип подключения кнопки энкодера по умолчанию (LOW_PULL или HIGH_PULL)

        Алгоритмы опроса энкодера

        Алгоритм работы библиотеки можно выбрать в заголовочном файле библиотеки (GyverEncoder.h), для этого нужно раскомментировать одну из строк с дефайнами алгоритмов:

        • #define FAST_ALGORITHM // быстрый, не справляется с люфтами
        • #define BINARY_ALGORITHM // медленнее, лучше справляется с люфтами
        • #define PRECISE_ALGORITHM // медленнее, но работает даже с убитым энкодером (по мотивам https://github.com/mathertel/RotaryEncoder)

        Работа с “виртуальным” энкодером

        Версия библиотеки 4+ поддерживает работу с виртуальным энкодером, т.е. алгоритм опрашивает не напрямую цифровой пин микроконтроллера, а логическую величину, которую ему передадут. Таким образом можно попробовать опрашивать несколько энкодеров, подключенных через расширитель пинов. Для работы с таким энкодером нужно инициализировать энкодер без указания пина:

        Работа с таким энкодером ничем не отличается от обычного, кроме метода tick() – в него нужно передать состояния тактовых пинов энкодера (CLK и DT), а также пина кнопки (опционально):

        Смотрите пример external_enc в папке с примерами

        В очередном уроке мы рассмотрим работу Arduino с энкодером (который служит для преобразования угла поворота в эл. сигнал). С энкодера мы получаем 2 сигнала (А и В), которые противоположны по фазе. В данном уроке мы будем использовать энкодер фирмы SparkFun COM-09117, который имеет 12 положений на один оборот (каждое положение 30°). На приведенной ниже диаграмме вы можете видеть, как зависят выход А и В друг от друга при вращении энкодера по часовой или против часовой стрелки.

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

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

        Как было сказано выше, мы будем использовать энкодер sparkfun. Первое, что необходимо сделать, это определить как часто нам нужно обращаться к выходам энкодера для считывания значений. Итак, представим себе, что в лучшем случае, мы можем повернуть ручку энкодера на 180° за 1/10 сек, т.е. это будет 6 импульсов за 1/10 сек или 60 импульсов в секунду. В реальности быстрее вращать не сможете. Т.к. нам необходимо отслеживать все полупериоды, то частота должна быть минимум 120 Герц. Для полной уверенности, давайте примем 200 Гц. (Примечание: т.к. у нас механический энкодер, то возможен дребезг контактов, а низкая частота позволяет отфильтровывать дребезг).

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

        Программа для данного урока приведена ниже. Она построена на базе предыдущего урока Fade, где использовалась функция millis() для задания временных интервалов. Временной интервал у нас будет 5 мс (200 Гц)

        цифровая электроника вычислительная техника встраиваемые системы

        Подключение оптического энкодера к Arduino

        Сегодня оптические энкодеры (датчики положения вала) широко используются во многих областях электроники и робототехники. Они применяются в устройствах для определения положения вала двигателя, системах управления скоростью, принтерах, станках с ЧПУ и т.д.

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

        Основным элементом простого оптического энкодера является оптопрерыватель (фотопрерыватель), состоящий из инфракрасного светодиода и фототранзистора, которые размещены друг напротив друга в пластмассовом корпусе. При блокировании непрозрачной частью диска света, излучаемого светодиодом, проводимость фототранзистора меняется. Это изменение может быть определено дискретными компонентами или микроконтроллером.

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

        Следует заметить, что ширина щели и ширина непрозрачных частей являются важными параметром диска. Для каждой модели оптопрерывателя желательно подобрать рекомендуемую ширину соответствии с документацией на это прерыватель. При этом ширину лучше взять с запасом. Например, если рекомендуемая ширина 1 мм, то ширину непрозрачных полос и щелей лучше сделать 2 мм. Если частота вращения диска составляет 60 оборотов в минуту, то за одну секунду диск повернется на один оборот. Если диск имеет 36 полос, то частота импульсов составит 36 Гц, что может быть легко обработано фотопрерывателем.

        Для начала нужно собрать представленную ниже схему, которая состоит из Arduino и оптопрерывателя с обвязкой. Резистор R2 является подтягивающим. Значение резистора R1 зависит от того, какой прерыватель вы используете. К выводу D13 подключается светодиод, который срабатывает при прерывании луча. D12 представляет собой вспомогательный выход, который может быть использован для мониторинга сигнала энкодера на экране осциллографа.

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

        Возможности улучшения кода

        Есть два основных способа считывать сигнал с цифрового входа микроконтроллера: по опросу и по прерыванию. В первом случае система считывает сигнал каждый раз внутри основного цикла программы (как в данном примере). Основным недостатком этого метода является то, что трудно вести обработку других сигналов во время опроса. Но с использованием прерываний основной цикл освобождается от части кода с опросом, и система может спокойно заниматься другими делами, пока на вход не придет сигнал. С поступлением сигнала, основные работы будут приостановлены, система войдет в прерывание для считывания импульса, затем выйдет, восстановив предыдущую работу. Так что, если вам не хватает быстродействия, то воспользуйтесь прерываниями.

        Оцените статью
        Topsamoe.ru
        Добавить комментарий