меню сигналов энкодера с 1306
В очередном уроке мы рассмотрим работу Arduino с энкодером (который служит для преобразования угла поворота в эл. сигнал). С энкодера мы получаем 2 сигнала (А и В), которые противоположны по фазе. В данном уроке мы будем использовать энкодер фирмы SparkFun COM-09117, который имеет 12 положений на один оборот (каждое положение 30°). На приведенной ниже диаграмме вы можете видеть, как зависят выход А и В друг от друга при вращении энкодера по часовой или против часовой стрелки.
Используя энкодер мы будем управлять яркостью LED светодиода при помощи ШИМ выхода. Для считывания данных энкодера мы будем использовать простейший метод, основанный на программных таймерах, которые мы изучали в третьем уроке.
Как было сказано выше, мы будем использовать энкодер sparkfun. Первое, что необходимо сделать, это определить как часто нам нужно обращаться к выходам энкодера для считывания значений. Итак, представим себе, что в лучшем случае, мы можем повернуть ручку энкодера на 180° за 1/10 сек, т.е. это будет 6 импульсов за 1/10 сек или 60 импульсов в секунду. В реальности быстрее вращать не сможете. Т.к. нам необходимо отслеживать все полупериоды, то частота должна быть минимум 120 Герц. Для полной уверенности, давайте примем 200 Гц. (Примечание: т.к. у нас механический энкодер, то возможен дребезг контактов, а низкая частота позволяет отфильтровывать дребезг).
По сигналам программного таймера нам необходимо постоянно сравнивать текущее значение выхода А энкодера с предыдущим значением. Если состояние изменилось от положительного к нулю, то мы проверяем значение выхода В и смотрим положительное оно или нет. В зависимости от полученного результата мы увеличиваем или уменьшаем счетчик значения яркости светодиода.
Программа для данного урока приведена ниже. Она построена на базе предыдущего урока Fade, где использовалась функция millis() для задания временных интервалов. Временной интервал у нас будет 5 мс (200 Гц)
Подключение энкодера к Ардуино и полнофункциональный код обработки для него
Немного подробностей
Собирая один из проектов с использованием encoder. Я не смог найти код для Ардуино выполняющий все мои условия. Так как для проекта нужно обрабатывать следующие команды: «Вращение без нажатия», «Вращение с нажатием», «Нажатие» и «Длинное нажатие», а так же требуется стабильная работа энкодера. Скетчи использующие один пин с прерыванием INT0 или INT1, работают отвратительно и при вращении вала энкодера вылетает очень много ошибок. Код без использования прерываний работает стабильно, но он не работает в фоновом режиме, его нужно встраивать в тело основной программы, что в свою очередь приводит к не своевременному срабатыванию обработчика и пропускам при вращении энкодера. Еще хуже обстоят дела с обработкой нажатия с вращением вала энкодера и обычным с нажатием. Пришлось написать свой код обработки, который исключает описанные выше проблемы. С дребезгом контактов я не стал бороться программно, так как это приводит к задержкам обработки. Проще и надежней использовать керамические конденсаторы.
Схема подключения энкодера к Ардуино
Для считывания сигналов с выходов EC-11, нужно использовать три цифровых входа Arduino. В схеме подключения я использовал редко используемые мной в своих проектах выводы Arduino(A1, A2 и A3). Внешние подтягивающие резисторы отсутствуют, так как я использовал внутреннюю подтяжку микроконтроллера. Конденсаторы нужны для гашения импульсов дребезга контактов. Если у вас новый и хороший энкодер, то можно обойтись и без них. Но на кнопку в любом случае потребуется конденсатор, так как ее дребезг неизбежен.
Используемые в схеме компоненты:
Скетч для Ардуино
Заключение
Результат работы кода меня порадовал и теперь я могу продолжить работу над своим новым проектом, который скоро здесь выложу. Надеюсь эта короткая статья вам понравилась и вы сможете воспользоваться моей наработкой в своих самоделках.
Если у Вас остались вопросы и замечания, пишите их в комментариях. Я с удовольствием на них отвечу.
Что такое энкодер. Подключение поворотного энкодера к Ардуино без библиотеки
в Ардуино 0 1,491 Просмотров
В этой статье мы узнаем, как работает энкодер и как подключить его к Ардуино без применения библиотек.
Что такое энкодер
Угловой энкодер — это тип датчика положения, который используется для определения углового положения вращающегося вала. Он генерирует электрический сигнал, аналоговый или цифровой, в зависимости от вращательного движения.
Существует множество различных типов энкодеров, которые классифицируются либо по выходному сигналу, либо по сенсорной технологии. Конкретный поворотный энкодер, который мы будем использовать в этой статье, представляет собой инкрементальный угловой энкодер, и это самый простой датчик положения для измерения вращения.
Этот угловой энкодер также известен как квадратурный энкодер или относительный угловой энкодер. Сигнал с его выход представляет собой серию прямоугольных импульсов.
Как работает поворотный энкодер
Давайте подробнее рассмотрим энкодер и разберемся, как он работает. Вот как генерируются прямоугольные импульсы: энкодер имеет диск с равномерно расположенными контактными зонами, которые подключены к общему контакту C и двум другим отдельным контактам A и B, как показано ниже:
Когда диск начнет шаг за шагом вращаться, контакты A и B замыкаются с общим контактом, в результате чего происходит генерация двух выходных сигналов прямоугольной формы.
Любой из двух выходов может использоваться для определения повернутого положения, если мы просто подсчитываем количество импульсов сигнала. Однако, если мы хотим также определить направление вращения, нам нужно рассматривать оба сигнала одновременно.
Мы можем заметить, что оба выходных сигнала смещены по фазе на 90 градусов друг относительно друга. Если энкодер вращается по часовой стрелке, сигнал с выход A будет опережать сигнал с выхода B:
Поэтому, если мы будем считать шаги каждый раз, когда сигнал изменяется (с высокого на низкий или с низкого на высокий), мы можем заметить, что в это время два выходных сигнала имеют противоположные значения.
Учитывая это, мы можем легко запрограммировать Ардуино на считывание положения энкодера и направления вращения.
Подключение энкодера к Ардуино без библиотек
Давайте проверим это на практическом примере, используя Ардуино. Конкретный модуль энкодера, который мы будем использовать в этом примере, поставляется на коммутационной плате и имеет пять контактов.
Рассмотрим распиновку данного энкодера:
Мы можем подключить выходные контакты к любому цифровому выводу платы Ардуино.
Скетч для проверки работы энкодера:
Разбор кода: Итак, сначала нам нужно определить контакты, к которым подключен наш поворотный энкодер, и определить некоторые переменные, необходимые для программы.
В разделе setup() нам нужно определить два контакта в качестве входов, запустить последовательную связь для печати результатов в монитор последовательного порта, а также прочитать начальное значение выхода «A» и поместить значение в переменную aLastState.
Затем в разделе цикла мы снова читаем состояние вывода «A», но теперь мы помещаем значение в переменную aState. Таким образом, если мы повернем энкодер и будет сгенерирован импульс, эти два значения будут отличаться, и первое утверждение «if» станет истинным.
Сразу после этого с помощью второго оператора «if» мы определяем направление вращения. Если состояние выхода «B» отличается от состояния выхода «A», счетчик будет увеличен на единицу, иначе он будет уменьшен.
В конце, после печати результатов в монитор последовательного порта, нам нужно обновить переменную aLastState с помощью переменной aState.
Это все, что нам нужно для этого примера. Если мы загрузим скетч в Ардуино, запустим Serial Monitor и начните вращать энкодер, то мы начнем получать значения в последовательном мониторе. Конкретный модуль, который у нас есть в наличии, делает 30 отсчетов за каждый полный цикл.
Подключение энкодера к 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 цепи для кнопки и для тактовых выходов энкодера.
Как использовать поворотный энкодер в проекте на микроконтроллере
Узнайте, как использовать инкрементальный поворотный энкодер в проекте на Arduino.
Поворотный энкодер представляет собой электромеханическое устройство, которое преобразует вращательное движение в цифровую или аналоговую информацию. Он очень похож на потенциометр, но может вращаться бесконечно как по часовой стрелке, так и против часовой стрелки. Существует несколько типов поворотных энкодеров. Двумя основными типами являются абсолютные и относительные (инкрементальные) энкодеры. В то время как абсолютный энкодер выдает значение, пропорциональное текущему углу вала, инкрементальный энкодер выдает шаг движения вала и его направление. Поворотные энкодеры становятся всё более и более популярными в потребительской электронике, особенно в качестве ручек управления, в дополнение к приложениям во многих других областях. Они заменяют собой потенциометры и кнопки навигации, где требуются быстрая навигация, настройка, ввод данных и выбор пункта меню. Некоторые энкодеры также включают в себя встроенную кнопку, которая создает дополнительный вход для процессора, который может использоваться в качестве другой пользовательской команды в интерфейсе управления. На рисунке ниже вы можете увидеть типовой инкрементальный поворотный энкодер с кнопкой включения.
Инкрементальный поворотный энкодер
В данной статье мы покажем вам, как использовать инкрементальный поворотный энкодер в проекте на Arduino. Мы объясним, как бороться с дребезгом контактов и интерпретировать сигналы энкодера в программе микроконтроллера, используя прерывания.
Сигнал квадратурного выхода инкрементального энкодера
Инкрементальный поворотный энкодер во время поворота вала генерирует два выходных сигнала, что также называется квадратурным выходом. В зависимости от направления один сигнал опережает другой. Ниже вы можете увидеть форму выходного сигнала инкрементального поворотного энкодера и ожидаемую последовательность битов.
Сигналы на выходах инкрементального поворотного энкодера при вращении вала по часовой стрелке и против
Как видно из рисунка, оба выхода в изначально находятся в состоянии логической единицы. Когда вал энкодера начинает вращаться в направлении по часовой стрелке, первым падает до логического нуля состояние на выходе A, а затем с отставанием за ним следует и выход B. При вращении против часовой стрелки всё происходит наоборот. Временные интервалы на диаграмме сигнала зависят от скорости вращения, но отставание сигналов гарантируется в любом случае. На основе этой характеристики инкрементального поворотного энкодера мы напишем программу для Arduino.
Фильтрация дребезга контактов механического энкодера
Механические энкодеры имеют встроенные переключатели, которые формируют сигнал на квадратурном выходе во время вращения.
Дребезг контактов на выходе механического энкодера
Когда имеем дело с сигналами энкодера, основной проблемой является дребезг контактов. Он вызывает ошибочное определение направления вращения и величины поворота вала энкодера и делает использование энкодеров проблематичным. Мы можем избавиться от дребезга контактов, отфильтровывая его в программе или используя дополнительные схемы фильтрации.
Фильтрация шума в программном обеспечении микроконтроллера является одним из вариантов фильтрации, но она обладает некоторыми недостатками. Вам необходимо написать более сложный код для обработки шума. Фильтрация займет время обработки и внесет задержки в основной поток программы. Вам может потребоваться установить таймеры, чтобы игнорировать интервалы дребезга контактов. В конце концов, возможно, у вас не получится получить удовлетворительный и надежный результат.
Фильтрация шума с помощью дополнительных аппаратных средств проще, и она останавливает шум еще в его источнике. Вам понадобится RC фильтр первого порядка. На рисунке ниже вы можете увидеть, как выглядит сигнал после использования RC фильтра.
RC фильтр и форма сигнала на его выходе
RC-фильтр замедляет время спада и время нарастания и обеспечивает аппаратное удаление дребезга контактов. При выборе пары резистор-конденсатор вы должны учитывать максимальную частоту вращения. Иначе будет отфильтрован и ожидаемый отклик энкодера.
Простое приложение
Мы создадим приложение, демонстрирующее, как использовать поворотный энкодер в проекте на Arduino. Мы будем использовать энкодер для навигации, ввода данных и выбора. Ниже приведена принципиальная схема приложения.
Принципиальная схема примера приложения с использованием поворотного энкодера на Arduino
Схема построена на базе платы Arduino Uno. Для графического интерфейса используется LCD дисплей Nokia 5110. В качестве средств управления добален механический поворотный энкодер с кнопкой и RC-фильтрами.
Собранная схема примера использования поворотного энкодера на Arduino
Мы разработаем простое программное меню, в котором и продемонстрируем работу поворотного энкодера.
Обработка сигналов энкодера с помощью прерываний
Сигналы энкодера должны быть обнаружены и интерпретированы в программе как можно быстрее, чтобы не блокировать основной поток программы. Мы можем детектировать сигналы путем опроса в основном цикле, или используя прерывания. Опрос не эффективен, так как вам необходимо зарезервировать время и ресурсы в основном цикле, что приводит к дополнительным задержкам. Использование прерываний – это более быстрое и экономичное решение. Мы покажем вам, как использовать прерывания для обработки сигналов энкодера.
Вы можете увидеть часть кода, включающую инициализацию и функцию обработки прерывания по изменению состояния выводов.
Ниже вы можете увидеть часть кода, включающую в себя инициализацию и функцию обработки внешнего прерывания.
Макет для проверки кода работы с инкрементальным поворотным энкодером на Arduino
Полный код скетча Arduino, включающий основной цикл приведен ниже:
Энкодер в действии вы можете увидеть на видео, приведенном ниже:
Вот и всё! Надеюсь, статья оказалась полезной. Оставляйте комментарии!