Энкодер ардуино схема подключения

Энкодер ардуино схема подключения

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

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

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

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

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

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

Самый классический энкодерный модуль 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.4

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

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

        Версии

        – 4.1
        – Исправлено изменение подтяжек

        – 4.2
        – Добавлена поддержка TYPE1 для алгоритма PRECISE_ALGORITHM
        – Добавлена отработка двойного клика: isSingle / isDouble

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

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

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

        Опрос

        Опрос энкодера происходит в методе .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 при удержании кнопки, НЕ СБРАСЫВАЕТСЯ
        • isSingle(); // возвращает true при одиночном клике (после таймаута), сама сбрасывается в false
        • isDouble(); // возвращает true при двойном клике, сама сбрасывается в false

        Примечание: isClick() возвращает true сразу же после отпускания кнопки, в то время как isSingle() возвращает true после таймаута, во время которого можно сделать второй клик и поймать уже двойной клик при помощи isDouble() .

        В версии 4.4 появился метод resetStates() , который принудительно сбрасывает все флаги is-методов

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

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

        • 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 // таймаут удержания кнопки, миллисекунд
        • ENC_DOUBLE_TIMEOUT 300 // таймаут двойного клика
        • #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 в папке с примерами

        Самый классический энкодерный модуль 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.4

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

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

            Читайте также:  Чем клеят обувь в мастерских

            Версии

            – 4.1
            – Исправлено изменение подтяжек

            – 4.2
            – Добавлена поддержка TYPE1 для алгоритма PRECISE_ALGORITHM
            – Добавлена отработка двойного клика: isSingle / isDouble

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

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

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

            Опрос

            Опрос энкодера происходит в методе .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 при удержании кнопки, НЕ СБРАСЫВАЕТСЯ
            • isSingle(); // возвращает true при одиночном клике (после таймаута), сама сбрасывается в false
            • isDouble(); // возвращает true при двойном клике, сама сбрасывается в false

            Примечание: isClick() возвращает true сразу же после отпускания кнопки, в то время как isSingle() возвращает true после таймаута, во время которого можно сделать второй клик и поймать уже двойной клик при помощи isDouble() .

            В версии 4.4 появился метод resetStates() , который принудительно сбрасывает все флаги is-методов

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

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

            • 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 // таймаут удержания кнопки, миллисекунд
            • ENC_DOUBLE_TIMEOUT 300 // таймаут двойного клика
            • #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 в папке с примерами

            Ссылка на основную публикацию
            Adblock detector