Энкодер_ec11_схема_включения

Энкодер_ec11_схема_включения

Энкодер (Trema-модуль)

Общие сведения:

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

Видео:

Спецификация:

  • Входное напряжение питания модуля: 5 В
  • Ток потребляемый модулем:

Подключение:

  • Выводы A и B модуля являются выходами энкодера
  • Вывод S (Signal) модуля является выходом тактовой кнопки
  • Выводы V (Vcc) и G (GND) модуля являются входом питания

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

Модуль удобно подключать 2 способами, в зависимости от ситуации:

Способ — 1 : Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.

Способ — 2 : Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Питание:

Входное напряжение 5 В постоянного тока, подаётся на выводы V (Vcc) и G (GND) модуля.

Подробнее о модуле:

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

Полный оборот вала Trema-энкодера разбит на 20 дискретных участков по 18° на каждый, значит при полном обороте вала энкодера, на выходе каждого вывода модуля сформируется по 20 импульсов.

При неподвижном и не нажатом вале энкодера, на выходах модуля A и B присутствуют уровни логической «1», а на выходе S (Signal) уровень логического «0». При вращении вала энкодера на выходах A и B формируются отрицательные импульсы, а при нажатии на вал, на выходе S (Signal) устанавливается уровень логической «1».

Для работы с модулем предлагаем воспользоваться библиотекой iarduino_Encoder_tmr, которая позволяет работать с несколькими энкодерами используя второй аппаратный таймер. Библиотека постоянно считывает уровни сигналов на выходах A и B модулей, фиксируя наличие поворота и его направление. Получить состояние энкодера можно вызвав функцию библиотеки read, которая вернёт одно из трёх состояний: encLEFT(зафиксирован поворот влево), encRIGHT (зафиксирован поворот вправо), или false (повороты не зафиксированы).

ВАЖНО: библиотека использует второй аппаратный таймер,

НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!

Подробнее про установку библиотеки читайте в нашей инструкции..

Примеры:

Пример 1:

Пример 2:

Вывод состояния энкодера:

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

Вывод счетчика энкодера:

При повороте энкодера в мониторе будет отображаться значение счётчика, при повороте влево счётчик будет уменьшаться, а при повороте вправо — увеличиваться.

Описание основных функций библиотеки:

Подключение библиотеки:

Можно объявить несколько объектов, тогда каждый объект будет работать со своим энкодером.
Имена объектов должны отличаться. Библиотека позволяет подключить до 8 энкодеров.

