Библиотека энкодера для ардуино

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

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

            Релизы

            Описание библиотеки:

            Библиотека позволяет работать с инкрементальными энкодерами используя второй аппаратный таймер.

            Назначение функций:

            Подробное описание работы с библиотекой, находится в разделе Wiki Энкодер (Trema-модуль).

            #include // Подключаем библиотеку.
            iarduino_Encoder_tmr ОБЪЕКТ( №_ВЫВОДА_A , №_ВЫВОДА_B ); //Создаём объект (один объект работает с одним энкодером).

            Функция begin(); // Инициализация работы с энкодером.

            Функция read(); // Чтение состояния энкодера

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