ПОДКЛЮЧЕНИЕ ЭНКОДЕРА К ARDUINO

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

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

        Узнайте, как использовать инкрементальный поворотный энкодер в проекте на Arduino.

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

        Инкрементальный поворотный энкодер

        В данной статье мы покажем вам, как использовать инкрементальный поворотный энкодер в проекте на Arduino. Мы объясним, как бороться с дребезгом контактов и интерпретировать сигналы энкодера в программе микроконтроллера, используя прерывания.

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

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

        Сигналы на выходах инкрементального поворотного энкодера при вращении вала по часовой стрелке и против

        Как видно из рисунка, оба выхода в изначально находятся в состоянии логической единицы. Когда вал энкодера начинает вращаться в направлении по часовой стрелке, первым падает до логического нуля состояние на выходе A, а затем с отставанием за ним следует и выход B. При вращении против часовой стрелки всё происходит наоборот. Временные интервалы на диаграмме сигнала зависят от скорости вращения, но отставание сигналов гарантируется в любом случае. На основе этой характеристики инкрементального поворотного энкодера мы напишем программу для Arduino.

        Фильтрация дребезга контактов механического энкодера

        Механические энкодеры имеют встроенные переключатели, которые формируют сигнал на квадратурном выходе во время вращения.

        Дребезг контактов на выходе механического энкодера

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

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

        Фильтрация шума с помощью дополнительных аппаратных средств проще, и она останавливает шум еще в его источнике. Вам понадобится RC фильтр первого порядка. На рисунке ниже вы можете увидеть, как выглядит сигнал после использования RC фильтра.

        Читайте также:  Как_давать_овес_кроликам

        RC фильтр и форма сигнала на его выходе

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

        Простое приложение

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

        Принципиальная схема примера приложения с использованием поворотного энкодера на Arduino

        Схема построена на базе платы Arduino Uno. Для графического интерфейса используется LCD дисплей Nokia 5110. В качестве средств управления добален механический поворотный энкодер с кнопкой и RC-фильтрами.

        Собранная схема примера использования поворотного энкодера на Arduino

        Мы разработаем простое программное меню, в котором и продемонстрируем работу поворотного энкодера.

        Обработка сигналов энкодера с помощью прерываний

        Сигналы энкодера должны быть обнаружены и интерпретированы в программе как можно быстрее, чтобы не блокировать основной поток программы. Мы можем детектировать сигналы путем опроса в основном цикле, или используя прерывания. Опрос не эффективен, так как вам необходимо зарезервировать время и ресурсы в основном цикле, что приводит к дополнительным задержкам. Использование прерываний – это более быстрое и экономичное решение. Мы покажем вам, как использовать прерывания для обработки сигналов энкодера.

        В Atmega328 есть два типа прерываний, которые можно использовать для этих целей; внешнее прерывание и прерывание по изменению состояния вывода. Выводы INT0 и INT1 назначены на внешнее прерывание, а PCINT0 — PCIN15 назначены на прерывание по изменению состояния вывода. Внешнее прерывание может определить, произошел ли спад или нарастание входного сигнала, и может быть запущено при одном из следующих состояний: нарастание, спад или переключение. Для прерывания по изменению состояния выводов существует гораздо больше аппаратных ресурсов, но оно не может обнаруживать нарастающий и спадающий фронты, и оно вызывается, когда происходит любое изменение логического состояния (переключение) на выводе.

        Чтобы использовать прерывание по изменению состояния выводов, подключите выходы поворота энкодера A и B к выводам A1 и A2 , а выход кнопки – к выводу A0 платы Arduino, как показано на принципиальной схеме. Установите выводы A0 , A1 и A2 в режим входа и включите их внутренние подтягивающие резисторы. Включите прерывание по изменению состояния выводов в регистре PCICR и включите прерывания для выводов A0 , A1 и A2 в регистре PCMS1 . При обнаружении любого изменения логического состояния на одном из этих входов будет вызовано ISR(PCINT1_vect) (прерывание по изменению состояния выводов).

        Поскольку прерывание по изменению состояния выводов вызывается для любого логического изменения, нам необходимо отслеживать оба сигнала (и A, и B) и обнаруживать вращение при получение ожидаемой последовательности. Как видно из диаграммы сигналов, движение по часовой стрелке генерирует A = …0011… и B = …1001… . Когда мы записываем оба сигналы в байты seqA и seqB , сдвигая последнее чтение вправо, мы можем сравнить эти значения и определить новый шаг вращения.

        Вы можете увидеть часть кода, включающую инициализацию и функцию обработки прерывания по изменению состояния выводов.

        Использование внешнего прерывания делает процесс более простым, но поскольку для этого прерывания назначено только два вывода, то вы не сможете использовать его для других целей, если займете его энкодером. Чтобы использовать внешнее прерывание, вы должны установить выводы 2 ( INT0 ) и 3 ( INT1 ) в режим входа и включить их внутренние подтягивающие резисторы. Затем выберите вариант спадающего фронта для вызова обоих прерываний в регистре EICRA . Включите внешние прерывания в регистре EIMSK . Когда начнется вращение вала энкодера, сначала ведущий сигнал падает до логического нуля, а второй сигнал некоторое время остается на уровне логической единицы. Поэтому нам нужно определить, какой из сигналов во время прерывания находится в состоянии логической единицы. После того, как ведущий сигнал упал до логического нуля, через некоторое время второй сигнал также упадет до логического нуля, что вызовет другое прерывание. Но этот раз и другой (ведущий) сигнал будет на низком логическом уровне, что означает, что это не начало вращения, поэтому мы игнорируем его.

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

        Макет для проверки кода работы с инкрементальным поворотным энкодером на Arduino

        Полный код скетча Arduino, включающий основной цикл приведен ниже:

        Энкодер в действии вы можете увидеть на видео, приведенном ниже:

        Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!

        Ссылка на основную публикацию
        Электрошокеры_какой_лучше_цены
        Рейтинг ТОП 7 лучших электрошокеров: какой выбрать, характеристики, отзывы, цены 19.01.2019 Защитить себя и своих близких основная задачи при нападении...
        Электрическая_проводка_на_даче
        Как провести электропроводку на даче — пошаговое руководство Определение способа прокладки кабеля Для начала нужно определится с тем, как вы...
        Электрическая_схема_разводки_частного_дома
        Как сделать схему электропроводки дома Каждый хозяин частной недвижимости, будь то дом, квартира или дача обязательно столкнется с необходимостью полной...
        Электрощит_для_дачи_своими_руками
        Электрощиток своими руками для дачи Как собрать квартирный электрический щиток своими руками Электрощиток для дачи Установка добора межкомнатной двери своими...
        Adblock detector